]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
spawnfuncs: simplify SV_OnEntityPreSpawnFunction
authorTimePath <andrew.hardaker1995@gmail.com>
Sun, 27 Aug 2017 11:40:42 +0000 (21:40 +1000)
committerTimePath <andrew.hardaker1995@gmail.com>
Fri, 1 Sep 2017 09:53:55 +0000 (19:53 +1000)
qcsrc/server/sv_main.qc

index 1a5c8e5511420bbd00c066e37f9a641660f4ad69..7d27e0298a97d82678a48678c000c86c97ac2c65 100644 (file)
@@ -255,30 +255,23 @@ void SV_OnEntityPreSpawnFunction(entity this)
        if (this.gametypefilter != "")
        if (!isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, this.gametypefilter))
        {
-               delete(this);
-               __spawnfunc_expecting = false;
-               return;
+               goto cleanup;
        }
-       if(this.cvarfilter != "")
-       {
-               float n, i, o, inv;
-               string s, k, v;
-               inv = 0;
+       if (this.cvarfilter != "") {
+               bool inv = false;
 
-               s = this.cvarfilter;
-               if(substring(s, 0, 1) == "+")
-               {
+               string s = this.cvarfilter;
+               if (str2chr(s, 0) == '+') {
                        s = substring(s, 1, -1);
-               }
-               else if(substring(s, 0, 1) == "-")
-               {
-                       inv = 1;
+               } else if(str2chr(s, 0) == '-') {
+                       inv = true;
                        s = substring(s, 1, -1);
                }
 
-               n = tokenize_console(s);
-               for(i = 0; i < n; ++i)
-               {
+        bool cvar_fail = false;
+               for (int i = 0, n = tokenize_console(s); i < n; ++i) {
+                   int o;
+            string k, v;
                        s = argv(i);
                        // syntax:
                        // var>x
@@ -289,126 +282,74 @@ void SV_OnEntityPreSpawnFunction(entity this)
                        // var!=x
                        // var===x
                        // var!==x
-                       if((o = strstrofs(s, ">=", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+2, -1);
-                               if(cvar(k) < stof(v))
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, "<=", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+2, -1);
-                               if(cvar(k) > stof(v))
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, ">", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+1, -1);
-                               if(cvar(k) <= stof(v))
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, "<", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+1, -1);
-                               if(cvar(k) >= stof(v))
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, "==", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+2, -1);
-                               if(cvar(k) != stof(v))
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, "!=", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+2, -1);
-                               if(cvar(k) == stof(v))
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, "===", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+2, -1);
-                               if(cvar_string(k) != v)
-                                       goto cvar_fail;
-                       }
-                       else if((o = strstrofs(s, "!==", 0)) >= 0)
-                       {
-                               k = substring(s, 0, o);
-                               v = substring(s, o+2, -1);
-                               if(cvar_string(k) == v)
-                                       goto cvar_fail;
-                       }
-                       else if(substring(s, 0, 1) == "!")
-                       {
-                               k = substring(s, 1, -1);
-                               if(cvar(k))
-                                       goto cvar_fail;
-                       }
-                       else
-                       {
-                               k = s;
-                               if (!cvar(k))
-                                       goto cvar_fail;
-                       }
+                       #define X(expr) \
+                           if (expr) { \
+                    continue; \
+                } else { \
+                    cvar_fail = true; \
+                    break; \
+                }
+                       #define BINOP(op, len, expr) \
+                           if ((o = strstrofs(s, op, 0)) >= 0) { \
+                    k = substring(s, 0, o); \
+                    v = substring(s, o + len, -1); \
+                    X(expr); \
+                }
+            BINOP(">=", 2, cvar(k) >= stof(v));
+            BINOP("<=", 2, cvar(k) <= stof(v));
+            BINOP(">",  1, cvar(k) >  stof(v));
+            BINOP("<",  1, cvar(k) <  stof(v));
+            BINOP("==", 2, cvar(k) == stof(v));
+            BINOP("!=", 2, cvar(k) != stof(v));
+            // fixme: did these two ever work?
+            BINOP("===", 2, cvar_string(k) == v);
+            BINOP("!==", 2, cvar_string(k) != v);
+            if (str2chr(s, 0) == '!') { k = substring(s, 1, -1); X(!cvar(k)); }
+            { k = s; X(cvar(k)); }
+                       #undef BINOP
+                       #undef X
                }
-               inv = !inv;
-LABEL(cvar_fail)
-               // now inv is 1 if we want to keep the item, and 0 if we want to get rid of it
-               if (!inv)
-               {
-                       //print("cvarfilter fail\n");
-                       delete(this);
-                       __spawnfunc_expecting = false;
-                       return;
+               if (!cvar_fail) {
+                   inv = !inv;
+               }
+               // now inv is true if we want to keep the item, and false if we want to get rid of it
+               if (!inv) {
+                       goto cleanup;
                }
        }
 
-       if(DoesQ3ARemoveThisEntity(this))
-       {
-               delete(this);
-               __spawnfunc_expecting = false;
-               return;
+       if (DoesQ3ARemoveThisEntity(this)) {
+               goto cleanup;
        }
 
        set_movetype(this, this.movetype);
 
-       if(this.monster_attack)
+       if (this.monster_attack) {
                IL_PUSH(g_monster_targets, this);
+    }
 
        // support special -1 and -2 angle from radiant
-       if (this.angles == '0 -1 0')
+       if (this.angles == '0 -1 0') {
                this.angles = '-90 0 0';
-       else if (this.angles == '0 -2 0')
+       } else if (this.angles == '0 -2 0') {
                this.angles = '+90 0 0';
-
-       if(this.originjitter.x != 0)
-               this.origin_x = this.origin.x + (random() * 2 - 1) * this.originjitter.x;
-       if(this.originjitter.y != 0)
-               this.origin_y = this.origin.y + (random() * 2 - 1) * this.originjitter.y;
-       if(this.originjitter.z != 0)
-               this.origin_z = this.origin.z + (random() * 2 - 1) * this.originjitter.z;
-       if(this.anglesjitter.x != 0)
-               this.angles_x = this.angles.x + (random() * 2 - 1) * this.anglesjitter.x;
-       if(this.anglesjitter.y != 0)
-               this.angles_y = this.angles.y + (random() * 2 - 1) * this.anglesjitter.y;
-       if(this.anglesjitter.z != 0)
-               this.angles_z = this.angles.z + (random() * 2 - 1) * this.anglesjitter.z;
-       if(this.anglejitter != 0)
-               this.angles_y = this.angles.y + (random() * 2 - 1) * this.anglejitter;
-
-       if(MUTATOR_CALLHOOK(OnEntityPreSpawn, this))
-       {
-               delete(this);
-               __spawnfunc_expecting = false;
-               return;
+    }
+
+    #define X(out, in) MACRO_BEGIN \
+        if (in != 0) { out = out + (random() * 2 - 1) * in; } \
+    MACRO_END
+    X(this.origin.x, this.originjitter.x); X(this.origin.y, this.originjitter.y); X(this.origin.z, this.originjitter.z);
+    X(this.angles.x, this.anglesjitter.x); X(this.angles.y, this.anglesjitter.y); X(this.angles.z, this.anglesjitter.z);
+    X(this.angles.y, this.anglejitter);
+    #undef X
+
+       if (MUTATOR_CALLHOOK(OnEntityPreSpawn, this)) {
+               goto cleanup;
        }
+       return;
+LABEL(cleanup)
+    delete(this);
+    __spawnfunc_expecting = false;
 }
 
 void WarpZone_PostInitialize_Callback()