X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Ftracing.qc;h=686634c7acfdadae38a1a19e29d521643b78ebe5;hb=6062327f5a69ea3c2fe236f0d1304140f6b3a43f;hp=f4de0e1bf15996ac12aed1a31e64652493d96822;hpb=6ae488fa94396ad9ffa0dc3dbfbedb54c8b7983a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index f4de0e1bf..686634c7a 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -1,25 +1,22 @@ #include "tracing.qh" -#include - -#include "accuracy.qh" -#include "common.qh" -#include "hitplot.qh" -#include "weaponsystem.qh" - -#include "../damage.qh" -#include -#include "../antilag.qh" - #include +#include +#include #include +#include #include - #include #include -#include - #include +#include +#include +#include +#include +#include +#include +#include +#include // this function calculates w_shotorg and w_shotdir based on the weapon model // offset, trueaim and antilag, and won't put w_shotorg inside a wall. @@ -75,10 +72,18 @@ 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'); - // TODO this is broken - see 637056bea7bf7f5c9c0fc6113e94731a2767476 for an attempted fix - // which fixes issue #1957 but causes #2129 vector dv = right * -vecs.y + up * vecs.z; - w_shotorg = ent.origin + ent.view_ofs + dv; + w_shotorg = ent.origin + ent.view_ofs; + if(antilag) + { + if(CS(ent).antilag_debug) + tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, CS(ent).antilag_debug); + else + tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent)); + } + else + tracebox(w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent); + w_shotorg = trace_endpos; // now move the shotorg forward as much as requested if possible if(antilag) @@ -102,7 +107,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect //vector prevend = w_shotend; if (antilag) - if (!CS(ent).cvar_cl_noantilag) + if (!CS_CVAR(ent).cvar_cl_noantilag) { if (autocvar_g_antilag == 1) // switch to "ghost" if not hitting original { @@ -196,7 +201,7 @@ void W_SetupProjVelocity_Explicit(entity proj, vector dir, vector upDir, float p mspercallsum -= gettime(GETTIME_HIRES); #endif - dir = W_CalculateSpread(dir, spread, g_weaponspreadfactor, autocvar_g_projectiles_spread_style); + dir = W_CalculateSpread(dir, spread, autocvar_g_weaponspreadfactor, autocvar_g_projectiles_spread_style); #if 0 mspercallsum += gettime(GETTIME_HIRES); @@ -297,7 +302,7 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector vector beampos = start + dir * bound(0, (it.origin - start) * dir, length); if(!pseudoprojectile) - pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume + pseudoprojectile = new(pseudoprojectile); // we need this so the sound uses the "entchannel4" volume msg_entity = it; // we want this to be very loud when close but fall off quickly -> using max base volume and high attenuation @@ -499,3 +504,44 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo { fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, headshot_multiplier, force, dtype, tracer_effect, true); } + +void crosshair_trace(entity pl) +{ + traceline_antilag(pl, CS(pl).cursor_trace_start, CS(pl).cursor_trace_start + normalize(CS(pl).cursor_trace_endpos - CS(pl).cursor_trace_start) * max_shot_distance, MOVE_NORMAL, pl, ANTILAG_LATENCY(pl)); +} + +void crosshair_trace_plusvisibletriggers(entity pl) +{ + crosshair_trace_plusvisibletriggers__is_wz(pl, false); +} + +void WarpZone_crosshair_trace_plusvisibletriggers(entity pl) +{ + crosshair_trace_plusvisibletriggers__is_wz(pl, true); +} + +void crosshair_trace_plusvisibletriggers__is_wz(entity pl, bool is_wz) +{ + FOREACH_ENTITY_FLOAT(solid, SOLID_TRIGGER, + { + if(it.model != "") + { + it.solid = SOLID_BSP; + IL_PUSH(g_ctrace_changed, it); + } + }); + + if (is_wz) + WarpZone_crosshair_trace(pl); + else + crosshair_trace(pl); + + IL_EACH(g_ctrace_changed, true, { it.solid = SOLID_TRIGGER; }); + + IL_CLEAR(g_ctrace_changed); +} + +void WarpZone_crosshair_trace(entity pl) +{ + WarpZone_traceline_antilag(pl, CS(pl).cursor_trace_start, CS(pl).cursor_trace_start + normalize(CS(pl).cursor_trace_endpos - CS(pl).cursor_trace_start) * max_shot_distance, MOVE_NORMAL, pl, ANTILAG_LATENCY(pl)); +}