From 8ae02e7cf347e9ec4d211a4d9e76c15257a15266 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 28 Feb 2010 19:43:22 +0000 Subject: [PATCH] nex also supports warpzones now git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8699 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/particles.qc | 4 +- data/qcsrc/server/w_nex.qc | 6 +- data/qcsrc/warpzonelib/client.qc | 10 ++- data/qcsrc/warpzonelib/common.qc | 130 +++++++++++++++++++++---------- data/qcsrc/warpzonelib/common.qh | 11 ++- data/qcsrc/warpzonelib/server.qc | 67 ++-------------- data/qcsrc/warpzonelib/server.qh | 5 -- 7 files changed, 115 insertions(+), 118 deletions(-) diff --git a/data/qcsrc/client/particles.qc b/data/qcsrc/client/particles.qc index 1f1a44611..e0bbeb81b 100644 --- a/data/qcsrc/client/particles.qc +++ b/data/qcsrc/client/particles.qc @@ -293,7 +293,7 @@ void Net_ReadNexgunBeamParticle() //draw either the old v2.3 beam or the new beam if (cvar("cl_particles_oldnexbeam") && (getstati(STAT_ALLOW_OLDNEXBEAM) || isdemo())) - trailparticles(world, particleeffectnum("TE_TEI_G3"), shotorg, endpos); + WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), shotorg, endpos); else - trailparticles(world, particleeffectnum("nex_beam"), shotorg, endpos); + WarpZone_TrailParticles(world, particleeffectnum("nex_beam"), shotorg, endpos); } diff --git a/data/qcsrc/server/w_nex.qc b/data/qcsrc/server/w_nex.qc index eff82c313..abb4b2bf3 100644 --- a/data/qcsrc/server/w_nex.qc +++ b/data/qcsrc/server/w_nex.qc @@ -8,9 +8,9 @@ void SendCSQCNexBeamParticle() { WriteCoord(MSG_BROADCAST, w_shotorg_x); WriteCoord(MSG_BROADCAST, w_shotorg_y); WriteCoord(MSG_BROADCAST, w_shotorg_z); - WriteCoord(MSG_BROADCAST, trace_endpos_x); - WriteCoord(MSG_BROADCAST, trace_endpos_y); - WriteCoord(MSG_BROADCAST, trace_endpos_z); + WriteCoord(MSG_BROADCAST, WarpZone_trace_endpos_x); + WriteCoord(MSG_BROADCAST, WarpZone_trace_endpos_y); + WriteCoord(MSG_BROADCAST, WarpZone_trace_endpos_z); } void W_Nex_Attack (void) diff --git a/data/qcsrc/warpzonelib/client.qc b/data/qcsrc/warpzonelib/client.qc index 987f81f59..0a7f1ee6c 100644 --- a/data/qcsrc/warpzonelib/client.qc +++ b/data/qcsrc/warpzonelib/client.qc @@ -1,4 +1,3 @@ -.vector warpzone_transform; void WarpZone_Read(float isnew) { if not(self.enemy) @@ -31,6 +30,10 @@ void WarpZone_Read(float isnew) self.avelocity_z = ReadCoord(); self.avelocity = AnglesTransform_TurnDirectionFR(self.avelocity); + + // for common code + self.warpzone_origin = self.enemy.oldorigin; + self.enemy.warpzone_origin = self.oldorigin; self.warpzone_transform = AnglesTransform_Divide(self.avelocity, self.enemy.avelocity); self.flags = FL_CAMERA; @@ -57,9 +60,8 @@ void WarpZone_FixView() if(e) { warpzone_saved = 1; - warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin; - warpzone_fixview_angles = WarpZone_TransformVAngles(e.warpzone_transform, warpzone_fixview_angles); - break; + warpzone_fixview_origin = WarpZone_TransformOrigin(e, warpzone_fixview_origin); + warpzone_fixview_angles = WarpZone_TransformVAngles(e, warpzone_fixview_angles); } // if we are near any warpzone planes - MOVE AWAY (work around nearclip) diff --git a/data/qcsrc/warpzonelib/common.qc b/data/qcsrc/warpzonelib/common.qc index e5f1be1f7..1c6ae996c 100644 --- a/data/qcsrc/warpzonelib/common.qc +++ b/data/qcsrc/warpzonelib/common.qc @@ -1,44 +1,6 @@ -vector WarpZone_TransformVAngles(vector t, vector ang) -{ - float roll; - - roll = ang_z; - ang_z = 0; - - /* - vector vf, vr, vu; - print(vtos(ang), " input\n"); - makevectors(ang); - vf = v_forward; - vr = v_right; - vu = v_up; - print(vtos(vf), " -> ", vtos(AnglesTransform_Apply(t, vf)), "\n"); - print(vtos(vr), " -> ", vtos(AnglesTransform_Apply(t, vr)), "\n"); - print(vtos(vu), " -> ", vtos(AnglesTransform_Apply(t, vu)), "\n"); - */ - - ang = AnglesTransform_ApplyToVAngles(t, ang); - // FIXME when a roll comes out and angle is near +/-90 degrees - // then roll can be incorporated into yaw and cancelled out - - /* - print(vtos(ang), " output\n"); - makevectors(ang); - print(vtos(vf), " -> ", vtos(v_forward), "\n"); - print(vtos(vr), " -> ", vtos(v_right), "\n"); - print(vtos(vu), " -> ", vtos(v_up), "\n"); - */ - - ang = AnglesTransform_Normalize(ang, TRUE); - ang = AnglesTransform_CancelRoll(ang); - - /* - print(vtos(ang), " output\n"); - */ - - ang_z = roll; - return ang; -} +.vector warpzone_origin; +.vector warpzone_transform; +.entity enemy; vector WarpZoneLib_BoxTouchesBrush_mins; vector WarpZoneLib_BoxTouchesBrush_maxs; @@ -118,3 +80,89 @@ void WarpZone_MakeAllOther() for(e = world; (e = find(e, classname, "trigger_warpzone")); ) e.solid = SOLID_TRIGGER; } + +void WarpZone_TraceBox(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent) +{ + float frac, sol; + vector o0, e0; + o0 = org; + e0 = end; + WarpZone_MakeAllSolid(); + sol = -1; + frac = 0; + for(;;) + { + tracebox(org, mi, ma, end, nomonsters, forent); + if(sol < 0) + sol = trace_startsolid; + if(trace_fraction >= 1) + break; + frac = trace_fraction = frac + (1 - frac) * trace_fraction; + if(trace_ent.classname != "trigger_warpzone") + break; + // we hit a warpzone... so, let's perform the trace after the warp again + org = WarpZone_TransformOrigin(trace_ent, trace_endpos); + end = WarpZone_TransformOrigin(trace_ent, end); + } + WarpZone_MakeAllOther(); + WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction; +} + +void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent) +{ + WarpZone_TraceBox(org, '0 0 0', '0 0 0', end, nomonsters, forent); +} + +void WarpZone_TrailParticles(entity own, float eff, vector org, vector end) +{ + float frac, sol; + WarpZone_MakeAllSolid(); + sol = -1; + frac = 0; + for(;;) + { + traceline(org, end, MOVE_NOMONSTERS, world); + if(sol < 0) + sol = trace_startsolid; + //print(vtos(org), " to ", vtos(trace_endpos), "\n"); + trailparticles(own, eff, org, trace_endpos); + if(trace_fraction >= 1) + break; + if(trace_ent.classname != "trigger_warpzone") + break; + // we hit a warpzone... so, let's perform the trace after the warp again + org = WarpZone_TransformOrigin(trace_ent, trace_endpos); + end = WarpZone_TransformOrigin(trace_ent, end); + } + WarpZone_MakeAllOther(); +} + +vector WarpZone_TransformOrigin(entity wz, vector v) +{ + return wz.enemy.warpzone_origin + AnglesTransform_Apply(wz.warpzone_transform, v - wz.warpzone_origin); +} + +vector WarpZone_TransformVelocity(entity wz, vector v) +{ + return AnglesTransform_Apply(wz.warpzone_transform, v); +} + +vector WarpZone_TransformAngles(entity wz, vector v) +{ + return AnglesTransform_ApplyToAngles(wz.warpzone_transform, v); +} + +vector WarpZone_TransformVAngles(entity wz, vector ang) +{ + float roll; + + roll = ang_z; + ang_z = 0; + + ang = AnglesTransform_ApplyToVAngles(wz.warpzone_transform, ang); + ang = AnglesTransform_Normalize(ang, TRUE); + ang = AnglesTransform_CancelRoll(ang); + + ang_z = roll; + return ang; +} diff --git a/data/qcsrc/warpzonelib/common.qh b/data/qcsrc/warpzonelib/common.qh index 454ac2479..29507aef7 100644 --- a/data/qcsrc/warpzonelib/common.qh +++ b/data/qcsrc/warpzonelib/common.qh @@ -1,8 +1,17 @@ float FL_CAMERA = 8192; -vector WarpZone_TransformVAngles(vector t, vector ang); float WarpZoneLib_BoxTouchesBrush(vector mi, vector ma, entity e, entity ig); entity WarpZone_Find(vector mi, vector ma); void WarpZone_MakeAllSolid(); void WarpZone_MakeAllOther(); + +vector WarpZone_trace_endpos; // UNtransformed endpos +void WarpZone_TraceBox(vector org, vector min, vector max, vector end, float nomonsters, entity forent); +void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent); +void WarpZone_TrailParticles(entity own, float eff, vector org, vector end); + +vector WarpZone_TransformOrigin(entity wz, vector v); +vector WarpZone_TransformVelocity(entity wz, vector v); +vector WarpZone_TransformAngles(entity wz, vector v); +vector WarpZone_TransformVAngles(entity wz, vector v); diff --git a/data/qcsrc/warpzonelib/server.qc b/data/qcsrc/warpzonelib/server.qc index d3af6d9bd..7f8b2e0e8 100644 --- a/data/qcsrc/warpzonelib/server.qc +++ b/data/qcsrc/warpzonelib/server.qc @@ -23,9 +23,8 @@ void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector } // the transform -.vector warpzone_origin, warpzone_angles; +.vector warpzone_angles; .vector warpzone_forward; -.vector warpzone_transform; float WarpZone_Teleport(entity player) { @@ -41,12 +40,12 @@ float WarpZone_Teleport(entity player) // this situation we may want to create a temporary clone // entity of the player to fix graphics glitch - o1 = AnglesTransform_Apply(self.warpzone_transform, o0 - self.warpzone_origin) + self.enemy.warpzone_origin; - v1 = AnglesTransform_Apply(self.warpzone_transform, v0); + o1 = WarpZone_TransformOrigin(self, o0); + v1 = WarpZone_TransformVelocity(self, v0); if(player.classname == "player") - a1 = WarpZone_TransformVAngles(self.warpzone_transform, player.v_angle); + a1 = WarpZone_TransformVAngles(self, player.v_angle); else - a1 = AnglesTransform_ApplyToAngles(self.warpzone_transform, a0); + a1 = WarpZone_TransformAngles(self, a0); // put him inside solid tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player); @@ -225,59 +224,3 @@ void WarpZone_InitStep_UpdateTransform() self.flags |= FL_CAMERA; self.view_ofs = self.enemy.warpzone_origin; } - -void WarpZone_TraceBox(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent) -{ - float frac, sol; - vector o0, e0; - o0 = org; - e0 = end; - WarpZone_MakeAllSolid(); - sol = -1; - frac = 0; - for(;;) - { - tracebox(org, mi, ma, end, nomonsters, forent); - if(sol < 0) - sol = trace_startsolid; - if(trace_fraction >= 1) - break; - frac = trace_fraction = frac + (1 - frac) * trace_fraction; - if(trace_ent.classname != "trigger_warpzone") - break; - // we hit a warpzone... so, let's perform the trace after the warp again - org = AnglesTransform_Apply(trace_ent.warpzone_transform, trace_endpos - trace_ent.warpzone_origin) + trace_ent.enemy.warpzone_origin; - end = AnglesTransform_Apply(trace_ent.warpzone_transform, end - trace_ent.warpzone_origin) + trace_ent.enemy.warpzone_origin; - } - WarpZone_MakeAllOther(); - WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction; -} - -void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent) -{ - WarpZone_TraceBox(org, '0 0 0', '0 0 0', end, nomonsters, forent); -} - -void WarpZone_TrailParticles(entity own, float eff, vector org, vector end) -{ - float frac, sol; - WarpZone_MakeAllSolid(); - sol = -1; - frac = 0; - for(;;) - { - traceline(org, end, MOVE_NOMONSTERS, world); - if(sol < 0) - sol = trace_startsolid; - //print(vtos(org), " to ", vtos(trace_endpos), "\n"); - trailparticles(own, eff, org, trace_endpos); - if(trace_fraction >= 1) - break; - if(trace_ent.classname != "trigger_warpzone") - break; - // we hit a warpzone... so, let's perform the trace after the warp again - org = AnglesTransform_Apply(trace_ent.warpzone_transform, trace_endpos - trace_ent.warpzone_origin) + trace_ent.enemy.warpzone_origin; - end = AnglesTransform_Apply(trace_ent.warpzone_transform, end - trace_ent.warpzone_origin) + trace_ent.enemy.warpzone_origin; - } - WarpZone_MakeAllOther(); -} diff --git a/data/qcsrc/warpzonelib/server.qh b/data/qcsrc/warpzonelib/server.qh index 1c02ab660..b92296bf5 100644 --- a/data/qcsrc/warpzonelib/server.qh +++ b/data/qcsrc/warpzonelib/server.qh @@ -8,8 +8,3 @@ void WarpZone_PostTeleportPlayer(entity pl); // server must also define a float called ENT_CLIENT_WARPZONE for the initial byte of WarpZone entities const float ENT_CLIENT_WARPZONE; - -vector WarpZone_trace_endpos; // UNtransformed endpos -void WarpZone_TraceBox(vector org, vector min, vector max, vector end, float nomonsters, entity forent); -void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent); -void WarpZone_TrailParticles(entity own, float eff, vector org, vector end); -- 2.39.2