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