[nexuiz-commits] r8710 - trunk/data/qcsrc/warpzonelib
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Feb 28 14:44:16 EST 2010
Author: div0
Date: 2010-02-28 14:44:16 -0500 (Sun, 28 Feb 2010)
New Revision: 8710
Modified:
trunk/data/qcsrc/warpzonelib/common.qc
trunk/data/qcsrc/warpzonelib/common.qh
trunk/data/qcsrc/warpzonelib/server.qc
Log:
fix multi-zone impacts
Modified: trunk/data/qcsrc/warpzonelib/common.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qc 2010-02-28 19:44:11 UTC (rev 8709)
+++ trunk/data/qcsrc/warpzonelib/common.qc 2010-02-28 19:44:16 UTC (rev 8710)
@@ -138,6 +138,56 @@
v_up = vu;
}
+void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone)
+{
+ float frac, sol;
+ vector o0, e0;
+ entity e;
+ vector vf, vr, vu;
+ vf = v_forward;
+ vr = v_right;
+ vu = v_up;
+ WarpZone_MakeAllSolid();
+ o0 = org;
+ e0 = end;
+ sol = -1;
+ frac = 0;
+ e = world;
+ for(;;)
+ {
+ tracebox(org, mi, ma, end, nomonsters, forent);
+ if(WarpZone_trace_callback)
+ WarpZone_trace_callback();
+ 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;
+ if(trace_ent != zone)
+ 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_trace_velocity = WarpZone_TransformVelocity(trace_ent, WarpZone_trace_velocity);
+ WarpZone_trace_angles = WarpZone_TransformAngles(trace_ent, WarpZone_trace_angles);
+ WarpZone_trace_v_angle = WarpZone_TransformVAngles(trace_ent, WarpZone_trace_v_angle);
+ if(trace_ent == e)
+ {
+ dprint("I transformed into the same zone again, wtf, aborting the trace\n");
+ break;
+ }
+ e = trace_ent;
+ }
+ WarpZone_MakeAllOther();
+ trace_startsolid = sol;
+ WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction;
+ v_forward = vf;
+ v_right = vr;
+ v_up = vu;
+}
+
void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent)
{
WarpZone_TraceBox(org, '0 0 0', '0 0 0', end, nomonsters, forent);
@@ -185,13 +235,13 @@
void WarpZone_TrailParticles(entity own, float eff, vector org, vector end)
{
- float frac;
vector vf, vr, vu;
+ entity e;
vf = v_forward;
vr = v_right;
vu = v_up;
WarpZone_MakeAllSolid();
- frac = 0;
+ e = world;
for(;;)
{
traceline(org, end, MOVE_NOMONSTERS, world);
@@ -204,6 +254,12 @@
// 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);
+ if(trace_ent == e)
+ {
+ dprint("I transformed into the same zone again, wtf, aborting the trace\n");
+ break;
+ }
+ e = trace_ent;
}
WarpZone_MakeAllOther();
v_forward = vf;
Modified: trunk/data/qcsrc/warpzonelib/common.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qh 2010-02-28 19:44:11 UTC (rev 8709)
+++ trunk/data/qcsrc/warpzonelib/common.qh 2010-02-28 19:44:16 UTC (rev 8710)
@@ -24,6 +24,7 @@
vector WarpZone_tracetoss_velocity; // ending velocity of a tracetoss (post-transform)
float WarpZone_tracetoss_time; // duration of toss (approximate)
void WarpZone_TraceBox(vector org, vector min, vector max, vector end, float nomonsters, entity forent);
+void WarpZone_TraceBox_ThroughZone(vector org, vector min, vector max, vector end, float nomonsters, entity forent, entity zone);
void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent);
void WarpZone_TraceToss(entity e, entity forent);
void WarpZone_TrailParticles(entity own, float eff, vector org, vector end);
Modified: trunk/data/qcsrc/warpzonelib/server.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/server.qc 2010-02-28 19:44:11 UTC (rev 8709)
+++ trunk/data/qcsrc/warpzonelib/server.qc 2010-02-28 19:44:16 UTC (rev 8710)
@@ -238,14 +238,13 @@
v0 = self.velocity;
a0 = self.angles;
- // FIXME this code assumes the trace goes through just one warpzone.
// this approach transports the projectile at its full speed, but does
// not properly retain the projectile trail (but we can't retain it
// easily anyway without delaying the projectile by two frames, so who
// cares)
WarpZone_trace_angles = self.angles;
WarpZone_trace_velocity = self.velocity;
- WarpZone_TraceBox(self.warpzone_oldorigin, self.mins, self.maxs, self.warpzone_oldorigin + self.warpzone_oldvelocity * frametime, MOVE_NORMAL, self); // this will get us through the warpzone
+ WarpZone_TraceBox_ThroughZone(self.warpzone_oldorigin, self.mins, self.maxs, self.warpzone_oldorigin + self.warpzone_oldvelocity * frametime, MOVE_NORMAL, self, wz); // this will get us through the warpzone
setorigin(self, trace_endpos);
self.angles = WarpZone_trace_angles;
self.velocity = WarpZone_trace_velocity;
More information about the nexuiz-commits
mailing list