From 3793971858387b53220a57d26041eda6f89c29dd Mon Sep 17 00:00:00 2001 From: TimePath Date: Sun, 27 Aug 2017 21:40:42 +1000 Subject: [PATCH] spawnfuncs: simplify SV_OnEntityPreSpawnFunction --- qcsrc/server/sv_main.qc | 189 ++++++++++++++-------------------------- 1 file changed, 65 insertions(+), 124 deletions(-) diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 1a5c8e551..7d27e0298 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -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() -- 2.39.2