[nexuiz-commits] r6197 - in trunk/data/qcsrc: client server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Mar 17 04:04:47 EDT 2009


Author: div0
Date: 2009-03-17 04:04:33 -0400 (Tue, 17 Mar 2009)
New Revision: 6197

Modified:
   trunk/data/qcsrc/client/projectile.qc
   trunk/data/qcsrc/server/csqcprojectile.qc
   trunk/data/qcsrc/server/csqcprojectile.qh
   trunk/data/qcsrc/server/defs.qh
   trunk/data/qcsrc/server/miscfunctions.qc
   trunk/data/qcsrc/server/sv_main.qc
   trunk/data/qcsrc/server/w_crylink.qc
   trunk/data/qcsrc/server/w_electro.qc
   trunk/data/qcsrc/server/w_grenadelauncher.qc
   trunk/data/qcsrc/server/w_hagar.qc
Log:
fix some serious csqcprojectile bugs (regarding collisions with bmodels).

Now there is some visible jitter that wasn't there before wehn they're lying on a bmodel, but they no longer do the wrong thing.


Modified: trunk/data/qcsrc/client/projectile.qc
===================================================================
--- trunk/data/qcsrc/client/projectile.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/client/projectile.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -200,10 +200,17 @@
 	f = ReadByte();
 	self.count = (f & 0x80);
 	self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES;
-	self.move_flags &~= FL_ONGROUND;
 	self.solid = SOLID_TRIGGER;
 	//self.effects = EF_NOMODELFLAGS;
 
+	// this should make collisions with bmodels more exact, but it leads to
+	// projectiles no longer being able to lie on a bmodel
+	self.move_nomonsters = MOVE_WORLDONLY;
+	if(f & 0x40)
+		self.move_flags |= FL_ONGROUND;
+	else
+		self.move_flags &~= FL_ONGROUND;
+
 	if(!self.move_time)
 	{
 		// for some unknown reason, we don't need to care for

Modified: trunk/data/qcsrc/server/csqcprojectile.qc
===================================================================
--- trunk/data/qcsrc/server/csqcprojectile.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/csqcprojectile.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -7,6 +7,9 @@
 	if(self.csqcprojectile_clientanimate)
 		sf |= 0x80; // client animated, not interpolated
 
+	if(self.flags & FL_ONGROUND)
+		sf |= 0x40;
+
 	WriteByte(MSG_ENTITY, ENT_CLIENT_PROJECTILE);
 	WriteByte(MSG_ENTITY, sf);
 
@@ -31,6 +34,16 @@
 	return 1;
 }
 
+.vector csqcprojectile_oldorigin;
+void CSQCProjectile_Check(entity e)
+{
+	if(e.csqcprojectile_clientanimate)
+	if(e.flags & FL_ONGROUND)
+	if(e.origin != e.csqcprojectile_oldorigin)
+		UpdateCSQCProjectile(e);
+	e.csqcprojectile_oldorigin = e.origin;
+}
+
 void CSQCProjectile(entity e, float clientanimate, float type, float docull)
 {
 	Net_LinkEntity(e, docull, 0, CSQCProjectile_SendEntity);
@@ -51,5 +64,17 @@
 void UpdateCSQCProjectile(entity e)
 {
 	if(e.SendEntity == CSQCProjectile_SendEntity)
-		e.SendFlags |= 1; // send new origin data
+	{
+		// send new origin data
+		e.SendFlags |= 1;
+	}
 }
+
+void UpdateCSQCProjectileNextFrame(entity e)
+{
+	if(e.SendEntity == CSQCProjectile_SendEntity)
+	{
+		// send new origin data
+		e.NextFrameSendFlags |= 1;
+	}
+}

Modified: trunk/data/qcsrc/server/csqcprojectile.qh
===================================================================
--- trunk/data/qcsrc/server/csqcprojectile.qh	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/csqcprojectile.qh	2009-03-17 08:04:33 UTC (rev 6197)
@@ -2,3 +2,5 @@
 
 void CSQCProjectile(entity e, float clientanimate, float type, float docull);
 void UpdateCSQCProjectile(entity e);
+void UpdateCSQCProjectileNextFrame(entity e);
+void CSQCProjectile_Check(entity e);

Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/defs.qh	2009-03-17 08:04:33 UTC (rev 6197)
@@ -551,3 +551,5 @@
 .float wasplayer;
 
 float servertime, serverprevtime, serverframetime;
+
+.float NextFrameSendFlags;

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -1797,8 +1797,7 @@
 
 #define SUB_OwnerCheck() (other && (other == self.owner))
 
-#define PROJECTILE_TOUCH do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { remove(self); return; } } while(0)
-#define PROJECTILE_TOUCH_NOSOUND do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { stopsound(self, CHAN_PAIN); remove(self); return; } } while(0)
+#define PROJECTILE_TOUCH do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { remove(self); return; } if(trace_ent && trace_ent.solid > SOLID_TRIGGER) UpdateCSQCProjectileNextFrame(self); } while(0)
 
 float MAX_IPBAN_URIS = 16;
 

Modified: trunk/data/qcsrc/server/sv_main.qc
===================================================================
--- trunk/data/qcsrc/server/sv_main.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/sv_main.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -140,6 +140,15 @@
 
 	dprint_load(); // load dprint status from cvar
 
+	entity e;
+	for(e = world; (e = findflags(e, NextFrameSendFlags, 0xFFFFFF)); )
+	{
+		e.SendFlags |= e.NextFrameSendFlags;
+		e.NextFrameSendFlags = 0;
+	}
+	for(e = world; (e = findfloat(e, csqcprojectile_clientanimate, 1)); )
+		CSQCProjectile_Check(e);
+
 	if(RedirectionThink())
 		return;
 

Modified: trunk/data/qcsrc/server/w_crylink.qc
===================================================================
--- trunk/data/qcsrc/server/w_crylink.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/w_crylink.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -25,8 +25,6 @@
 	self.owner = world;
 	self.projectiledeathtype |= HITTYPE_BOUNCE;
 	//self.scale = 1 + self.cnt;
-
-	UpdateCSQCProjectile(self);
 }
 
 void W_Crylink_Touch2 (void)
@@ -52,8 +50,6 @@
 	self.owner = world;
 	self.projectiledeathtype |= HITTYPE_BOUNCE;
 //	self.scale = 1 + 1 * self.cnt;
-
-	UpdateCSQCProjectile(self);
 }
 
 void W_Crylink_Attack (void)

Modified: trunk/data/qcsrc/server/w_electro.qc
===================================================================
--- trunk/data/qcsrc/server/w_electro.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/w_electro.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -35,9 +35,6 @@
 		sound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
 	}
-
-	if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough
-		UpdateCSQCProjectile(self);
 }
 
 void W_Plasma_TouchExplode (void)

Modified: trunk/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- trunk/data/qcsrc/server/w_grenadelauncher.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/w_grenadelauncher.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -57,9 +57,6 @@
 			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
 	}
-
-	if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough
-		UpdateCSQCProjectile(self);
 }
 
 void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)

Modified: trunk/data/qcsrc/server/w_hagar.qc
===================================================================
--- trunk/data/qcsrc/server/w_hagar.qc	2009-03-16 13:40:48 UTC (rev 6196)
+++ trunk/data/qcsrc/server/w_hagar.qc	2009-03-17 08:04:33 UTC (rev 6197)
@@ -33,9 +33,6 @@
 		self.owner = world;
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
 	}
-
-	if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough
-		UpdateCSQCProjectile(self);
 }
 
 void W_Hagar_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)



More information about the nexuiz-commits mailing list