From: Rudolf Polzer Date: Wed, 19 Oct 2011 20:51:24 +0000 (+0200) Subject: simplify trace owner logic for ballistic bullets, make more consistent with projectiles X-Git-Tag: xonotic-v0.6.0~40^2~25^2~1 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e4ab013e63bda7a9bbc84cb8dd3e8e0e4750e46e;p=xonotic%2Fxonotic-data.pk3dir.git simplify trace owner logic for ballistic bullets, make more consistent with projectiles --- diff --git a/qcsrc/server/w_common.qc b/qcsrc/server/w_common.qc index 08c56121b..a61ec1067 100644 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@ -353,6 +353,7 @@ void fireBallisticBullet_trace_callback(vector start, vector hit, vector end) { if(vlen(trace_endpos - fireBallisticBullet_trace_callback_ent.origin) > 16) zcurveparticles_from_tracetoss(fireBallisticBullet_trace_callback_eff, fireBallisticBullet_trace_callback_ent.origin, trace_endpos, fireBallisticBullet_trace_callback_ent.velocity); + WarpZone_trace_forent = world; } void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant) @@ -438,15 +439,6 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f trace_fraction = 0; fireBallisticBullet_trace_callback_ent = self; fireBallisticBullet_trace_callback_eff = eff; - // FIXME can we somehow do this with just ONE trace? - WarpZone_TraceToss(self, self.owner); - if(self.owner && WarpZone_trace_firstzone) - { - self.owner = world; - self.velocity = v0; - self.gravity = g0; - continue; - } WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback); self.velocity = v0; self.gravity = g0; diff --git a/qcsrc/warpzonelib/common.qc b/qcsrc/warpzonelib/common.qc index 0f1337d18..f09f25bdc 100644 --- a/qcsrc/warpzonelib/common.qc +++ b/qcsrc/warpzonelib/common.qc @@ -191,6 +191,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, entity wz; vector vf, vr, vu; + WarpZone_trace_forent = forent; WarpZone_trace_firstzone = world; WarpZone_trace_lastzone = world; WarpZone_Trace_InitTransform(); @@ -206,7 +207,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, } else { - tracebox(org, mi, ma, end, nomonsters, forent); + tracebox(org, mi, ma, end, nomonsters, WarpZone_trace_forent); if(cb) cb(org, trace_endpos, end); return; @@ -229,8 +230,8 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, nomonsters_adjusted = nomonsters; break; } - if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID)))) - BITSET_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID); + if((contentshack = (WarpZone_trace_forent.dphitcontentsmask && !(WarpZone_trace_forent.dphitcontentsmask & DPCONTENTS_SOLID)))) + BITSET_ASSIGN(WarpZone_trace_forent.dphitcontentsmask, DPCONTENTS_SOLID); // if starting in warpzone, first transform wz = WarpZone_Find(org + mi, org + ma); @@ -262,7 +263,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, trace_ent = world; break; } - tracebox(org, mi, ma, end, nomonsters_adjusted, forent); + tracebox(org, mi, ma, end, nomonsters_adjusted, WarpZone_trace_forent); if(cb) cb(org, trace_endpos, end); if(sol < 0) @@ -273,7 +274,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, break; if(trace_ent.classname != "trigger_warpzone") { - if((nomonsters == MOVE_NOTHING) || ((nomonsters == MOVE_WORLDONLY) && trace_ent) || (contentshack && (trace_dphitcontents & forent.dphitcontentsmask) == DPCONTENTS_SOLID)) + if((nomonsters == MOVE_NOTHING) || ((nomonsters == MOVE_WORLDONLY) && trace_ent) || (contentshack && (trace_dphitcontents & WarpZone_trace_forent.dphitcontentsmask) == DPCONTENTS_SOLID)) { // continue the trace, ignoring this hit (we only care for warpzones) org = trace_endpos + normalize(end - org); @@ -302,13 +303,13 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, end = WarpZone_TransformOrigin(wz, end); // we got warped, so let's step back a bit - tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, forent); + tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, WarpZone_trace_forent); org = trace_endpos; } WarpZone_MakeAllOther(); :fail if(contentshack) - BITCLR_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID); + BITCLR_ASSIGN(WarpZone_trace_forent.dphitcontentsmask, DPCONTENTS_SOLID); trace_startsolid = sol; v_forward = vf; v_right = vr; @@ -334,13 +335,14 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo o0 = e.origin; v0 = e.velocity; + WarpZone_trace_forent = forent; WarpZone_trace_firstzone = world; WarpZone_trace_lastzone = world; WarpZone_Trace_InitTransform(); WarpZone_tracetoss_time = 0; if(!warpzone_warpzones_exist) { - tracetoss(e, forent); + tracetoss(e, WarpZone_trace_forent); if(cb) cb(e.origin, trace_endpos, trace_endpos); dt = vlen(e.origin - o0) / vlen(e.velocity); @@ -384,7 +386,7 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo trace_ent = world; break; } - tracetoss(e, forent); + tracetoss(e, WarpZone_trace_forent); if(cb) cb(e.origin, trace_endpos, trace_endpos); dt = vlen(trace_endpos - e.origin) / vlen(e.velocity); @@ -415,7 +417,7 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo // we got warped, so let's step back a bit e.velocity = -e.velocity; - tracetoss(e, forent); + tracetoss(e, WarpZone_trace_forent); dt = vlen(trace_endpos - e.origin) / vlen(e.velocity); WarpZone_tracetoss_time -= dt; e.origin = trace_endpos; diff --git a/qcsrc/warpzonelib/common.qh b/qcsrc/warpzonelib/common.qh index 1dc12b8cf..c2f36bea8 100644 --- a/qcsrc/warpzonelib/common.qh +++ b/qcsrc/warpzonelib/common.qh @@ -25,6 +25,7 @@ void WarpZone_MakeAllSolid(); void WarpZone_MakeAllOther(); #define MOVE_NOTHING -1 +entity WarpZone_trace_forent; // temp, callback is allowed to change it typedef void(vector start, vector hit, vector end) WarpZone_trace_callback_t; // called on every elementary trace const var WarpZone_trace_callback_t WarpZone_trace_callback_t_null; entity WarpZone_trace_transform; // transform accumulator during a trace