From 107267c5681a3af03c9e6e8150891e9656a05b91 Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 12 Sep 2024 18:53:25 +1000 Subject: [PATCH] Refactor HITTYPE_TERTIARY into HITTYPE_SPAM and use it for hook and electro combos --- qcsrc/common/deathtypes/all.qh | 13 ++++++------- qcsrc/common/weapons/weapon/electro.qc | 16 ++++++---------- qcsrc/common/weapons/weapon/electro.qh | 5 ----- qcsrc/common/weapons/weapon/hook.qc | 2 +- qcsrc/server/damage.qc | 25 ++++++++++++------------- 5 files changed, 25 insertions(+), 36 deletions(-) diff --git a/qcsrc/common/deathtypes/all.qh b/qcsrc/common/deathtypes/all.qh index 48c94ad84..f83a2a5c8 100644 --- a/qcsrc/common/deathtypes/all.qh +++ b/qcsrc/common/deathtypes/all.qh @@ -23,13 +23,12 @@ 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 HITTYPE_TERTIARY = BITS(1) << 13; -const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_SOUND | HITTYPE_TERTIARY; +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(14); diff --git a/qcsrc/common/weapons/weapon/electro.qc b/qcsrc/common/weapons/weapon/electro.qc index 38c9c85f8..ee8692258 100644 --- a/qcsrc/common/weapons/weapon/electro.qc +++ b/qcsrc/common/weapons/weapon/electro.qc @@ -53,7 +53,7 @@ void W_Electro_TriggerCombo(vector org, float rad, entity own) void W_Electro_ExplodeComboThink(entity this) { - if(time - this.teleport_time > this.dmg_duration) + if(time >= this.ltime) { delete(this); return; @@ -61,11 +61,11 @@ void W_Electro_ExplodeComboThink(entity this) this.nextthink = time; - float damage = this.dmg * PHYS_INPUT_TIMELENGTH; - float edgedamage = this.dmg_edge * PHYS_INPUT_TIMELENGTH; + float damage = WEP_CVAR(WEP_ELECTRO, combo_damage) * PHYS_INPUT_TIMELENGTH; + float edgedamage = WEP_CVAR(WEP_ELECTRO, combo_edgedamage) * PHYS_INPUT_TIMELENGTH; - RadiusDamage(this, this.realowner, damage, edgedamage, this.dmg_radius, NULL, NULL, 0, this.projectiledeathtype, this.weaponentity_fld, NULL); - this.projectiledeathtype |= HITTYPE_TERTIARY; // ensure it doesn't spam its effect + RadiusDamage(this, this.realowner, damage, edgedamage, WEP_CVAR(WEP_ELECTRO, combo_radius), NULL, NULL, 0, this.projectiledeathtype, this.weaponentity_fld, NULL); + this.projectiledeathtype |= HITTYPE_SPAM; // ensure it doesn't spam its effect } void W_Electro_ExplodeCombo(entity this) @@ -85,11 +85,7 @@ void W_Electro_ExplodeCombo(entity this) setthink(this, W_Electro_ExplodeComboThink); this.nextthink = time; - this.dmg = WEP_CVAR(WEP_ELECTRO, combo_damage); - this.dmg_edge = WEP_CVAR(WEP_ELECTRO, combo_edgedamage); - this.dmg_radius = WEP_CVAR(WEP_ELECTRO, combo_radius); - this.dmg_duration = WEP_CVAR(WEP_ELECTRO, combo_duration); - this.teleport_time = time; + this.ltime = time + WEP_CVAR(WEP_ELECTRO, combo_duration); set_movetype(this, MOVETYPE_NONE); // fire the first damage tick immediately diff --git a/qcsrc/common/weapons/weapon/electro.qh b/qcsrc/common/weapons/weapon/electro.qh index c09dcf099..e7df4e039 100644 --- a/qcsrc/common/weapons/weapon/electro.qh +++ b/qcsrc/common/weapons/weapon/electro.qh @@ -79,11 +79,6 @@ REGISTER_WEAPON(ELECTRO, NEW(Electro)); SPAWNFUNC_WEAPON(weapon_electro, WEP_ELECTRO) #ifdef SVQC -.float dmg; -.float dmg_edge; -.float dmg_radius; -.float dmg_duration; - IntrusiveList LimitedElectroBallRubbleList; .float electro_count; .float electro_secondarytime; diff --git a/qcsrc/common/weapons/weapon/hook.qc b/qcsrc/common/weapons/weapon/hook.qc index e383760d3..22338ef47 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 ba639d9ec..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) && deathtype != (WEP_ELECTRO.m_id | HITTYPE_BOUNCE | HITTYPE_TERTIARY)) // only send damage over time bombs 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