[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