From 738e2ebdf9d63a4957f1d9883558bd6bc09cbfcd Mon Sep 17 00:00:00 2001 From: Samual Date: Fri, 30 Sep 2011 00:46:22 -0400 Subject: [PATCH] W_CheckProjectileDamage -- new global weapon function which check g_projectiles_damage on whether or not a projectile can take a certain kind of damage. // possible values: // -2: absolutely no damage to projectiles (no exceptions) // -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer mines) // 0: only damage from contents (lava/slime) or exceptions // 1: only self damage or damage from contents or exceptions // 2: allow all damage to projectiles normally --- balance25.cfg | 7 +++++++ balanceFruit.cfg | 7 +++++++ balanceLeeStricklin.cfg | 7 +++++++ balanceXonotic.cfg | 7 +++++++ balancetZork.cfg | 7 +++++++ qcsrc/server/autocvars.qh | 1 + qcsrc/server/g_hook.qc | 25 ++++++++++++++----------- qcsrc/server/w_common.qc | 26 ++++++++++++++++++++++++++ qcsrc/server/w_electro.qc | 8 +++++++- qcsrc/server/w_fireball.qc | 4 ++++ qcsrc/server/w_grenadelauncher.qc | 4 ++++ qcsrc/server/w_hagar.qc | 10 +++++++--- qcsrc/server/w_hook.qc | 4 ++++ qcsrc/server/w_minelayer.qc | 6 ++++++ qcsrc/server/w_rocketlauncher.qc | 4 ++++ qcsrc/server/w_seeker.qc | 3 +++ 16 files changed, 115 insertions(+), 15 deletions(-) diff --git a/balance25.cfg b/balance25.cfg index edaa78512..12c56c907 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -155,6 +155,13 @@ set g_balance_firetransfer_time 0.9 set g_balance_firetransfer_damage 0.8 set g_throughfloor_damage 1 set g_throughfloor_force 1 +set g_projectiles_damage 1 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally set g_projectiles_newton_style 2 // possible values: // 0: absolute velocity projectiles (like Quake) diff --git a/balanceFruit.cfg b/balanceFruit.cfg index 84bfea542..2ec1c23bf 100644 --- a/balanceFruit.cfg +++ b/balanceFruit.cfg @@ -155,6 +155,13 @@ set g_balance_firetransfer_time 0.9 set g_balance_firetransfer_damage 0.8 set g_throughfloor_damage 0.7 set g_throughfloor_force 0.8 +set g_projectiles_damage 1 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally set g_projectiles_newton_style 2 // possible values: // 0: absolute velocity projectiles (like Quake) diff --git a/balanceLeeStricklin.cfg b/balanceLeeStricklin.cfg index 121853d25..3c9749c36 100644 --- a/balanceLeeStricklin.cfg +++ b/balanceLeeStricklin.cfg @@ -155,6 +155,13 @@ set g_balance_firetransfer_time 0.9 set g_balance_firetransfer_damage 0.8 set g_throughfloor_damage 0.4 set g_throughfloor_force 0.7 +set g_projectiles_damage 1 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally set g_projectiles_newton_style 2 // possible values: // 0: absolute velocity projectiles (like Quake) diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index 603f158ec..63f084317 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -155,6 +155,13 @@ set g_balance_firetransfer_time 0.9 set g_balance_firetransfer_damage 0.8 set g_throughfloor_damage 0.5 set g_throughfloor_force 0.75 +set g_projectiles_damage 1 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally set g_projectiles_newton_style 2 // possible values: // 0: absolute velocity projectiles (like Quake) diff --git a/balancetZork.cfg b/balancetZork.cfg index 4a8e32410..07b35e2ee 100644 --- a/balancetZork.cfg +++ b/balancetZork.cfg @@ -155,6 +155,13 @@ set g_balance_firetransfer_time 0.9 set g_balance_firetransfer_damage 0.8 set g_throughfloor_damage 0.5 set g_throughfloor_force 0.7 +set g_projectiles_damage 1 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally set g_projectiles_newton_style 2 // possible values: // 0: absolute velocity projectiles (like Quake) diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 9be4bd392..894ccc23e 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -945,6 +945,7 @@ float autocvar_g_playerstats_debug; float autocvar_g_powerup_shield; float autocvar_g_powerup_strength; float autocvar_g_powerup_superhealth; +float autocvar_g_projectiles_damage; float autocvar_g_projectiles_newton_style; float autocvar_g_projectiles_newton_style_2_maxfactor; float autocvar_g_projectiles_newton_style_2_minfactor; diff --git a/qcsrc/server/g_hook.qc b/qcsrc/server/g_hook.qc index dfd68e2ec..27a63c421 100644 --- a/qcsrc/server/g_hook.qc +++ b/qcsrc/server/g_hook.qc @@ -271,21 +271,24 @@ void GrapplingHookTouch (void) void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { - if(self.health > 0) - { - self.health = self.health - damage; + if(self.health <= 0) + return; - print(strcat("hook health ", ftos(self.health), " after ", ftos(damage), " damage... (at time: ", ftos(time), ")\n")); + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, 0)) // no exceptions + return; // g_balance_projectiledamage says to halt + + self.health = self.health - damage; - if (self.health <= 0) + print(strcat("hook health ", ftos(self.health), " after ", ftos(damage), " damage... (at time: ", ftos(time), ")\n")); + + if (self.health <= 0) + { + if(attacker != self.realowner) { - if(attacker != self.realowner) - { - self.realowner.pusher = attacker; - self.realowner.pushltime = time + autocvar_g_maxpushtime; - } - RemoveGrapplingHook(self.realowner); + self.realowner.pusher = attacker; + self.realowner.pushltime = time + autocvar_g_maxpushtime; } + RemoveGrapplingHook(self.realowner); } } diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index f1e33ec96..dfd5c77b6 100644 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@ -541,6 +541,32 @@ void fireBullet (vector start, vector dir, float spread, float damage, float for trace_endpos = end; } +float W_CheckProjectileDamage(entity inflictor, entity projowner, float deathtype, float exception) +{ + float is_from_contents = (deathtype == DEATH_SLIME || deathtype == DEATH_LAVA); + float is_from_owner = (inflictor == projowner); + + if(autocvar_g_projectiles_damage <= -2) + return FALSE; // no damage to projectiles at all, not even with the exceptions + + else if(autocvar_g_projectiles_damage == -1) + if not(exception) + return FALSE; // no damage other than exceptions (electro combo, hagar join explode, minelayer mines) + + else if(autocvar_g_projectiles_damage == 0) + if not(is_from_contents || exception) + return FALSE; // only damage from contents or exceptions is allowed + + else if(autocvar_g_projectiles_damage == 1) + if not(is_from_contents || is_from_owner || exception) + return FALSE; // only self damage or damage from contents or exceptions is allowed + + // -2 or lower disables all damage including exceptions + // 2 or higher automatically allows all damage normally + + return TRUE; // continue with the damage as planned +} + void W_PrepareExplosionByDamage(entity attacker, void() explode) { self.takedamage = DAMAGE_NO; diff --git a/qcsrc/server/w_electro.qc b/qcsrc/server/w_electro.qc index 6253e50fc..08b963431 100644 --- a/qcsrc/server/w_electro.qc +++ b/qcsrc/server/w_electro.qc @@ -83,13 +83,19 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea { if(self.health <= 0) return; + // note: combos are usually triggered by W_Plasma_TriggerCombo, not damage + float is_combo = (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim"); + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, is_combo)) + return; // g_projectiles_damage says to halt + self.health = self.health - damage; if (self.health <= 0) { self.takedamage = DAMAGE_NO; self.nextthink = time; - if (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim") + if (is_combo) { // change owner to whoever caused the combo explosion self.realowner = inflictor.realowner; diff --git a/qcsrc/server/w_fireball.qc b/qcsrc/server/w_fireball.qc index d916edd9f..dd85c5c85 100644 --- a/qcsrc/server/w_fireball.qc +++ b/qcsrc/server/w_fireball.qc @@ -115,6 +115,10 @@ void W_Fireball_Damage (entity inflictor, entity attacker, float damage, float d { if(self.health <= 0) return; + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, 0)) // no exceptions + return; // g_projectiles_damage says to halt + self.health = self.health - damage; if (self.health <= 0) { diff --git a/qcsrc/server/w_grenadelauncher.qc b/qcsrc/server/w_grenadelauncher.qc index 929b10528..7a405d30b 100644 --- a/qcsrc/server/w_grenadelauncher.qc +++ b/qcsrc/server/w_grenadelauncher.qc @@ -49,6 +49,10 @@ void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float de { if (self.health <= 0) return; + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, 0)) // no exceptions + return; // g_projectiles_damage says to halt + self.health = self.health - damage; print(strcat("grenade health ", ftos(self.health), " after ", ftos(damage), " damage... (at time: ", ftos(time), ")\n")); diff --git a/qcsrc/server/w_hagar.qc b/qcsrc/server/w_hagar.qc index 855a4a04c..2a3597eab 100644 --- a/qcsrc/server/w_hagar.qc +++ b/qcsrc/server/w_hagar.qc @@ -25,8 +25,12 @@ void W_Hagar_Damage (entity inflictor, entity attacker, float damage, float deat if (self.health <= 0) return; - if ((inflictor.realowner == self.realowner) && !autocvar_g_balance_hagar_secondary_load_linkexplode) - return; + float is_linkexplode = ((inflictor.realowner == self.realowner) + && ((inflictor.projectiledeathtype & HITTYPE_SECONDARY) && (self.projectiledeathtype & HITTYPE_SECONDARY)) + && !autocvar_g_balance_hagar_secondary_load_linkexplode); + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, is_linkexplode)) + return; // g_projectiles_damage says to halt self.health = self.health - damage; self.angles = vectoangles(self.velocity); @@ -186,7 +190,7 @@ void W_Hagar_Attack2_Load_Release (void) missile.think = adaptor_think2use_hittype_splash; missile.nextthink = time + autocvar_g_balance_hagar_secondary_lifetime_min + random() * autocvar_g_balance_hagar_secondary_lifetime_rand; PROJECTILE_MAKETRIGGER(missile); - missile.projectiledeathtype = WEP_HAGAR; + missile.projectiledeathtype = WEP_HAGAR | HITTYPE_SECONDARY; setorigin (missile, w_shotorg); setsize(missile, '0 0 0', '0 0 0'); missile.movetype = MOVETYPE_FLY; diff --git a/qcsrc/server/w_hook.qc b/qcsrc/server/w_hook.qc index d3c38fc05..856518822 100644 --- a/qcsrc/server/w_hook.qc +++ b/qcsrc/server/w_hook.qc @@ -56,6 +56,10 @@ void W_Hook_Damage (entity inflictor, entity attacker, float damage, float death { if (self.health <= 0) return; + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, 0)) // no exceptions + return; // g_projectiles_damage says to halt + self.health = self.health - damage; print(strcat("hookbomb health ", ftos(self.health), " after ", ftos(damage), " damage... (at time: ", ftos(time), ")\n")); diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc index af60af14e..efb9f7dbe 100644 --- a/qcsrc/server/w_minelayer.qc +++ b/qcsrc/server/w_minelayer.qc @@ -242,6 +242,12 @@ void W_Mine_Damage (entity inflictor, entity attacker, float damage, float death { if (self.health <= 0) return; + + float is_from_enemy = (inflictor.realowner != self.realowner); + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, is_from_enemy)) + return; // g_projectiles_damage says to halt + self.health = self.health - damage; self.angles = vectoangles(self.velocity); diff --git a/qcsrc/server/w_rocketlauncher.qc b/qcsrc/server/w_rocketlauncher.qc index 1c0b5a8b5..3a1bc9699 100644 --- a/qcsrc/server/w_rocketlauncher.qc +++ b/qcsrc/server/w_rocketlauncher.qc @@ -238,6 +238,10 @@ void W_Rocket_Damage (entity inflictor, entity attacker, float damage, float dea { if (self.health <= 0) return; + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, 0)) // no exceptions + return; // g_projectiles_damage says to halt + self.health = self.health - damage; self.angles = vectoangles(self.velocity); diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc index 326680cbd..72cd9085a 100644 --- a/qcsrc/server/w_seeker.qc +++ b/qcsrc/server/w_seeker.qc @@ -124,6 +124,9 @@ void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, flo { if (self.health <= 0) return; + + if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, 0)) // no exceptions + return; // g_projectiles_damage says to halt if (self.realowner == attacker) self.health = self.health - (damage * 0.25); -- 2.39.2