]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_subs.qc
Properly support team field on trigger_multiple
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_subs.qc
index 5c2896dbe0b973a4a250b3c889247a27111c1d19..d9372e0aa561ea44f4d57850db09a656ef18e070 100644 (file)
@@ -1,13 +1,16 @@
 #include "g_subs.qh"
 
+#include <server/defs.qh>
+#include <server/miscfunctions.qh>
 #include "antilag.qh"
 #include "command/common.qh"
+#include "../common/state.qh"
 #include "../lib/warpzone/common.qh"
 #include "../common/triggers/subs.qh"
 
 spawnfunc(info_null)
 {
-       remove(self);
+       delete(this);
        // if anything breaks, tell the mapper to fix his map! info_null is meant to remove itself immediately.
 }
 
@@ -47,14 +50,7 @@ void tracebox_antilag_force_wz (entity source, vector v1, vector mi, vector ma,
                source.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 
        if (lag)
-       {
-               // take players back into the past
-               FOREACH_CLIENT(IS_PLAYER(it) && it != forent, LAMBDA(antilag_takeback(it, time - lag)));
-               FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA(
-                       if(it != forent)
-                               antilag_takeback(it, time - lag);
-               ));
-       }
+               antilag_takeback_all(forent, lag);
 
        // do the trace
        if(wz)
@@ -64,13 +60,7 @@ void tracebox_antilag_force_wz (entity source, vector v1, vector mi, vector ma,
 
        // restore players to current positions
        if (lag)
-       {
-               FOREACH_CLIENT(IS_PLAYER(it) && it != forent, LAMBDA(antilag_restore(it)));
-               FOREACH_ENTITY_FLAGS(flags, FL_MONSTER, LAMBDA(
-                       if(it != forent)
-                               antilag_restore(it);
-               ));
-       }
+               antilag_restore_all(forent);
 
        // restore shooter solid type
        if(source)
@@ -82,13 +72,15 @@ void traceline_antilag_force (entity source, vector v1, vector v2, float nomonst
 }
 void traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
 {
-       if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
+       bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
+       if (autocvar_g_antilag != 2 || noantilag)
                lag = 0;
        traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
 }
 void tracebox_antilag (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
 {
-       if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
+       bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
+       if (autocvar_g_antilag != 2 || noantilag)
                lag = 0;
        tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, false);
 }
@@ -98,13 +90,15 @@ void WarpZone_traceline_antilag_force (entity source, vector v1, vector v2, floa
 }
 void WarpZone_traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
 {
-       if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
+       bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
+       if (autocvar_g_antilag != 2 || 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 (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
+       bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
+       if (autocvar_g_antilag != 2 || noantilag)
                lag = 0;
        tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, true);
 }
@@ -140,10 +134,10 @@ float tracebox_inverted (vector v1, vector mi, vector ma, vector v2, float nomon
 
                if(c == 50)
                {
-                       LOG_TRACE("HOLY SHIT! When tracing from ", vtos(v1), " to ", vtos(v2), "\n");
-                       LOG_TRACE("  Nudging gets us nowhere at ", vtos(pos), "\n");
-                       LOG_TRACE("  trace_endpos is ", vtos(trace_endpos), "\n");
-                       LOG_TRACE("  trace distance is ", ftos(vlen(pos - trace_endpos)), "\n");
+                       LOG_TRACE("HOLY SHIT! When tracing from ", vtos(v1), " to ", vtos(v2));
+                       LOG_TRACE("  Nudging gets us nowhere at ", vtos(pos));
+                       LOG_TRACE("  trace_endpos is ", vtos(trace_endpos));
+                       LOG_TRACE("  trace distance is ", ftos(vlen(pos - trace_endpos)));
                }
 
                stopentity = trace_ent;
@@ -203,26 +197,22 @@ Ripped from DPMod
 */
 vector findbetterlocation (vector org, float mindist)
 {
-       vector  loc;
-       vector vec;
-       float c, h;
-
-       vec = mindist * '1 0 0';
-       c = 0;
+       vector vec = mindist * '1 0 0';
+       int c = 0;
        while (c < 6)
        {
-               traceline (org, org + vec, true, world);
+               traceline (org, org + vec, true, NULL);
                vec = vec * -1;
                if (trace_fraction < 1)
                {
-                       loc = trace_endpos;
-                       traceline (loc, loc + vec, true, world);
+                       vector loc = trace_endpos;
+                       traceline (loc, loc + vec, true, NULL);
                        if (trace_fraction >= 1)
                                org = loc + vec;
                }
                if (c & 1)
                {
-                       h = vec.y;
+                       float h = vec.y;
                        vec.y = vec.x;
                        vec.x = vec.z;
                        vec.z = h;
@@ -233,100 +223,100 @@ vector findbetterlocation (vector org, float mindist)
        return org;
 }
 
-float LOD_customize()
-{SELFPARAM();
+bool LOD_customize(entity this, entity client)
+{
        if(autocvar_loddebug)
        {
                int d = autocvar_loddebug;
                if(d == 1)
-                       self.modelindex = self.lodmodelindex0;
-               else if(d == 2 || !self.lodmodelindex2)
-                       self.modelindex = self.lodmodelindex1;
+                       this.modelindex = this.lodmodelindex0;
+               else if(d == 2 || !this.lodmodelindex2)
+                       this.modelindex = this.lodmodelindex1;
                else // if(d == 3)
-                       self.modelindex = self.lodmodelindex2;
+                       this.modelindex = this.lodmodelindex2;
                return true;
        }
 
        // TODO csqc network this so it only gets sent once
-       vector near_point = NearestPointOnBox(self, other.origin);
-       if(vdist(near_point - other.origin, <, self.loddistance1))
-               self.modelindex = self.lodmodelindex0;
-       else if(!self.lodmodelindex2 || vdist(near_point - other.origin, <, self.loddistance2))
-               self.modelindex = self.lodmodelindex1;
+       vector near_point = NearestPointOnBox(this, client.origin);
+       if(vdist(near_point - client.origin, <, this.loddistance1))
+               this.modelindex = this.lodmodelindex0;
+       else if(!this.lodmodelindex2 || vdist(near_point - client.origin, <, this.loddistance2))
+               this.modelindex = this.lodmodelindex1;
        else
-               self.modelindex = self.lodmodelindex2;
+               this.modelindex = this.lodmodelindex2;
 
        return true;
 }
 
-void LOD_uncustomize()
-{SELFPARAM();
-       self.modelindex = self.lodmodelindex0;
+void LOD_uncustomize(entity this)
+{
+       this.modelindex = this.lodmodelindex0;
 }
 
-void LODmodel_attach()
-{SELFPARAM();
+void LODmodel_attach(entity this)
+{
        entity e;
 
-       if(!self.loddistance1)
-               self.loddistance1 = 1000;
-       if(!self.loddistance2)
-               self.loddistance2 = 2000;
-       self.lodmodelindex0 = self.modelindex;
+       if(!this.loddistance1)
+               this.loddistance1 = 1000;
+       if(!this.loddistance2)
+               this.loddistance2 = 2000;
+       this.lodmodelindex0 = this.modelindex;
 
-       if(self.lodtarget1 != "")
+       if(this.lodtarget1 != "")
        {
-               e = find(world, targetname, self.lodtarget1);
+               e = find(NULL, targetname, this.lodtarget1);
                if(e)
                {
-                       self.lodmodel1 = e.model;
-                       remove(e);
+                       this.lodmodel1 = e.model;
+                       delete(e);
                }
        }
-       if(self.lodtarget2 != "")
+       if(this.lodtarget2 != "")
        {
-               e = find(world, targetname, self.lodtarget2);
+               e = find(NULL, targetname, this.lodtarget2);
                if(e)
                {
-                       self.lodmodel2 = e.model;
-                       remove(e);
+                       this.lodmodel2 = e.model;
+                       delete(e);
                }
        }
 
        if(autocvar_loddebug < 0)
        {
-               self.lodmodel1 = self.lodmodel2 = ""; // don't even initialize
+               this.lodmodel1 = this.lodmodel2 = ""; // don't even initialize
        }
 
-       if(self.lodmodel1 != "")
+       if(this.lodmodel1 != "")
        {
                vector mi, ma;
-               mi = self.mins;
-               ma = self.maxs;
+               mi = this.mins;
+               ma = this.maxs;
 
-               precache_model(self.lodmodel1);
-               _setmodel(self, self.lodmodel1);
-               self.lodmodelindex1 = self.modelindex;
+               precache_model(this.lodmodel1);
+               _setmodel(this, this.lodmodel1);
+               this.lodmodelindex1 = this.modelindex;
 
-               if(self.lodmodel2 != "")
+               if(this.lodmodel2 != "")
                {
-                       precache_model(self.lodmodel2);
-                       _setmodel(self, self.lodmodel2);
-                       self.lodmodelindex2 = self.modelindex;
+                       precache_model(this.lodmodel2);
+                       _setmodel(this, this.lodmodel2);
+                       this.lodmodelindex2 = this.modelindex;
                }
 
-               self.modelindex = self.lodmodelindex0;
-               setsize(self, mi, ma);
+               this.modelindex = this.lodmodelindex0;
+               setsize(this, mi, ma);
        }
 
-       if(self.lodmodelindex1)
-               if (!self.SendEntity)
-                       SetCustomizer(self, LOD_customize, LOD_uncustomize);
+       if(this.lodmodelindex1)
+               if (!getSendEntity(this))
+                       SetCustomizer(this, LOD_customize, LOD_uncustomize);
 }
 
 void ApplyMinMaxScaleAngles(entity e)
-{SELFPARAM();
-       if(e.angles.x != 0 || e.angles.z != 0 || self.avelocity.x != 0 || self.avelocity.z != 0) // "weird" rotation
+{
+       if(e.angles.x != 0 || e.angles.z != 0 || e.avelocity.x != 0 || e.avelocity.z != 0) // "weird" rotation
        {
                e.maxs = '1 1 1' * vlen(
                        '1 0 0' * max(-e.mins.x, e.maxs.x) +
@@ -335,7 +325,7 @@ void ApplyMinMaxScaleAngles(entity e)
                );
                e.mins = -e.maxs;
        }
-       else if(e.angles.y != 0 || self.avelocity.y != 0) // yaw only is a bit better
+       else if(e.angles.y != 0 || e.avelocity.y != 0) // yaw only is a bit better
        {
                e.maxs_x = vlen(
                        '1 0 0' * max(-e.mins.x, e.maxs.x) +
@@ -351,43 +341,43 @@ void ApplyMinMaxScaleAngles(entity e)
                setsize(e, e.mins, e.maxs);
 }
 
-void SetBrushEntityModel()
-{SELFPARAM();
-       if(self.model != "")
+void SetBrushEntityModel(entity this)
+{
+       if(this.model != "")
        {
-               precache_model(self.model);
-               if(self.mins != '0 0 0' || self.maxs != '0 0 0')
+               precache_model(this.model);
+               if(this.mins != '0 0 0' || this.maxs != '0 0 0')
                {
-                       vector mi = self.mins;
-                       vector ma = self.maxs;
-                       _setmodel(self, self.model); // no precision needed
-                       setsize(self, mi, ma);
+                       vector mi = this.mins;
+                       vector ma = this.maxs;
+                       _setmodel(this, this.model); // no precision needed
+                       setsize(this, mi, ma);
                }
                else
-                       _setmodel(self, self.model); // no precision needed
-               InitializeEntity(self, LODmodel_attach, INITPRIO_FINDTARGET);
+                       _setmodel(this, this.model); // no precision needed
+               InitializeEntity(this, LODmodel_attach, INITPRIO_FINDTARGET);
        }
-       setorigin(self, self.origin);
-       ApplyMinMaxScaleAngles(self);
+       setorigin(this, this.origin);
+       ApplyMinMaxScaleAngles(this);
 }
 
-void SetBrushEntityModelNoLOD()
-{SELFPARAM();
-       if(self.model != "")
+void SetBrushEntityModelNoLOD(entity this)
+{
+       if(this.model != "")
        {
-               precache_model(self.model);
-               if(self.mins != '0 0 0' || self.maxs != '0 0 0')
+               precache_model(this.model);
+               if(this.mins != '0 0 0' || this.maxs != '0 0 0')
                {
-                       vector mi = self.mins;
-                       vector ma = self.maxs;
-                       _setmodel(self, self.model); // no precision needed
-                       setsize(self, mi, ma);
+                       vector mi = this.mins;
+                       vector ma = this.maxs;
+                       _setmodel(this, this.model); // no precision needed
+                       setsize(this, mi, ma);
                }
                else
-                       _setmodel(self, self.model); // no precision needed
+                       _setmodel(this, this.model); // no precision needed
        }
-       setorigin(self, self.origin);
-       ApplyMinMaxScaleAngles(self);
+       setorigin(this, this.origin);
+       ApplyMinMaxScaleAngles(this);
 }
 
 /*
@@ -409,41 +399,41 @@ void SetMovedir(entity this)
        this.angles = '0 0 0';
 }
 
-void InitTrigger()
-{SELFPARAM();
+void InitTrigger(entity this)
+{
 // trigger angles are used for one-way touches.  An angle of 0 is assumed
 // to mean no restrictions, so use a yaw of 360 instead.
-       SetMovedir(self);
-       self.solid = SOLID_TRIGGER;
-       SetBrushEntityModel();
-       self.movetype = MOVETYPE_NONE;
-       self.modelindex = 0;
-       self.model = "";
+       SetMovedir(this);
+       this.solid = SOLID_TRIGGER;
+       SetBrushEntityModel(this);
+       set_movetype(this, MOVETYPE_NONE);
+       this.modelindex = 0;
+       this.model = "";
 }
 
-void InitSolidBSPTrigger()
-{SELFPARAM();
+void InitSolidBSPTrigger(entity this)
+{
 // trigger angles are used for one-way touches.  An angle of 0 is assumed
 // to mean no restrictions, so use a yaw of 360 instead.
-       SetMovedir(self);
-       self.solid = SOLID_BSP;
-       SetBrushEntityModel();
-       self.movetype = MOVETYPE_NONE; // why was this PUSH? -div0
-//     self.modelindex = 0;
-       self.model = "";
+       SetMovedir(this);
+       this.solid = SOLID_BSP;
+       SetBrushEntityModel(this);
+       set_movetype(this, MOVETYPE_NONE); // why was this PUSH? -div0
+//     this.modelindex = 0;
+       this.model = "";
 }
 
-float InitMovingBrushTrigger()
-{SELFPARAM();
+bool InitMovingBrushTrigger(entity this)
+{
 // trigger angles are used for one-way touches.  An angle of 0 is assumed
 // to mean no restrictions, so use a yaw of 360 instead.
-       self.solid = SOLID_BSP;
-       SetBrushEntityModel();
-       self.movetype = MOVETYPE_PUSH;
-       if(self.modelindex == 0)
+       this.solid = SOLID_BSP;
+       SetBrushEntityModel(this);
+       set_movetype(this, MOVETYPE_PUSH);
+       if(this.modelindex == 0)
        {
-               objerror("InitMovingBrushTrigger: no brushes found!");
-               return 0;
+               objerror(this, "InitMovingBrushTrigger: no brushes found!");
+               return false;
        }
-       return 1;
+       return true;
 }