X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fwarpzonelib%2Fcommon.qc;h=028724afba3a69e2c1a61f7991660b7eb7ea1e49;hb=ca144cbc90a2d0241f19dd3373f53bd31e8e7d6a;hp=0f1337d18fb614c447e8efbac9be7d5fc6645040;hpb=1b2f61baeeff5a7d004fafd3cfdd8269a0338a1e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/warpzonelib/common.qc b/qcsrc/warpzonelib/common.qc index 0f1337d18..028724afb 100644 --- a/qcsrc/warpzonelib/common.qc +++ b/qcsrc/warpzonelib/common.qc @@ -1,5 +1,14 @@ -float trace_dphitcontents; -.float dphitcontentsmask; +#include "common.qh" + +#if defined(CSQC) + #include "../dpdefs/csprogsdefs.qh" + #include "../server/t_items.qh" +#elif defined(MENUQC) +#elif defined(SVQC) + #include "../common/weapons/all.qh" + #include "../dpdefs/dpextensions.qh" + #include "../dpdefs/progsdefs.qh" +#endif void WarpZone_Accumulator_Clear(entity acc) { @@ -16,15 +25,23 @@ void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s) } void WarpZone_Accumulator_Add(entity acc, entity wz) { - vector t, st; - t = AnglesTransform_Multiply(wz.warpzone_transform, acc.warpzone_transform); - st = AnglesTransform_Multiply_GetPostShift(wz.warpzone_transform, wz.warpzone_shift, acc.warpzone_transform, acc.warpzone_shift); - acc.warpzone_transform = t; - acc.warpzone_shift = st; + WarpZone_Accumulator_AddTransform(acc, wz.warpzone_transform, wz.warpzone_shift); +} +void WarpZone_Accumulator_AddInverseTransform(entity acc, vector t, vector s) +{ + vector tt, ss; + tt = AnglesTransform_Invert(t); + ss = AnglesTransform_PrePostShift_GetPostShift(s, tt, '0 0 0'); + WarpZone_Accumulator_AddTransform(acc, tt, ss); + // yes, this probably can be done simpler... but this way is "obvious" :) +} +void WarpZone_Accumulator_AddInverse(entity acc, entity wz) +{ + WarpZone_Accumulator_AddInverseTransform(acc, wz.warpzone_transform, wz.warpzone_shift); } .vector(vector, vector) camera_transform; -var float autocvar_cl_warpzone_usetrace = 1; +float autocvar_cl_warpzone_usetrace = 1; vector WarpZone_camera_transform(vector org, vector ang) { vector vf, vr, vu; @@ -105,7 +122,7 @@ float WarpZoneLib_BoxTouchesBrush_Recurse() return 0; } #endif - if not(trace_ent) + if (!trace_ent) return 0; if (trace_ent == WarpZoneLib_BoxTouchesBrush_ent) return 1; @@ -191,6 +208,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 +224,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 +247,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); @@ -254,7 +272,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, sol = -1; frac = 0; i = 16; - for(;;) + for (;;) { if(--i < 1) { @@ -262,7 +280,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 +291,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 +320,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; @@ -333,14 +351,16 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo o0 = e.origin; v0 = e.velocity; + g = cvar("sv_gravity") * e.gravity; + 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); @@ -374,9 +394,8 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo e.velocity = WarpZone_TransformVelocity(wz, e.velocity); } WarpZone_MakeAllSolid(); - g = cvar("sv_gravity") * e.gravity; i = 16; - for(;;) + for (;;) { if(--i < 1) { @@ -384,7 +403,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 +434,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; @@ -459,12 +478,12 @@ void WarpZone_TrailParticles_WithMultiplier_trace_callback(vector from, vector e boxparticles(WarpZone_TrailParticles_trace_callback_eff, WarpZone_TrailParticles_trace_callback_own, from, endpos, WarpZone_TrailParticles_trace_callback_own.velocity, WarpZone_TrailParticles_trace_callback_own.velocity, WarpZone_TrailParticles_trace_callback_f, WarpZone_TrailParticles_trace_callback_flags); } -void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, float boxflags) +void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, int boxflags) { WarpZone_TrailParticles_trace_callback_own = own; WarpZone_TrailParticles_trace_callback_eff = eff; WarpZone_TrailParticles_trace_callback_f = f; - WarpZone_TrailParticles_trace_callback_flags = boxflags; + WarpZone_TrailParticles_trace_callback_flags = boxflags | PARTICLES_DRAWASTRAIL; WarpZone_TraceBox_ThroughZone(org, '0 0 0', '0 0 0', end, MOVE_NOMONSTERS, world, world, WarpZone_TrailParticles_WithMultiplier_trace_callback); } #endif @@ -498,18 +517,18 @@ vector WarpZone_TransformVAngles(entity wz, vector ang) { #ifdef KEEP_ROLL float roll; - roll = ang_z; - ang_z = 0; + roll = ang.z; + ang.z = 0; #endif ang = AnglesTransform_ApplyToVAngles(wz.warpzone_transform, ang); #ifdef KEEP_ROLL - ang = AnglesTransform_Normalize(ang, TRUE); + ang = AnglesTransform_Normalize(ang, true); ang = AnglesTransform_CancelRoll(ang); - ang_z = roll; + ang.z = roll; #else - ang = AnglesTransform_Normalize(ang, FALSE); + ang = AnglesTransform_Normalize(ang, false); #endif return ang; @@ -534,23 +553,23 @@ vector WarpZone_UnTransformVAngles(entity wz, vector ang) { float roll; - roll = ang_z; - ang_z = 0; + roll = ang.z; + ang.z = 0; ang = AnglesTransform_ApplyToVAngles(AnglesTransform_Invert(wz.warpzone_transform), ang); - ang = AnglesTransform_Normalize(ang, TRUE); + ang = AnglesTransform_Normalize(ang, true); ang = AnglesTransform_CancelRoll(ang); - ang_z = roll; + ang.z = roll; return ang; } vector WarpZoneLib_NearestPointOnBox(vector mi, vector ma, vector org) { vector nearest; - nearest_x = bound(mi_x, org_x, ma_x); - nearest_y = bound(mi_y, org_y, ma_y); - nearest_z = bound(mi_z, org_z, ma_z); + nearest.x = bound(mi.x, org.x, ma.x); + nearest.y = bound(mi.y, org.y, ma.y); + nearest.z = bound(mi.z, org.z, ma.z); return nearest; } @@ -641,7 +660,7 @@ void WarpZone_RefSys_GC() if(self.owner.WarpZone_refsys != self) remove(self); } -void WarpZone_RefSys_Add(entity me, entity wz) +void WarpZone_RefSys_CheckCreate(entity me) { if(me.WarpZone_refsys.owner != me) { @@ -652,29 +671,48 @@ void WarpZone_RefSys_Add(entity me, entity wz) me.WarpZone_refsys.nextthink = time + 1; WarpZone_Accumulator_Clear(me.WarpZone_refsys); } - if(wz) - WarpZone_Accumulator_Add(me.WarpZone_refsys, wz); +} +void WarpZone_RefSys_Clear(entity me) +{ + if(me.WarpZone_refsys) + { + remove(me.WarpZone_refsys); + me.WarpZone_refsys = world; + } +} +void WarpZone_RefSys_AddTransform(entity me, vector t, vector s) +{ + if(t != '0 0 0' || s != '0 0 0') + { + WarpZone_RefSys_CheckCreate(me); + WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s); + } +} +void WarpZone_RefSys_Add(entity me, entity wz) +{ + WarpZone_RefSys_AddTransform(me, wz.warpzone_transform, wz.warpzone_shift); +} +void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s) +{ + if(t != '0 0 0' || s != '0 0 0') + { + WarpZone_RefSys_CheckCreate(me); + WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, t, s); + } +} +void WarpZone_RefSys_AddInverse(entity me, entity wz) +{ + WarpZone_RefSys_AddInverseTransform(me, wz.warpzone_transform, wz.warpzone_shift); } .vector WarpZone_refsys_incremental_shift; .vector WarpZone_refsys_incremental_transform; void WarpZone_RefSys_AddIncrementally(entity me, entity ref) { - vector t, s; + //vector t, s; if(me.WarpZone_refsys_incremental_transform == ref.WarpZone_refsys.warpzone_transform) if(me.WarpZone_refsys_incremental_shift == ref.WarpZone_refsys.warpzone_shift) return; - if(me.WarpZone_refsys.owner != me) - { - me.WarpZone_refsys = spawn(); - me.WarpZone_refsys.classname = "warpzone_refsys"; - me.WarpZone_refsys.owner = me; - me.WarpZone_refsys.think = WarpZone_RefSys_GC; - me.WarpZone_refsys.nextthink = time + 1; - WarpZone_Accumulator_Clear(me.WarpZone_refsys); - } - t = AnglesTransform_Invert(me.WarpZone_refsys_incremental_transform); - s = AnglesTransform_PrePostShift_GetPostShift(me.WarpZone_refsys_incremental_shift, t, '0 0 0'); - WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s); + WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, me.WarpZone_refsys_incremental_transform, me.WarpZone_refsys_incremental_shift); WarpZone_Accumulator_Add(me.WarpZone_refsys, ref.WarpZone_refsys); me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift; me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform; @@ -716,19 +754,21 @@ vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang) ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang); return ang; } +void WarpZone_RefSys_Copy(entity me, entity from) +{ + if(from.WarpZone_refsys) + { + WarpZone_RefSys_CheckCreate(me); + me.WarpZone_refsys.warpzone_shift = from.WarpZone_refsys.warpzone_shift; + me.WarpZone_refsys.warpzone_transform = from.WarpZone_refsys.warpzone_transform; + } + else + WarpZone_RefSys_Clear(me); +} entity WarpZone_RefSys_SpawnSameRefSys(entity me) { entity e; e = spawn(); - if(me.WarpZone_refsys) - { - e.WarpZone_refsys = spawn(); - e.WarpZone_refsys.classname = "warpzone_refsys"; - e.WarpZone_refsys.owner = e; - e.WarpZone_refsys.think = WarpZone_RefSys_GC; - e.WarpZone_refsys.nextthink = time + 1; - e.WarpZone_refsys.warpzone_shift = me.WarpZone_refsys.warpzone_shift; - e.WarpZone_refsys.warpzone_transform = me.WarpZone_refsys.warpzone_transform; - } + WarpZone_RefSys_Copy(e, me); return e; }