From 06ff6ba4872a43c0e3bc964e59e147ba4e4c1500 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 23 Feb 2008 13:54:46 +0000 Subject: [PATCH] g_balance_rocketlauncher_detonatedelay -1 is now a "safety device" that prevents hitting yourself with it altogether git-svn-id: svn://svn.icculus.org/nexuiz/trunk@3403 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/g_damage.qc | 38 +++++++++++++++------------ data/qcsrc/server/w_rocketlauncher.qc | 37 +++++++++++++++++++------- data/weapons.cfg | 2 +- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index 814c346a6..b08d61456 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -601,6 +601,20 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float } } +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 RadiusDamage (entity inflictor, entity attacker, float coredamage, float e 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 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e { // 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 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e 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 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e 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; } } } diff --git a/data/qcsrc/server/w_rocketlauncher.qc b/data/qcsrc/server/w_rocketlauncher.qc index 60a927070..4197acc21 100644 --- a/data/qcsrc/server/w_rocketlauncher.qc +++ b/data/qcsrc/server/w_rocketlauncher.qc @@ -1,5 +1,6 @@ .float rl_sound; +.float rl_detonate_later; void W_Rocket_Explode (void) { @@ -79,6 +80,23 @@ entity FindLaserTarget(entity e, float dist_variance, float dot_variance) 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 @@ void W_Rocket_Think (void) 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 @@ void W_Rocket_Think (void) } 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 @@ void W_Rocket_Attack (void) 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 diff --git a/data/weapons.cfg b/data/weapons.cfg index ff25c7e65..44f0b6a4d 100644 --- a/data/weapons.cfg +++ b/data/weapons.cfg @@ -186,7 +186,7 @@ set g_balance_rocketlauncher_lifetime 30 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 -- 2.39.2