From d436973ea928fe8bf1d407fdf1da0383ba7f275c Mon Sep 17 00:00:00 2001 From: Mario Date: Fri, 4 Oct 2024 01:41:40 +1000 Subject: [PATCH] Add a spam hittype for weapon attacks that repeatedly trigger radius damage --- qcsrc/common/deathtypes/all.qh | 14 +++++++------- qcsrc/common/weapons/weapon/hook.qc | 2 +- qcsrc/server/damage.qc | 25 ++++++++++++------------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/qcsrc/common/deathtypes/all.qh b/qcsrc/common/deathtypes/all.qh index f4b498018..f83a2a5c8 100644 --- a/qcsrc/common/deathtypes/all.qh +++ b/qcsrc/common/deathtypes/all.qh @@ -23,14 +23,14 @@ REGISTRY_DEFINE_GET(Deathtypes, NULL) const int DEATH_WEAPONMASK = BITS(8); const int HITTYPE_SECONDARY = BITS(1) << 8; -/** automatically set by RadiusDamage */ -const int HITTYPE_SPLASH = BITS(1) << 9; -const int HITTYPE_BOUNCE = BITS(1) << 10; -const int HITTYPE_ARMORPIERCE = BITS(1) << 11; -const int HITTYPE_SOUND = BITS(1) << 12; -const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_SOUND; +const int HITTYPE_SPLASH = BITS(1) << 9; // automatically set by RadiusDamage +const int HITTYPE_BOUNCE = BITS(1) << 10; // set manually after projectile has bounced +const int HITTYPE_ARMORPIERCE = BITS(1) << 11; // ignore armor calculations +const int HITTYPE_SOUND = BITS(1) << 12; // cause bleeding from ears +const int HITTYPE_SPAM = BITS(1) << 13; // set manually after first RadiusDamage, stops effect spam +const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_SOUND | HITTYPE_SPAM; // normal deaths begin -const int DT_FIRST = BIT(13); +const int DT_FIRST = BIT(14); #define DEATH_ISSPECIAL(t) (t >= DT_FIRST) #define DEATH_IS(t, dt) (DEATH_ISSPECIAL(t) && (REGISTRY_GET(Deathtypes, t - DT_FIRST)) == dt) diff --git a/qcsrc/common/weapons/weapon/hook.qc b/qcsrc/common/weapons/weapon/hook.qc index d8174d3bd..a5d2dc69e 100644 --- a/qcsrc/common/weapons/weapon/hook.qc +++ b/qcsrc/common/weapons/weapon/hook.qc @@ -13,7 +13,7 @@ void W_Hook_ExplodeThink(entity this) this.dmg_last = dmg_remaining_next; RadiusDamage(this, this.realowner, this.dmg * f, this.dmg_edge * f, this.dmg_radius, this.realowner, NULL, this.dmg_force * f, this.projectiledeathtype, this.weaponentity_fld, NULL); - this.projectiledeathtype |= HITTYPE_BOUNCE; + this.projectiledeathtype |= HITTYPE_SPAM; //RadiusDamage(this, NULL, this.dmg * f, this.dmg_edge * f, this.dmg_radius, NULL, NULL, this.dmg_force * f, this.projectiledeathtype, NULL); if(dt < this.dmg_duration) diff --git a/qcsrc/server/damage.qc b/qcsrc/server/damage.qc index d5a9a20c7..928f073e1 100644 --- a/qcsrc/server/damage.qc +++ b/qcsrc/server/damage.qc @@ -895,19 +895,18 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in total_damage_to_creatures = 0; - if(deathtype != (WEP_HOOK.m_id | HITTYPE_SECONDARY | HITTYPE_BOUNCE)) // only send gravity bomb damage once - if(!(deathtype & HITTYPE_SOUND)) // do not send radial sound damage (bandwidth hog) - { - force = inflictorvelocity; - if(force == '0 0 0') - force = '0 0 -1'; - else - force = normalize(force); - if(forceintensity >= 0) - Damage_DamageInfo(inflictororigin, coredamage, edgedamage, rad, forceintensity * force, deathtype, 0, attacker); - else - Damage_DamageInfo(inflictororigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, 0, attacker); - } + if(!(deathtype & HITTYPE_SOUND) && !(deathtype & HITTYPE_SPAM)) // do not send bandwidth-hogging radial spam attacks + { + force = inflictorvelocity; + if(force == '0 0 0') + force = '0 0 -1'; + else + force = normalize(force); + if(forceintensity >= 0) + Damage_DamageInfo(inflictororigin, coredamage, edgedamage, rad, forceintensity * force, deathtype, 0, attacker); + else + Damage_DamageInfo(inflictororigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, 0, attacker); + } stat_damagedone = 0; -- 2.39.2