[nexuiz-commits] r8720 - in trunk/data/qcsrc: client server warpzonelib

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Feb 28 14:45:41 EST 2010


Author: div0
Date: 2010-02-28 14:45:41 -0500 (Sun, 28 Feb 2010)
New Revision: 8720

Modified:
   trunk/data/qcsrc/client/hook.qc
   trunk/data/qcsrc/server/cl_weaponsystem.qc
   trunk/data/qcsrc/server/w_common.qc
   trunk/data/qcsrc/server/w_minstanex.qc
   trunk/data/qcsrc/server/w_nex.qc
   trunk/data/qcsrc/warpzonelib/common.qc
   trunk/data/qcsrc/warpzonelib/common.qh
   trunk/data/qcsrc/warpzonelib/server.qc
Log:
lots of simplifaction of the trace function of warpzones

Conflicts:

	data/qcsrc/server/w_crylink.qc

Modified: trunk/data/qcsrc/client/hook.qc
===================================================================
--- trunk/data/qcsrc/client/hook.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/client/hook.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -80,11 +80,9 @@
 		rgb = '.3 1 .3';
 	}
 
-	WarpZone_trace_callback = Draw_GrapplingHook_trace_callback;
 	Draw_GrapplingHook_trace_callback_tex = tex;
 	Draw_GrapplingHook_trace_callback_rnd = random();
-	WarpZone_TraceLine(a, b, MOVE_NOMONSTERS, world);
-	WarpZone_trace_callback = func_null;
+	WarpZone_TraceBox_ThroughZone(a, '0 0 0', '0 0 0', b, MOVE_NOMONSTERS, world, world, Draw_GrapplingHook_trace_callback);
 	Draw_GrapplingHook_trace_callback_tex = string_null;
 }
 

Modified: trunk/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weaponsystem.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/server/cl_weaponsystem.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -145,7 +145,7 @@
 	else
 		WarpZone_TraceLine(ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * MAX_SHOT_DISTANCE, MOVE_NOMONSTERS, ent);
 	ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
-	trueaimpoint = WarpZone_trace_endpos; // warpzone support
+	trueaimpoint = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos); // warpzone support
 
 	// track max damage
 	if not(inWarmupStage) {

Modified: trunk/data/qcsrc/server/w_common.qc
===================================================================
--- trunk/data/qcsrc/server/w_common.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/server/w_common.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -64,7 +64,7 @@
 		trace_ent.railgunhit = TRUE;
 		trace_ent.railgunhitloc = end;
 		trace_ent.railgunhitsolidbackup = trace_ent.solid;
-		trace_ent.railgundistance = vlen(WarpZone_trace_endpos - start);
+		trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start);
 
 		// stop if this is a wall
 		if (trace_ent.solid == SOLID_BSP)
@@ -414,9 +414,7 @@
 			trace_fraction = 0;
 			fireBallisticBullet_trace_callback_ent = self;
 			fireBallisticBullet_trace_callback_eff = eff;
-			WarpZone_trace_callback = fireBallisticBullet_trace_callback;
-			WarpZone_TraceToss(self, oldself);
-			WarpZone_trace_callback = func_null;
+			WarpZone_TraceToss_ThroughZone(self, oldself, world, fireBallisticBullet_trace_callback);
 			self.velocity = v0;
 			self.gravity = g0;
 

Modified: trunk/data/qcsrc/server/w_minstanex.qc
===================================================================
--- trunk/data/qcsrc/server/w_minstanex.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/server/w_minstanex.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -41,38 +41,40 @@
 	pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
 	// teamcolor / hit beam effect
+	vector v;
+	v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
 	if(teamplay)
 	{
 	    switch(self.team)
 	    {
             case COLOR_TEAM1:   // Red
                 if(damage_goodhits)
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, v);
                 else
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, v);
                 break;
             case COLOR_TEAM2:   // Blue
                 if(damage_goodhits)
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, v);
                 else
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, v);
                 break;
             case COLOR_TEAM3:   // Yellow
                 if(damage_goodhits)
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, v);
                 else
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, v);
                 break;
             case COLOR_TEAM4:   // Pink
                 if(damage_goodhits)
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, v);
                 else
-                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, WarpZone_trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, v);
                 break;
 	    }
 	}
 	else
-        WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, WarpZone_trace_endpos);
+        WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, v);
 
 	// flash and burn the wall
 	if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))

Modified: trunk/data/qcsrc/server/w_nex.qc
===================================================================
--- trunk/data/qcsrc/server/w_nex.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/server/w_nex.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -2,15 +2,17 @@
 REGISTER_WEAPON(NEX, w_nex, IT_CELLS, 7, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "nex", "nex", "Nex");
 #else
 void SendCSQCNexBeamParticle() {
+	vector v;
+	v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
 	WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
 	WriteByte(MSG_BROADCAST, TE_CSQC_NEXGUNBEAMPARTICLE);
 	
 	WriteCoord(MSG_BROADCAST, w_shotorg_x);
 	WriteCoord(MSG_BROADCAST, w_shotorg_y);
 	WriteCoord(MSG_BROADCAST, w_shotorg_z);
-	WriteCoord(MSG_BROADCAST, WarpZone_trace_endpos_x);
-	WriteCoord(MSG_BROADCAST, WarpZone_trace_endpos_y);
-	WriteCoord(MSG_BROADCAST, WarpZone_trace_endpos_z);
+	WriteCoord(MSG_BROADCAST, v_x);
+	WriteCoord(MSG_BROADCAST, v_y);
+	WriteCoord(MSG_BROADCAST, v_z);
 }
 
 void W_Nex_Attack (void)

Modified: trunk/data/qcsrc/warpzonelib/common.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/warpzonelib/common.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -1,3 +1,25 @@
+void WarpZone_Accumulator_Clear(entity acc)
+{
+	acc.warpzone_transform = '0 0 0';
+	acc.warpzone_shift = '0 0 0';
+}
+void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s)
+{
+	vector tr, st;
+	tr = AnglesTransform_Multiply(t, acc.warpzone_transform);
+	st = AnglesTransform_Multiply_GetPostShift(t, s, acc.warpzone_transform, acc.warpzone_shift);
+	acc.warpzone_transform = tr;
+	acc.warpzone_shift = st;
+}
+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;
+}
+
 void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
 {
 	e.warpzone_transform = AnglesTransform_Divide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
@@ -89,64 +111,21 @@
 		e.solid = SOLID_TRIGGER;
 }
 
-void WarpZone_TraceBox(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent)
+void WarpZone_Trace_InitTransform()
 {
-	float frac, sol;
-	vector o0, e0;
-	entity wz;
-	vector vf, vr, vu;
-	vf = v_forward;
-	vr = v_right;
-	vu = v_up;
-	o0 = org;
-	e0 = end;
-	// if starting in warpzone, first transform
-	wz = WarpZone_Find(org + mi, org + ma);
-	if(wz)
+	if(!WarpZone_trace_transform)
 	{
-		org = WarpZone_TransformOrigin(wz, trace_endpos);
-		end = WarpZone_TransformOrigin(wz, end);
-		WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
-		WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
-		WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
+		WarpZone_trace_transform = spawn();
+		WarpZone_trace_transform.classname = "warpzone_trace_transform";
 	}
-	WarpZone_MakeAllSolid();
-	sol = -1;
-	frac = 0;
-	for(;;)
-	{
-		tracebox(org, mi, ma, end, nomonsters, forent);
-		if(WarpZone_trace_callback)
-			WarpZone_trace_callback(org, trace_endpos, end);
-		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 == wz)
-		{
-			dprint("I transformed into the same zone again, wtf, aborting the trace\n");
-			break;
-		}
-		wz = trace_ent;
-		// we hit a warpzone... so, let's perform the trace after the warp again
-		org = WarpZone_TransformOrigin(wz, trace_endpos);
-		end = WarpZone_TransformOrigin(wz, end);
-		WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
-		WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
-		WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
-	}
-	WarpZone_MakeAllOther();
-	trace_startsolid = sol;
-	WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction;
-	v_forward = vf;
-	v_right = vr;
-	v_up = vu;
+	WarpZone_Accumulator_Clear(WarpZone_trace_transform);
 }
+void WarpZone_Trace_AddTransform(entity wz)
+{
+	WarpZone_Accumulator_Add(WarpZone_trace_transform, wz);
+}
 
-void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone)
+void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
 {
 	float frac, sol;
 	vector o0, e0;
@@ -157,11 +136,12 @@
 	vu = v_up;
 	o0 = org;
 	e0 = end;
+	WarpZone_Trace_InitTransform();
 	// if starting in warpzone, first transform
 	wz = WarpZone_Find(org + mi, org + ma);
 	if(wz)
 	{
-		if(wz != zone)
+		if(zone && wz != zone)
 		{
 			// we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
 			sol = 1;
@@ -169,11 +149,9 @@
 			trace_endpos = org;
 			goto fail;
 		}
+		WarpZone_Trace_AddTransform(wz);
 		org = WarpZone_TransformOrigin(wz, trace_endpos);
 		end = WarpZone_TransformOrigin(wz, end);
-		WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
-		WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
-		WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
 	}
 	WarpZone_MakeAllSolid();
 	sol = -1;
@@ -181,58 +159,72 @@
 	for(;;)
 	{
 		tracebox(org, mi, ma, end, nomonsters, forent);
-		if(WarpZone_trace_callback)
-			WarpZone_trace_callback(org, trace_endpos, end);
+		if(cb)
+			cb(org, trace_endpos, end);
 		if(sol < 0)
 			sol = trace_startsolid;
+
+		frac = trace_fraction = frac + (1 - frac) * trace_fraction;
 		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;
 		if(trace_ent == wz)
 		{
 			dprint("I transformed into the same zone again, wtf, aborting the trace\n");
 			break;
 		}
 		wz = trace_ent;
+		if(zone && wz != zone)
+			break;
+		WarpZone_Trace_AddTransform(wz);
 		// we hit a warpzone... so, let's perform the trace after the warp again
 		org = WarpZone_TransformOrigin(wz, trace_endpos);
 		end = WarpZone_TransformOrigin(wz, end);
-		WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
-		WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
-		WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
 	}
 	WarpZone_MakeAllOther();
 :fail
 	trace_startsolid = sol;
-	WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction;
 	v_forward = vf;
 	v_right = vr;
 	v_up = vu;
 }
 
+void WarpZone_TraceBox(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent)
+{
+	WarpZone_TraceBox_ThroughZone(org, mi, ma, end, nomonsters, forent, world, WarpZone_trace_callback_t_null);
+}
+
 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_TraceToss(entity e, entity forent)
+void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb)
 {
 	float g, dt;
 	vector vf, vr, vu, v0, o0;
 	entity wz;
+
 	vf = v_forward;
 	vr = v_right;
 	vu = v_up;
-	v0 = e.velocity;
 	o0 = e.origin;
+	v0 = e.velocity;
+	WarpZone_Trace_InitTransform();
 	// if starting in warpzone, first transform
 	wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
 	if(wz)
 	{
+		if(zone && wz != zone)
+		{
+			// we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
+
+			WarpZone_tracetoss_time = 0;
+			trace_endpos = o0;
+			goto fail;
+		}
+		WarpZone_Trace_AddTransform(wz);
 		setorigin(e, WarpZone_TransformOrigin(wz, e.origin));
 		e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
 	}
@@ -242,12 +234,12 @@
 	for(;;)
 	{
 		tracetoss(e, forent);
-		if(WarpZone_trace_callback)
-			WarpZone_trace_callback(e.origin, trace_endpos, trace_endpos);
+		if(cb)
+			cb(e.origin, trace_endpos, trace_endpos);
 		e.origin = trace_endpos;
+		e.velocity_z -= WarpZone_tracetoss_time * g;
 		dt = vlen(e.origin - o0) / vlen(e.velocity);
 		WarpZone_tracetoss_time += dt;
-		e.velocity_z -= WarpZone_tracetoss_time * g;
 		if(trace_fraction >= 1)
 			break;
 		if(trace_ent.classname != "trigger_warpzone")
@@ -258,53 +250,41 @@
 			break;
 		}
 		wz = trace_ent;
+		if(zone && wz != zone)
+			break;
+		WarpZone_Trace_AddTransform(wz);
 		// we hit a warpzone... so, let's perform the trace after the warp again
 		e.origin = WarpZone_TransformOrigin(wz, e.origin);
 		e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
 	}
 	WarpZone_MakeAllOther();
+:fail
+	WarpZone_tracetoss_velocity = e.velocity;
 	v_forward = vf;
 	v_right = vr;
 	v_up = vu;
-	WarpZone_tracetoss_velocity = e.velocity;
+	// restore old entity data (caller just uses trace_endpos, WarpZone_tracetoss_velocity and the transform)
 	e.velocity = v0;
 	e.origin = o0;
-	WarpZone_trace_endpos = e.origin + e.velocity * WarpZone_tracetoss_time;
-	WarpZone_trace_endpos_z -= 0.5 * g * WarpZone_tracetoss_time * WarpZone_tracetoss_time;
 }
 
+void WarpZone_TraceToss(entity e, entity forent)
+{
+	WarpZone_TraceToss_ThroughZone(e, forent, world, WarpZone_trace_callback_t_null);
+}
+
+entity WarpZone_TrailParticles_trace_callback_own;
+float WarpZone_TrailParticles_trace_callback_eff;
+void WarpZone_TrailParticles_trace_callback(vector from, vector endpos, vector to)
+{
+	trailparticles(WarpZone_TrailParticles_trace_callback_own, WarpZone_TrailParticles_trace_callback_eff, from, endpos);
+}
+
 void WarpZone_TrailParticles(entity own, float eff, vector org, vector end)
 {
-	vector vf, vr, vu;
-	entity e;
-	vf = v_forward;
-	vr = v_right;
-	vu = v_up;
-	WarpZone_MakeAllSolid();
-	e = world;
-	for(;;)
-	{
-		traceline(org, end, MOVE_NOMONSTERS, world);
-		//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);
-		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;
-	v_right = vr;
-	v_up = vu;
+	WarpZone_TrailParticles_trace_callback_own = own;
+	WarpZone_TrailParticles_trace_callback_eff = eff;
+	WarpZone_TraceBox_ThroughZone(org, '0 0 0', '0 0 0', end, MOVE_NOMONSTERS, world, world, WarpZone_TrailParticles_trace_callback);
 }
 
 float WarpZone_PlaneDist(entity wz, vector v)
@@ -465,28 +445,6 @@
 	return e0;
 }
 
-void WarpZone_Accumulator_Clear(entity acc)
-{
-	acc.warpzone_transform = '0 0 0';
-	acc.warpzone_shift = '0 0 0';
-}
-void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s)
-{
-	vector tr, st;
-	tr = AnglesTransform_Multiply(t, acc.warpzone_transform);
-	st = AnglesTransform_Multiply_GetPostShift(t, s, acc.warpzone_transform, acc.warpzone_shift);
-	acc.warpzone_transform = tr;
-	acc.warpzone_shift = st;
-}
-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;
-}
-
 .entity WarpZone_refsys;
 void WarpZone_RefSys_GC()
 {

Modified: trunk/data/qcsrc/warpzonelib/common.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qh	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/warpzonelib/common.qh	2010-02-28 19:45:41 UTC (rev 8720)
@@ -1,3 +1,5 @@
+const void func_null(void); // never assign to this one please
+
 .vector warpzone_shift;
 .vector warpzone_origin;
 .vector warpzone_angles;
@@ -17,17 +19,16 @@
 void WarpZone_MakeAllSolid();
 void WarpZone_MakeAllOther();
 
-var void(vector start, vector hit, vector end) WarpZone_trace_callback; // called after every trace
-vector WarpZone_trace_angles; // total angles accumulator
-vector WarpZone_trace_v_angle; // total v_angle accumulator
-vector WarpZone_trace_velocity; // total velocity
-vector WarpZone_trace_endpos; // UNtransformed endpos
+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
 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_TraceBox_ThroughZone(vector org, vector min, vector max, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb);
 void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent);
 void WarpZone_TraceToss(entity e, entity forent);
+void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb);
 void WarpZone_TrailParticles(entity own, float eff, vector org, vector end);
 
 .vector WarpZone_findradius_dist;

Modified: trunk/data/qcsrc/warpzonelib/server.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/server.qc	2010-02-28 19:45:36 UTC (rev 8719)
+++ trunk/data/qcsrc/warpzonelib/server.qc	2010-02-28 19:45:41 UTC (rev 8720)
@@ -242,12 +242,10 @@
 	// 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_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
+	WarpZone_TraceBox_ThroughZone(self.warpzone_oldorigin, self.mins, self.maxs, self.warpzone_oldorigin + self.warpzone_oldvelocity * frametime, MOVE_NORMAL, self, wz, WarpZone_trace_callback_t_null); // this will get us through the warpzone
 	setorigin(self, trace_endpos);
-	self.angles = WarpZone_trace_angles;
-	self.velocity = WarpZone_trace_velocity;
+	self.angles = WarpZone_TransformAngles(WarpZone_trace_transform, self.angles);
+	self.velocity = WarpZone_TransformVelocity(WarpZone_trace_transform, self.velocity);
 	
 	// in case we are in our warp zone post-teleport, shift the projectile forward a bit
 	mpd = max(vlen(self.mins), vlen(self.maxs));



More information about the nexuiz-commits mailing list