r5562 - in trunk/data/qcsrc: client server server/tturrets/units
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Jan 16 03:09:35 EST 2009
Author: div0
Date: 2009-01-16 03:09:32 -0500 (Fri, 16 Jan 2009)
New Revision: 5562
Added:
trunk/data/qcsrc/client/movetypes.qc
trunk/data/qcsrc/client/movetypes.qh
Modified:
trunk/data/qcsrc/client/Defs.qc
trunk/data/qcsrc/client/View.qc
trunk/data/qcsrc/client/csqc_builtins.qc
trunk/data/qcsrc/client/csqc_constants.qc
trunk/data/qcsrc/client/progs.src
trunk/data/qcsrc/client/projectile.qc
trunk/data/qcsrc/server/csqcprojectile.qc
trunk/data/qcsrc/server/tturrets/units/unit_hk.qc
trunk/data/qcsrc/server/w_electro.qc
Log:
do bouncing client side (sound is still server side)
Modified: trunk/data/qcsrc/client/Defs.qc
===================================================================
--- trunk/data/qcsrc/client/Defs.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/client/Defs.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -214,3 +214,5 @@
#ifdef BLURTEST
float blurtest_time0, blurtest_time1, blurtest_radius, blurtest_power;
#endif
+
+float ticrate;
Modified: trunk/data/qcsrc/client/View.qc
===================================================================
--- trunk/data/qcsrc/client/View.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/client/View.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -202,6 +202,8 @@
dprint_load();
WaypointSprite_Load();
+ ticrate = getstatf(STAT_SYS_TICRATE) * getstatf(STAT_MOVEVARS_TIMESCALE);
+
// Render the Scene
if(!intermission || !view_set)
{
Modified: trunk/data/qcsrc/client/csqc_builtins.qc
===================================================================
--- trunk/data/qcsrc/client/csqc_builtins.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/client/csqc_builtins.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -274,3 +274,4 @@
string findkeysforcommand(string command) = #521;
string(float ccase, float calpha, float cnum, string s, ...) strconv = #224;
+float(entity ent) wasfreed = #353;
Modified: trunk/data/qcsrc/client/csqc_constants.qc
===================================================================
--- trunk/data/qcsrc/client/csqc_constants.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/client/csqc_constants.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -61,6 +61,7 @@
const float STAT_MOVEVARS_TIMESCALE = 241;
const float STAT_FRAGLIMIT = 235;
const float STAT_TIMELIMIT = 236;
+const float STAT_MOVEVARS_GRAVITY = 242;
// Sound Constants
//const float CHAN_AUTO = 0;
Added: trunk/data/qcsrc/client/movetypes.qc
===================================================================
--- trunk/data/qcsrc/client/movetypes.qc (rev 0)
+++ trunk/data/qcsrc/client/movetypes.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -0,0 +1,283 @@
+.entity move_groundentity;
+.float move_suspendedinair;
+.float move_didgravity;
+
+void _Movetype_CheckVelocity() // SV_CheckVelocity
+{
+}
+
+float _Movetype_CheckWater() // SV_CheckWater
+{
+ return FALSE;
+}
+
+void _Movetype_CheckWaterTransition() // SV_CheckWaterTransition
+{
+}
+
+void _Movetype_Impact(entity oth) // SV_Impact
+{
+}
+
+void _Movetype_LinkEdict(float touch_triggers) // SV_LinkEdict
+{
+}
+
+float _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition
+{
+ vector org;
+ float cont;
+ org = self.move_origin + ofs;
+
+ cont = self.dphitcontentsmask;
+ self.dphitcontentsmask = DPCONTENTS_SOLID;
+ tracebox(self.move_origin, self.mins, self.maxs, self.move_origin, MOVE_NOMONSTERS, self);
+ self.dphitcontentsmask = cont;
+
+ if(trace_startsolid)
+ return TRUE;
+
+ if(vlen(trace_endpos - self.move_origin) > 0.0001)
+ self.move_origin = trace_endpos;
+ return FALSE;
+}
+
+float _Movetype_UnstickEntity() // SV_UnstickEntity
+{
+ if(!_Movetype_TestEntityPosition('0 0 0'))
+ return TRUE;
+ if(!_Movetype_TestEntityPosition('-1 0 0')) goto success;
+ if(!_Movetype_TestEntityPosition('1 0 0')) goto success;
+ if(!_Movetype_TestEntityPosition('0 -1 0')) goto success;
+ if(!_Movetype_TestEntityPosition('0 1 0')) goto success;
+ if(!_Movetype_TestEntityPosition('-1 -1 0')) goto success;
+ if(!_Movetype_TestEntityPosition('1 -1 0')) goto success;
+ if(!_Movetype_TestEntityPosition('-1 1 0')) goto success;
+ if(!_Movetype_TestEntityPosition('1 1 0')) goto success;
+ float i;
+ for(i = 1; i <= 17; ++i)
+ {
+ if(!_Movetype_TestEntityPosition('0 0 -1' * i)) goto success;
+ if(!_Movetype_TestEntityPosition('0 0 1' * i)) goto success;
+ }
+ dprint("Some entity is stuck\n");
+ return FALSE;
+:success
+ dprint("Unstuck some entity\n");
+ _Movetype_LinkEdict(TRUE);
+ return TRUE;
+}
+
+vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // SV_ClipVelocity
+{
+ vel = vel - ((vel * norm) * norm) * f;
+
+ if(vel_x > -0.1 && vel_x < 0.1) vel_x = 0;
+ if(vel_y > -0.1 && vel_y < 0.1) vel_y = 0;
+ if(vel_z > -0.1 && vel_z < 0.1) vel_z = 0;
+
+ return vel;
+}
+
+void _Movetype_PushEntityTrace(vector push)
+{
+ vector end;
+ float type;
+
+ end = self.move_origin + push;
+
+ if(self.move_movetype == MOVETYPE_FLYMISSILE)
+ type = MOVE_MISSILE;
+ else if(self.solid == SOLID_TRIGGER || self.solid == SOLID_NOT)
+ type = MOVE_NOMONSTERS;
+ else
+ type = MOVE_NORMAL;
+
+ tracebox(self.move_origin, self.mins, self.maxs, end, type, self);
+}
+
+float _Movetype_PushEntity(vector push, float failonstartsolid) // SV_PushEntity
+{
+ _Movetype_PushEntityTrace(push);
+
+ if(trace_startsolid && failonstartsolid)
+ return trace_fraction;
+
+ self.move_origin = trace_endpos;
+
+ if(self.solid >= SOLID_TRIGGER && trace_ent && (!(self.move_flags & FL_ONGROUND) || (self.move_groundentity != trace_ent)))
+ _Movetype_Impact(trace_ent);
+
+ return trace_fraction;
+}
+
+void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
+{
+ if(self.move_flags & FL_ONGROUND)
+ {
+ if(self.velocity_z >= 1/32)
+ self.move_flags &~= FL_ONGROUND;
+ else if(!self.move_groundentity)
+ return;
+ else if(self.move_suspendedinair && wasfreed(self.move_groundentity))
+ {
+ self.move_groundentity = world;
+ return;
+ }
+ }
+
+ self.move_suspendedinair = FALSE;
+
+ _Movetype_CheckVelocity();
+
+ if(self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS)
+ {
+ self.move_didgravity = TRUE;
+ self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+ }
+
+ self.move_angles = self.move_angles + self.avelocity * dt;
+
+ vector move;
+ move = self.move_velocity * dt;
+
+ _Movetype_PushEntity(move, TRUE);
+ if(wasfreed(self))
+ return;
+
+ if(trace_startsolid)
+ {
+ _Movetype_UnstickEntity();
+ _Movetype_PushEntity(move, FALSE);
+ if(wasfreed(self))
+ return;
+ }
+
+ if(trace_fraction < 1)
+ {
+ if(self.move_movetype == MOVETYPE_BOUNCEMISSILE)
+ {
+ self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 2.0);
+ self.move_flags &~= FL_ONGROUND;
+ }
+ else if(self.move_movetype == MOVETYPE_BOUNCE)
+ {
+ self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1.5);
+
+ float d;
+ d = trace_plane_normal * self.move_velocity;
+ if(trace_plane_normal_z > 0.7 && d < 60 && d > -60)
+ {
+ self.move_flags |= FL_ONGROUND;
+ self.move_groundentity = trace_ent;
+ self.move_velocity = '0 0 0';
+ self.avelocity = '0 0 0';
+ }
+ else
+ self.move_flags &~= FL_ONGROUND;
+ }
+ else
+ {
+ self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1.0);
+ if(trace_plane_normal_z > 0.7)
+ {
+ self.move_flags |= FL_ONGROUND;
+ self.move_groundentity = trace_ent;
+ if(trace_ent.solid == SOLID_BSP)
+ self.move_suspendedinair = TRUE;
+ self.move_velocity = '0 0 0';
+ self.avelocity = '0 0 0';
+ }
+ else
+ self.move_flags &~= FL_ONGROUND;
+ }
+ }
+
+ _Movetype_CheckWaterTransition();
+}
+
+void Movetype_Physics(float matchserver) // SV_Physics_Entity
+{
+ float n, i, dt, movedt;
+
+ dt = time - self.move_time;
+
+ if(matchserver)
+ {
+ movedt = ticrate;
+ n = max(0, floor(dt / ticrate));
+ dt -= n * ticrate;
+ self.move_time += n * ticrate;
+ }
+ else
+ {
+ movedt = dt;
+ dt = 0;
+ n = 1;
+ self.move_time = time;
+ }
+
+ //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
+ // we use the field as set by the last run of this
+
+ for(i = 0; i < n; ++i)
+ {
+ self.move_didgravity = FALSE;
+ switch(self.move_movetype)
+ {
+ case MOVETYPE_PUSH:
+ case MOVETYPE_FAKEPUSH:
+ error("SV_Physics_Pusher not implemented");
+ break;
+ case MOVETYPE_NONE:
+ break;
+ case MOVETYPE_FOLLOW:
+ error("SV_Physics_Follow not implemented");
+ break;
+ case MOVETYPE_NOCLIP:
+ _Movetype_CheckWater();
+ self.move_origin = self.move_origin + ticrate * self.move_velocity;
+ self.move_angles = self.move_angles + ticrate * self.avelocity;
+ _Movetype_LinkEdict(FALSE);
+ break;
+ case MOVETYPE_STEP:
+ error("SV_Physics_Step not implemented");
+ break;
+ case MOVETYPE_WALK:
+ error("SV_Physics_Walk not implemented");
+ break;
+ case MOVETYPE_TOSS:
+ case MOVETYPE_BOUNCE:
+ case MOVETYPE_BOUNCEMISSILE:
+ case MOVETYPE_FLYMISSILE:
+ case MOVETYPE_FLY:
+ _Movetype_Physics_Toss(movedt);
+ break;
+ }
+ }
+
+ if(dt > 0)
+ {
+ // now continue the move from move_time to time
+ self.velocity = self.move_velocity;
+ if(self.move_didgravity)
+ self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+
+ self.angles = self.move_angles + dt * self.avelocity;
+
+ if(self.movetype != MOVETYPE_NOCLIP)
+ {
+ _Movetype_PushEntityTrace(dt * self.velocity);
+ if(!trace_startsolid)
+ self.origin = trace_endpos;
+ }
+ else
+ self.origin = self.move_origin + dt * self.velocity;
+ }
+ else
+ {
+ self.velocity = self.move_velocity;
+ self.angles = self.move_angles;
+ self.origin = self.move_origin;
+ }
+}
Added: trunk/data/qcsrc/client/movetypes.qh
===================================================================
--- trunk/data/qcsrc/client/movetypes.qh (rev 0)
+++ trunk/data/qcsrc/client/movetypes.qh 2009-01-16 08:09:32 UTC (rev 5562)
@@ -0,0 +1,25 @@
+.float move_flags;
+.float move_movetype;
+.float move_time;
+.vector move_origin;
+.vector move_angles;
+.vector move_velocity;
+
+void Movetype_Physics(float matchserver);
+
+float MOVETYPE_NONE = 0;
+float MOVETYPE_ANGLENOCLIP = 1;
+float MOVETYPE_ANGLECLIP = 2;
+float MOVETYPE_WALK = 3;
+float MOVETYPE_STEP = 4;
+float MOVETYPE_FLY = 5;
+float MOVETYPE_TOSS = 6;
+float MOVETYPE_PUSH = 7;
+float MOVETYPE_NOCLIP = 8;
+float MOVETYPE_FLYMISSILE = 9;
+float MOVETYPE_BOUNCE = 10;
+float MOVETYPE_BOUNCEMISSILE = 11; // Like bounce but doesn't lose speed on bouncing
+float MOVETYPE_FOLLOW = 12;
+float MOVETYPE_FAKEPUSH = 13;
+
+float FL_ONGROUND = 512;
Modified: trunk/data/qcsrc/client/progs.src
===================================================================
--- trunk/data/qcsrc/client/progs.src 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/client/progs.src 2009-01-16 08:09:32 UTC (rev 5562)
@@ -13,6 +13,7 @@
interpolate.qh
teamradar.qh
waypointsprites.qh
+movetypes.qh
main.qh
@@ -35,6 +36,7 @@
interpolate.qc
teamradar.qc
waypointsprites.qc
+movetypes.qc
../common/util.qc
../common/gamecommand.qc
Modified: trunk/data/qcsrc/client/projectile.qc
===================================================================
--- trunk/data/qcsrc/client/projectile.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/client/projectile.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -1,23 +1,17 @@
-.float itime;
.float count; // set if clientside projectile
.float cnt; // sound index
.float gravity;
void Projectile_Draw()
{
- float dt;
- vector oldorg, org;
+ vector oldorg;
oldorg = self.origin;
if(self.count & 0x80)
{
- dt = time - self.itime;
- self.velocity_z -= dt * self.gravity * getstatf(242); // STAT_MOVEVARS_GRAVITY
- org = self.origin + dt * self.velocity;
- self.itime = time;
- tracebox(self.origin, self.mins, self.maxs, org, MOVE_NORMAL, self);
- self.origin = trace_endpos;
+ //self.move_flags &~= FL_ONGROUND;
+ Movetype_Physics(TRUE);
self.angles = vectoangles(self.velocity);
}
else
@@ -45,13 +39,18 @@
R_AddEntity(self);
}
-void Ent_RemoveProjectile()
+void loopsound(entity e, float ch, string samp, float vol, float attn)
{
if(csqc_flags & CSQC_FLAG_COLORCODES)
- if(self.cnt)
- sound(self, CHAN_PAIN, "misc/null.wav", VOL_BASE, ATTN_NORM);
+ sound(e, ch, samp, vol, attn);
}
+void Ent_RemoveProjectile()
+{
+ if(self.cnt)
+ loopsound(self, CHAN_PAIN, "misc/null.wav", VOL_BASE, ATTN_NORM);
+}
+
void Ent_Projectile()
{
float f;
@@ -76,7 +75,14 @@
f = ReadByte();
self.count = (f & 0xC0);
self.iflags = IFLAG_AUTOANGLES | IFLAG_ANGLES;
+ self.move_flags &~= FL_ONGROUND;
+ // sv_gameplayfix_delayprojectiles
+ if(!self.move_time)
+ self.move_time = time + ticrate;
+ else
+ self.move_time = max(self.move_time, time);
+
if(self.count & 0x80)
InterpolateOrigin_Undo();
@@ -87,11 +93,13 @@
self.origin_z = ReadCoord();
if(self.count & 0x80)
{
- self.itime = time;
self.velocity_x = ReadCoord();
self.velocity_y = ReadCoord();
self.velocity_z = ReadCoord();
self.gravity = ReadCoord();
+
+ self.move_origin = self.origin;
+ self.move_velocity = self.velocity;
}
}
@@ -112,29 +120,31 @@
self.cnt = ReadShort();
- if(csqc_flags & CSQC_FLAG_COLORCODES)
- switch(self.cnt)
- {
- case PROJECTILE_ELECTRO:
- // only new engines support sound moving with object
- sound(self, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
- break;
- case PROJECTILE_ROCKET:
- sound(self, CHAN_PAIN, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
- break;
- case PROJECTILE_TAG:
- sound(self, CHAN_PAIN, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
- break;
- default:
- break;
- }
-
- sz = ReadByte();
- switch(sz)
+ switch(self.cnt)
{
- case 0:
+ case PROJECTILE_ELECTRO:
+ // only new engines support sound moving with object
+ loopsound(self, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+ self.mins = '0 0 -3';
+ self.maxs = '0 0 -3';
+ self.move_movetype = MOVETYPE_BOUNCE;
+ break;
+ case PROJECTILE_ROCKET:
+ loopsound(self, CHAN_PAIN, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
+ self.mins = '-3 -3 -3';
+ self.maxs = '3 3 3';
+ self.move_movetype = MOVETYPE_TOSS;
+ break;
+ case PROJECTILE_TAG:
+ loopsound(self, CHAN_PAIN, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+ self.mins = '-2 -2 -2';
+ self.maxs = '2 2 2';
+ self.move_movetype = MOVETYPE_TOSS;
+ break;
default:
- self.mins = self.maxs = '0 0 0';
+ self.mins = '0 0 0';
+ self.maxs = '0 0 0';
+ self.move_movetype = MOVETYPE_TOSS;
break;
}
}
Modified: trunk/data/qcsrc/server/csqcprojectile.qc
===================================================================
--- trunk/data/qcsrc/server/csqcprojectile.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/server/csqcprojectile.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -38,7 +38,6 @@
WriteByte(MSG_ENTITY, floor(self.effects / 65536));
}
WriteShort(MSG_ENTITY, self.csqcprojectile_type);
- WriteByte(MSG_ENTITY, 0); // size category
}
return 1;
Modified: trunk/data/qcsrc/server/tturrets/units/unit_hk.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/unit_hk.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/server/tturrets/units/unit_hk.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -90,7 +90,7 @@
missile = spawn ();
missile.solid = SOLID_BBOX;
setmodel (missile, "models/turrets/hunter2.md3"); // precision set below
- setsize (missile, missile.mins,missile.maxs); // give it some size so it can be shot
+ setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
setorigin(missile, self.tur_shotorg_updated);
missile.scale = 1;
Modified: trunk/data/qcsrc/server/w_electro.qc
===================================================================
--- trunk/data/qcsrc/server/w_electro.qc 2009-01-15 22:15:29 UTC (rev 5561)
+++ trunk/data/qcsrc/server/w_electro.qc 2009-01-16 08:09:32 UTC (rev 5562)
@@ -42,7 +42,7 @@
void W_Plasma_Touch (void)
{
- UpdateCSQCProjectile(self);
+ //UpdateCSQCProjectile(self);
PROJECTILE_TOUCH;
if (other.takedamage == DAMAGE_AIM) {
More information about the nexuiz-commits
mailing list