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);
void W_Electro_ExplodeComboThink(entity this)
{
- if(time - this.teleport_time > this.dmg_duration)
+ if(time >= this.ltime)
{
delete(this);
return;
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)
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
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;
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)
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;