From: terencehill Date: Fri, 18 Mar 2022 21:43:01 +0000 (+0100) Subject: Refactor edgedamage calculation to be clearer and fix a bug where projectiles with... X-Git-Tag: xonotic-v0.8.5~145^2~3 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=a8f331de;p=xonotic%2Fxonotic-data.pk3dir.git 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 --- 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;