[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