From a8f331ded81aa5917f2dee617050ff90a6a6abe4 Mon Sep 17 00:00:00 2001 From: terencehill Date: Fri, 18 Mar 2022 22:43:01 +0100 Subject: [PATCH] Refactor edgedamage calculation to be clearer and fix a bug where projectiles with damage radius 0 could potentially cause damage even if player is not hit --- qcsrc/server/damage.qc | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/qcsrc/server/damage.qc b/qcsrc/server/damage.qc index ce2dd04b3..d0b3a288f 100644 --- a/qcsrc/server/damage.qc +++ b/qcsrc/server/damage.qc @@ -881,6 +881,8 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in return 0; } + if (rad < 0) rad = 0; + RadiusDamage_running = 1; tfloordmg = autocvar_g_throughfloor_damage; @@ -912,32 +914,25 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in if (((cantbe != targ) && !mustbe) || (mustbe == targ)) if (targ.takedamage) { - vector nearest; - vector diff; - float power; - // measure distance from nearest point on target (not origin) // to nearest point on inflictor (not origin) - nearest = targ.WarpZone_findradius_nearest; + vector nearest = targ.WarpZone_findradius_nearest; vector inflictornearest = NearestPointOnBoundingBox( inflictororigin - (inflictor.maxs - inflictor.mins) * 0.5, inflictororigin + (inflictor.maxs - inflictor.mins) * 0.5, nearest); - diff = inflictornearest - nearest; + vector diff = inflictornearest - nearest; // round up a little on the damage to ensure full damage on impacts // and turn the distance into a fraction of the radius - power = 1 - ((vlen (diff) - bound(MIN_DAMAGEEXTRARADIUS, targ.damageextraradius, MAX_DAMAGEEXTRARADIUS)) / rad); - //bprint(" "); - //bprint(ftos(power)); - //if (targ == attacker) - // print(ftos(power), "\n"); - if (power > 0) + float dist = max(0, vlen(diff) - bound(MIN_DAMAGEEXTRARADIUS, targ.damageextraradius, MAX_DAMAGEEXTRARADIUS)); + if (dist <= rad) { - float finaldmg; - if (power > 1) - power = 1; - finaldmg = coredamage * power + edgedamage * (1 - power); + float power = 1; + if (rad > 0) + power -= (dist / rad); + // at this point power can't be < 0 or > 1 + float finaldmg = coredamage * power + edgedamage * (1 - power); if (finaldmg > 0) { float a; -- 2.39.2