r3403 - in trunk/data: . qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Feb 23 08:54:46 EST 2008


Author: div0
Date: 2008-02-23 08:54:46 -0500 (Sat, 23 Feb 2008)
New Revision: 3403

Modified:
   trunk/data/qcsrc/server/g_damage.qc
   trunk/data/qcsrc/server/w_rocketlauncher.qc
   trunk/data/weapons.cfg
Log:
g_balance_rocketlauncher_detonatedelay -1 is now a "safety device" that prevents hitting yourself with it altogether


Modified: trunk/data/qcsrc/server/g_damage.qc
===================================================================
--- trunk/data/qcsrc/server/g_damage.qc	2008-02-23 12:44:54 UTC (rev 3402)
+++ trunk/data/qcsrc/server/g_damage.qc	2008-02-23 13:54:46 UTC (rev 3403)
@@ -601,6 +601,20 @@
 	}
 }
 
+vector NearestPointOnBox(entity box, vector org)
+{
+	vector m1, m2, nearest;
+
+	m1 = box.mins + box.origin;
+	m2 = box.maxs + box.origin;
+
+	nearest_x = bound(m1_x, org_x, m2_x);
+	nearest_y = bound(m1_y, org_y, m2_y);
+	nearest_z = bound(m1_z, org_z, m2_z);
+
+	return nearest;
+}
+
 float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype)
 // Returns total damage applies to creatures
 {
@@ -609,11 +623,9 @@
 	float	power;
 	vector	blastorigin;
 	vector	force;
-	vector	m1;
-	vector	m2;
-	vector	nearest;
-	vector	diff;
+	vector  diff;
 	vector  center;
+	vector  nearest;
 	float   total_damage_to_creatures;
 
 	blastorigin = (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5);
@@ -627,15 +639,7 @@
 			{
 				// LordHavoc: measure distance to nearest point on target (not origin)
 				// (this guarentees 100% damage on a touch impact)
-				nearest = blastorigin;
-				m1 = targ.origin + targ.mins;
-				m2 = targ.origin + targ.maxs;
-				if (nearest_x < m1_x) nearest_x = m1_x;
-				if (nearest_y < m1_y) nearest_y = m1_y;
-				if (nearest_z < m1_z) nearest_z = m1_z;
-				if (nearest_x > m2_x) nearest_x = m2_x;
-				if (nearest_y > m2_y) nearest_y = m2_y;
-				if (nearest_z > m2_z) nearest_z = m2_z;
+				nearest = NearestPointOnBox(targ, blastorigin);
 				diff = nearest - blastorigin;
 				// round up a little on the damage to ensure full damage on impacts
 				// and turn the distance into a fraction of the radius
@@ -649,7 +653,7 @@
 					finaldmg = coredamage * power + edgedamage * (1 - power);
 					if (finaldmg > 0)
 					{
-						center = (m1 + m2) * 0.5;
+						center = targ.origin + (targ.mins + targ.maxs) * 0.5;
 						// if it's a player, use the view origin as reference
 						if (targ.classname == "player")
 							center = targ.origin + targ.view_ofs;
@@ -674,9 +678,9 @@
 								Damage (targ, inflictor, attacker, finaldmg, deathtype, nearest, force);
 								break;
 							}
-							nearest_x = m1_x + random() * targ.size_x;
-							nearest_y = m1_y + random() * targ.size_y;
-							nearest_z = m1_z + random() * targ.size_z;
+							nearest_x = targ.mins_x + random() * targ.size_x;
+							nearest_y = targ.mins_y + random() * targ.size_y;
+							nearest_z = targ.mins_z + random() * targ.size_z;
 						}
 					}
 				}

Modified: trunk/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- trunk/data/qcsrc/server/w_rocketlauncher.qc	2008-02-23 12:44:54 UTC (rev 3402)
+++ trunk/data/qcsrc/server/w_rocketlauncher.qc	2008-02-23 13:54:46 UTC (rev 3403)
@@ -1,5 +1,6 @@
 
 .float rl_sound;
+.float rl_detonate_later;
 
 void W_Rocket_Explode (void)
 {
@@ -79,6 +80,23 @@
 	return selected;
 }
 
+void W_Rocket_RemoteExplode()
+{
+	if(self.owner.deadflag == DEAD_NO)
+	{
+		if((self.spawnshieldtime >= 0)
+			? (time >= self.spawnshieldtime) // timer
+			: (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_radius")) // safety device
+		)
+		{
+			W_Rocket_Explode ();
+		}
+		else
+		{
+		}
+	}
+}
+
 void W_Rocket_Think (void)
 {
 	entity e;
@@ -119,11 +137,9 @@
 
 			if(self.owner.deadflag == DEAD_NO)
 			if (self.owner.button0 && self.ltime < 0) // if the player let go of the button and then pushed it again
-			if(time >= self.spawnshieldtime)
-			{
-				  W_Rocket_Explode ();
-				  return;
-			}
+				self.rl_detonate_later = TRUE;
+			if(self.rl_detonate_later)
+				W_Rocket_RemoteExplode();
 
 			if(cvar("g_balance_rocketlauncher_laserguided_allow_steal"))
 			{
@@ -160,10 +176,10 @@
 		}
 		else
 		{
-			if(self.owner.deadflag == DEAD_NO)
 			if (self.owner.button3)
-			if(time >= self.spawnshieldtime)
-				  W_Rocket_Explode ();
+				self.rl_detonate_later = TRUE;
+			if(self.rl_detonate_later)
+				W_Rocket_RemoteExplode();
 		}
 	}
 }
@@ -207,7 +223,10 @@
 	missile = spawn ();
 	missile.owner = self;
 	self.lastrocket = missile;
-	missile.spawnshieldtime = time + cvar("g_balance_rocketlauncher_detonatedelay");
+	if(cvar("g_balance_rocketlauncher_detonatedelay") >= 0)
+		missile.spawnshieldtime = time + cvar("g_balance_rocketlauncher_detonatedelay");
+	else
+		missile.spawnshieldtime = -1;
 	missile.classname = "missile";
 	missile.bot_dodge = TRUE;
 	missile.bot_dodgerating = cvar("g_balance_rocketlauncher_primary_damage") * 2; // * 2 because it can be detonated inflight which makes it even more dangerous

Modified: trunk/data/weapons.cfg
===================================================================
--- trunk/data/weapons.cfg	2008-02-23 12:44:54 UTC (rev 3402)
+++ trunk/data/weapons.cfg	2008-02-23 13:54:46 UTC (rev 3403)
@@ -186,7 +186,7 @@
 set g_balance_rocketlauncher_refire 1
 set g_balance_rocketlauncher_animtime 0.3
 set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_detonatedelay 0
+set g_balance_rocketlauncher_detonatedelay 0 // positive: timer till detonation is allowed; negative: "security device" that prevents ANY remote detonation if it could hurt its owner
 set g_balance_rocketlauncher_laserguided_speed 1000  //650
 set g_balance_rocketlauncher_laserguided_speedaccel 0
 set g_balance_rocketlauncher_laserguided_speedstart 1000




More information about the nexuiz-commits mailing list