X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Ftracing.qc;h=fdee0d6fe93acf9496f4a20532d314cead002fe9;hp=9fda61202cecaf34a8116dfec1c34e28e87e7815;hb=546842f7e5a63b11a9b862dbf1709318bb97689b;hpb=8dc66863c53931f676b3ba6973f010e87b19e643 diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index 9fda61202c..fdee0d6fe9 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -26,6 +26,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vector s_forward, vector mi, vector ma, float antilag, float recoil, Sound snd, float chan, float maxdamage, float range, int deathtype) { TC(Sound, snd); + float nudge = 1; // added to traceline target and subtracted from result TOOD(divVerent): do we still need this? Doesn't the engine do this now for us? float oldsolid = ent.dphitcontentsmask; Weapon wep = DEATH_WEAPONOF(deathtype); if(!IS_CLIENT(ent)) @@ -73,20 +74,22 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect vector md = ent.(weaponentity).movedir; vector vecs = ((md.x > 0) ? md : '0 0 0'); - vector dv = v_forward * vecs.x + v_right * -vecs.y + v_up * vecs.z; - w_shotorg = ent.origin + ent.view_ofs; + // TODO this is broken - see 637056bea7bf7f5c9c0fc6113e94731a2767476 for an attempted fix + // which fixes issue #1957 but causes #2129 + vector dv = v_right * -vecs.y + v_up * vecs.z; + w_shotorg = ent.origin + ent.view_ofs + dv; // now move the shotorg forward as much as requested if possible if(antilag) { if(CS(ent).antilag_debug) - tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, CS(ent).antilag_debug); + tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug); else - tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent)); + tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent)); } else - tracebox(w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent); - w_shotorg = trace_endpos; + tracebox(w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent); + w_shotorg = trace_endpos - v_forward * nudge; // calculate the shotdir from the chosen shotorg if(W_DualWielding(ent)) w_shotdir = s_forward; @@ -151,7 +154,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect } // nudge w_shotend so a trace to w_shotend hits - w_shotend = w_shotend + normalize(w_shotend - w_shotorg); + w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge; //if(w_shotend != prevend) { printf("SERVER: shotEND differs: %s - %s\n", vtos(w_shotend), vtos(prevend)); } //if(w_shotorg != prevorg) { printf("SERVER: shotORG differs: %s - %s\n", vtos(w_shotorg), vtos(prevorg)); } //if(w_shotdir != prevdir) { printf("SERVER: shotDIR differs: %s - %s\n", vtos(w_shotdir), vtos(prevdir)); }