X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fdamage.qc;h=d5a9a20c760d352a7d6631ed2530eba9cf2faad4;hb=fbfab5ade81ed4b14b57371c26a4ece52b4c79af;hp=429d3e262568b56b77cab4cd76d86c73ea8de5d2;hpb=ee6a8d98fd285c5625e938984daa6fe2fd949d96;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/damage.qc b/qcsrc/server/damage.qc index 429d3e262..d5a9a20c7 100644 --- a/qcsrc/server/damage.qc +++ b/qcsrc/server/damage.qc @@ -245,8 +245,10 @@ void Obituary(entity attacker, entity inflictor, entity targ, int deathtype, .en if (MUTATOR_CALLHOOK(ClientObituary, inflictor, attacker, targ, deathtype, attacker.(weaponentity))) { CS(targ).killcount = 0; return; } notif_anonymous = M_ARGV(5, bool); + // TODO: Replace "???" with a translatable "Anonymous player" string + // https://gitlab.com/xonotic/xonotic-data.pk3dir/-/issues/2839 if(notif_anonymous) - attacker_name = "Anonymous player"; + attacker_name = "???"; #ifdef NOTIFICATIONS_DEBUG Debug_Notification( @@ -917,13 +919,17 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in if (((cantbe != targ) && !mustbe) || (mustbe == targ)) if (targ.takedamage) { - // measure distance from nearest point on target (not origin) - // to nearest point on inflictor (not origin) + // calculate distance from nearest point on target to nearest point on inflictor + // instead of origin to ensure full damage on impacts + vector nearest = targ.WarpZone_findradius_nearest; + + // optimize code by getting inflictororigin_wz from WarpZone_FindRadius calculations instead of + //vector inflictororigin_wz = WarpZone_TransformOrigin(targ, inflictororigin); + + vector inflictororigin_wz = targ.WarpZone_findradius_nearest + targ.WarpZone_findradius_dist; vector inflictornearest = NearestPointOnBoundingBox( - inflictororigin - (inflictor.maxs - inflictor.mins) * 0.5, - inflictororigin + (inflictor.maxs - inflictor.mins) * 0.5, - nearest); + inflictororigin_wz + inflictor.mins, inflictororigin_wz + inflictor.maxs, nearest); vector diff = inflictornearest - nearest; // round up a little on the damage to ensure full damage on impacts @@ -939,15 +945,59 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in float a; float c; vector hitloc; - vector myblastorigin; - vector center; - - myblastorigin = WarpZone_TransformOrigin(targ, inflictororigin); // if it's a player, use the view origin as reference - center = CENTER_OR_VIEWOFS(targ); + vector center = CENTER_OR_VIEWOFS(targ); + + if (autocvar_g_player_damageplayercenter) + { + if (targ != attacker) + { + // always use target's bbox centerpoint + center = targ.origin + ((targ.mins + targ.maxs) * 0.5); + } + else // targ == attacker + { + #if 0 + // code stolen from W_SetupShot_Dir_ProjectileSize_Range() + vector md = targ.(weaponentity).movedir; + vector dv = v_right * -md.y + v_up * md.z; + vector mi = '0 0 0', ma = '0 0 0'; + + if(IS_CLIENT(targ)) // no antilag for non-clients! + { + if(CS(targ).antilag_debug) + tracebox_antilag(targ, center, mi, ma, center + dv, MOVE_NORMAL, targ, CS(targ).antilag_debug); + else + tracebox_antilag(targ, center, mi, ma, center + dv, MOVE_NORMAL, targ, ANTILAG_LATENCY(targ)); + } + else + tracebox(center, mi, ma, center + dv, MOVE_NORMAL, targ); + + center.z = trace_endpos.z; + #else + // very cheap way but it skips move into solid checks which is fine most of the time for now AFAIK + // this should only really be an issue with some rare edge cases where + // shot origin was prevented from going into a ceiling but it still explodes at the ceiling + // shot origin wasn't raised as high as possible and the shooter gets upwards knockback + // TL;DR: no bugs if vertical shot origin is always within player bbox + center.z = center.z + targ.(weaponentity).movedir.z; + #endif + } + } - force = normalize(center - myblastorigin); + /* debug prints + print(sprintf("origin vec %v\n", targ.origin)); + print(sprintf("movedir vec %v\n", targ.(weaponentity).movedir)); + print(sprintf("old def vec %v\n", CENTER_OR_VIEWOFS(targ))); + print(sprintf("origin+vofs %v\n", targ.origin + targ.view_ofs)); + print(sprintf("bbox center %v\n", (targ.origin + ((targ.mins + targ.maxs) * 0.5)))); + print(sprintf("center vec %v\n", center)); + print(sprintf("shotorg vec %v\n", w_shotorg)); + print("\n"); + */ + + force = normalize(center - inflictororigin_wz); force = force * (finaldmg / max(coredamage, edgedamage)) * forceintensity; hitloc = nearest;