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

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Feb 28 14:43:17 EST 2010


Author: div0
Date: 2010-02-28 14:43:17 -0500 (Sun, 28 Feb 2010)
New Revision: 8698

Modified:
   trunk/data/qcsrc/server/cl_weaponsystem.qc
   trunk/data/qcsrc/server/g_subs.qc
   trunk/data/qcsrc/server/w_common.qc
   trunk/data/qcsrc/server/w_laser.qc
   trunk/data/qcsrc/server/w_minstanex.qc
   trunk/data/qcsrc/warpzonelib/client.qc
   trunk/data/qcsrc/warpzonelib/common.qc
   trunk/data/qcsrc/warpzonelib/common.qh
   trunk/data/qcsrc/warpzonelib/server.qc
   trunk/data/qcsrc/warpzonelib/server.qh
Log:
MinstaNex now can shoot through warpzones... using warpzone-aware tracebox and trailparticles functions

Conflicts:

	data/qcsrc/server/w_crylink.qc

Modified: trunk/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weaponsystem.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/server/cl_weaponsystem.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -140,12 +140,12 @@
 	else
 		ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 	if(antilag)
-		traceline_antilag(world, ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
+		WarpZone_traceline_antilag(world, ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
 		// passing world, because we do NOT want it to touch dphitcontentsmask
 	else
-		traceline(ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * MAX_SHOT_DISTANCE, MOVE_NOMONSTERS, ent);
+		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 = trace_endpos;
+	trueaimpoint = WarpZone_trace_endpos; // warpzone support
 
 	// track max damage
 	if not(inWarmupStage) {

Modified: trunk/data/qcsrc/server/g_subs.qc
===================================================================
--- trunk/data/qcsrc/server/g_subs.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/server/g_subs.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -307,7 +307,7 @@
 Additionally it moves players back into the past before the trace and restores them afterward.
 ==================
 */
-void tracebox_antilag_force (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
+void tracebox_antilag_force_wz (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag, float wz)
 {
 	local entity player;
 	local float oldsolid;
@@ -337,7 +337,10 @@
 	}
 
 	// do the trace
-	tracebox (v1, mi, ma, v2, nomonst, forent);
+	if(wz)
+		WarpZone_TraceBox (v1, mi, ma, v2, nomonst, forent);
+	else
+		tracebox (v1, mi, ma, v2, nomonst, forent);
 
 	// restore players to current positions
 	if (lag)
@@ -356,7 +359,7 @@
 }
 void traceline_antilag_force (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
 {
-	tracebox_antilag_force(source, v1, '0 0 0', '0 0 0', v2, nomonst, forent, lag);
+	tracebox_antilag_force_wz(source, v1, '0 0 0', '0 0 0', v2, nomonst, forent, lag, FALSE);
 }
 void traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
 {
@@ -368,8 +371,24 @@
 {
 	if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
 		lag = 0;
-	tracebox_antilag_force(source, v1, mi, ma, v2, nomonst, forent, lag);
+	tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, FALSE);
 }
+void WarpZone_traceline_antilag_force (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
+{
+	tracebox_antilag_force_wz(source, v1, '0 0 0', '0 0 0', v2, nomonst, forent, lag, TRUE);
+}
+void WarpZone_traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
+{
+	if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
+		lag = 0;
+	WarpZone_traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
+}
+void WarpZone_tracebox_antilag (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
+{
+	if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
+		lag = 0;
+	tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, TRUE);
+}
 
 float tracebox_inverted (vector v1, vector mi, vector ma, vector v2, float nomonsters, entity forent) // returns the number of traces done, for benchmarking
 {

Modified: trunk/data/qcsrc/server/w_common.qc
===================================================================
--- trunk/data/qcsrc/server/w_common.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/server/w_common.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -21,6 +21,7 @@
 	self = oldself;
 }
 
+.float railgundistance;
 void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, float deathtype)
 {
 	local vector hitloc, force, endpoint, dir;
@@ -51,9 +52,9 @@
 	while (1)
 	{
 		if(self.antilag_debug)
-			traceline_antilag (self, start, end, FALSE, self, self.antilag_debug);
+			WarpZone_traceline_antilag (self, start, end, FALSE, self, self.antilag_debug);
 		else
-			traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self));
+			WarpZone_traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self));
 
 		// if it is world we can't hurt it so stop now
 		if (trace_ent == world || trace_fraction == 1)
@@ -63,6 +64,7 @@
 		trace_ent.railgunhit = TRUE;
 		trace_ent.railgunhitloc = end;
 		trace_ent.railgunhitsolidbackup = trace_ent.solid;
+		trace_ent.railgundistance = vlen(WarpZone_trace_endpos - start);
 
 		// stop if this is a wall
 		if (trace_ent.solid == SOLID_BSP)
@@ -117,9 +119,6 @@
 	{
 		// get the details we need to call the damage function
 		hitloc = ent.railgunhitloc;
-		ent.railgunhitloc = '0 0 0';
-		ent.railgunhitsolidbackup = SOLID_NOT;
-		ent.railgunhit = FALSE;
 
 		//for stats so that team hit will count as a miss
 		if(ent.flags & FL_CLIENT)
@@ -130,8 +129,8 @@
 		if(ent.team == self.team)
 			hit = 0;
 
-		f = ExponentialFalloff(mindist, maxdist, halflifedist, (ent.origin - start) * dir);
-		ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, (ent.origin - start) * dir);
+		f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance);
+		ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance);
 
 		// apply the damage
 		if (ent.takedamage)
@@ -141,6 +140,11 @@
 		//setorigin (explosion, hitloc);
 		//RadiusDamage (explosion, self, 10, 0, 50, world, 300, deathtype);
 
+		ent.railgunhitloc = '0 0 0';
+		ent.railgunhitsolidbackup = SOLID_NOT;
+		ent.railgunhit = FALSE;
+		ent.railgundistance = 0;
+
 		// advance to the next entity
 		ent = findfloat(ent, railgunhit, TRUE);
 	}

Modified: trunk/data/qcsrc/server/w_laser.qc
===================================================================
--- trunk/data/qcsrc/server/w_laser.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/server/w_laser.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -104,7 +104,7 @@
 {
 	W_SetupShot (self, TRUE, 0, "weapons/gauntlet_fire.wav", cvar("g_balance_laser_primary_damage"));
 
-	traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * cvar("g_balance_laser_primary_radius"), FALSE, self, ANTILAG_LATENCY(self));
+	WarpZone_traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * cvar("g_balance_laser_primary_radius"), FALSE, self, ANTILAG_LATENCY(self));
 
 	pointparticles(particleeffectnum("laser_gauntlet"), w_shotorg + w_shotdir * cvar("g_balance_laser_primary_radius"), '0 0 0', 1);
 

Modified: trunk/data/qcsrc/server/w_minstanex.qc
===================================================================
--- trunk/data/qcsrc/server/w_minstanex.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/server/w_minstanex.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -47,32 +47,32 @@
 	    {
             case COLOR_TEAM1:   // Red
                 if(damage_goodhits)
-                    trailparticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, WarpZone_trace_endpos);
                 else
-                    trailparticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, WarpZone_trace_endpos);
                 break;
             case COLOR_TEAM2:   // Blue
                 if(damage_goodhits)
-                    trailparticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, WarpZone_trace_endpos);
                 else
-                    trailparticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, WarpZone_trace_endpos);
                 break;
             case COLOR_TEAM3:   // Yellow
                 if(damage_goodhits)
-                    trailparticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, WarpZone_trace_endpos);
                 else
-                    trailparticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, WarpZone_trace_endpos);
                 break;
             case COLOR_TEAM4:   // Pink
                 if(damage_goodhits)
-                    trailparticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, WarpZone_trace_endpos);
                 else
-                    trailparticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, trace_endpos);
+                    WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, WarpZone_trace_endpos);
                 break;
 	    }
 	}
 	else
-        trailparticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, trace_endpos);
+        WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, WarpZone_trace_endpos);
 
 	// flash and burn the wall
 	if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))

Modified: trunk/data/qcsrc/warpzonelib/client.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/client.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/warpzonelib/client.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -6,7 +6,7 @@
 		self.enemy = spawn();
 		self.enemy.classname = "warpzone_from";
 	}
-	self.classname = "warpzone_to";
+	self.classname = "trigger_warpzone";
 	self.origin_x = ReadCoord();
 	self.origin_y = ReadCoord();
 	self.origin_z = ReadCoord();
@@ -53,31 +53,27 @@
 	warpzone_saved_origin = warpzone_fixview_origin;
 	warpzone_saved_angles = warpzone_fixview_angles;
 
-	for(e = world; (e = find(e, classname, "warpzone_to")); )
+	e = WarpZone_Find(warpzone_fixview_origin, warpzone_fixview_origin);
+	if(e)
 	{
-		if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin, warpzone_fixview_origin, e, world))
-		{
-			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_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;
 	}
 
 	// if we are near any warpzone planes - MOVE AWAY (work around nearclip)
 	float nearclip = 1;
-	for(e = world; (e = find(e, classname, "warpzone_to")); )
+	e = WarpZone_Find(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip);
+	if(e)
 	{
-		if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip, e, world))
+		fixedmakevectors(e.enemy.avelocity);
+		pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
+		if(pd >= 0 && pd < nearclip)
 		{
-			fixedmakevectors(e.enemy.avelocity);
+			warpzone_saved = 1;
+			warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd);
 			pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
-			if(pd >= 0 && pd < nearclip)
-			{
-				warpzone_saved = 1;
-				warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd);
-				pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
-			}
 		}
 	}
 

Modified: trunk/data/qcsrc/warpzonelib/common.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/warpzonelib/common.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -94,3 +94,27 @@
 
     return f;
 }
+
+entity WarpZone_Find(vector mi, vector ma)
+{
+	// if we are near any warpzone planes - MOVE AWAY (work around nearclip)
+	entity e;
+	for(e = world; (e = find(e, classname, "trigger_warpzone")); )
+		if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world))
+			return e;
+	return world;
+}
+
+void WarpZone_MakeAllSolid()
+{
+	entity e;
+	for(e = world; (e = find(e, classname, "trigger_warpzone")); )
+		e.solid = SOLID_BSP;
+}
+
+void WarpZone_MakeAllOther()
+{
+	entity e;
+	for(e = world; (e = find(e, classname, "trigger_warpzone")); )
+		e.solid = SOLID_TRIGGER;
+}

Modified: trunk/data/qcsrc/warpzonelib/common.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qh	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/warpzonelib/common.qh	2010-02-28 19:43:17 UTC (rev 8698)
@@ -2,3 +2,7 @@
 
 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();

Modified: trunk/data/qcsrc/warpzonelib/server.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/server.qc	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/warpzonelib/server.qc	2010-02-28 19:43:17 UTC (rev 8698)
@@ -225,3 +225,59 @@
 	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();
+}

Modified: trunk/data/qcsrc/warpzonelib/server.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/server.qh	2010-02-28 19:43:12 UTC (rev 8697)
+++ trunk/data/qcsrc/warpzonelib/server.qh	2010-02-28 19:43:17 UTC (rev 8698)
@@ -8,3 +8,8 @@
 
 // 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);



More information about the nexuiz-commits mailing list