r4916 - in branches/nexuiz-2.0: . data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Oct 27 07:23:38 EDT 2008


Author: div0
Date: 2008-10-27 07:23:38 -0400 (Mon, 27 Oct 2008)
New Revision: 4916

Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
Log:
r4914 | div0 | 2008-10-27 12:18:21 +0100 (Mon, 27 Oct 2008) | 2 lines
fix radiusdamage recursions
r4915 | div0 | 2008-10-27 12:22:55 +0100 (Mon, 27 Oct 2008) | 2 lines
if a remaining RadiusDamage recursion exists, print a stack trace for it and avoid the crash


Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/.patchsets	2008-10-27 11:23:38 UTC (rev 4916)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-4912
+revisions_applied = 1-4915

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2008-10-27 11:23:38 UTC (rev 4916)
@@ -819,6 +819,7 @@
 	return nearest;
 }
 
+float RadiusDamage_running;
 float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)
 // Returns total damage applies to creatures
 {
@@ -832,6 +833,21 @@
 	vector  nearest;
 	float   total_damage_to_creatures;
 
+	if(RadiusDamage_running)
+	{
+		string save;
+		print("RadiusDamage called recursively!\n");
+		print("Expect stuff to go HORRIBLY wrong.\n");
+		print("Causing a stack trace...\n");
+		save = cvar_string("prvm_backtraceforwarnings");
+		cvar_set("prvm_backtraceforwarnings", "1");
+		fclose(-1); // calls VM_Warning
+		cvar_set("prvm_backtraceforwarnings", save);
+		return 0;
+	}
+
+	RadiusDamage_running = 1;
+
 	blastorigin = (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5);
 	total_damage_to_creatures = 0;
 
@@ -893,5 +909,7 @@
 		targ = targ.chain;
 	}
 
+	RadiusDamage_running = 0;
+
 	return total_damage_to_creatures;
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2008-10-27 11:23:38 UTC (rev 4916)
@@ -152,3 +152,15 @@
 		Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force);
 	}
 }
+
+void W_PrepareExplosionByDamage(entity attacker, void() explode)
+{
+	self.takedamage = DAMAGE_NO;
+	self.event_damage = SUB_Null;
+	self.owner = attacker;
+
+	// do not explode NOW but in the NEXT FRAME!
+	// because recursive calls to RadiusDamage are not allowed
+	self.nextthink = time;
+	self.think = explode;
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2008-10-27 11:23:38 UTC (rev 4916)
@@ -82,8 +82,7 @@
 	self.health = self.health - damage;
 	if (self.health <= 0)
 	{
-		self.owner = attacker;
-		self.think ();
+		W_PrepareExplosionByDamage(attacker, self.think);
 	}
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2008-10-27 11:23:38 UTC (rev 4916)
@@ -74,7 +74,7 @@
 {
 	self.health = self.health - damage;
 	if (self.health <= 0)
-		self.think ();
+		W_PrepareExplosionByDamage(attacker, self.think);
 }
 
 void W_Hagar_Attack (void)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2008-10-27 11:23:38 UTC (rev 4916)
@@ -196,10 +196,7 @@
 	self.health = self.health - damage;
 	self.angles = vectoangles(self.velocity);
 	if (self.health <= 0)
-	{
-		self.owner = attacker;
-		W_Rocket_Explode();
-	}
+		W_PrepareExplosionByDamage(attacker, W_Rocket_Explode);
 }
 
 void W_Rocket_Attack (void)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2008-10-27 11:22:55 UTC (rev 4915)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2008-10-27 11:23:38 UTC (rev 4916)
@@ -129,7 +129,6 @@
 
 void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
-
     float d;
     d = damage;
 
@@ -139,7 +138,7 @@
     self.health = self.health - d;
 
     if (self.health <= 0)
-        Seeker_Missile_Explode();
+		W_PrepareExplosionByDamage(attacker, Seeker_Missile_Explode);
 }
 
 #define EF_ROCKET				16777216




More information about the nexuiz-commits mailing list