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