From 9910dcfe9d678de703aa6808822aec00d3fb1757 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 23 Sep 2020 03:01:44 +1000 Subject: [PATCH] Move expr_evaluate to cvar.qh in lib --- qcsrc/lib/cvar.qh | 70 +++++++++++++++++++++++++++++++++++++++++++ qcsrc/server/main.qc | 69 ------------------------------------------ qcsrc/server/world.qc | 1 + 3 files changed, 71 insertions(+), 69 deletions(-) diff --git a/qcsrc/lib/cvar.qh b/qcsrc/lib/cvar.qh index 4b292a3a5..d5b47ce43 100644 --- a/qcsrc/lib/cvar.qh +++ b/qcsrc/lib/cvar.qh @@ -30,6 +30,76 @@ string MakeConsoleSafe(string input) return input; } +/** + * Evaluate an expression of the form: [+ | -]? [var[op]val | [op]var | val | var] ... + * +: all must match. this is the default + * -: one must NOT match + * + * var>x + * var=x + * var<=x + * var==x + * var!=x + * var===x + * var!==x + */ +ERASEABLE +bool expr_evaluate(string s) +{ + bool ret = false; + if (str2chr(s, 0) == '+') { + s = substring(s, 1, -1); + } else if (str2chr(s, 0) == '-') { + ret = true; + s = substring(s, 1, -1); + } + bool expr_fail = false; + for (int i = 0, n = tokenize_console(s); i < n; ++i) { + int o; + string k, v; + s = argv(i); + #define X(expr) \ + if (expr) \ + continue; \ + expr_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)); + BINOP("===", 3, cvar_string(k) == v); + BINOP("!==", 3, cvar_string(k) != v); + { + k = s; + bool b = true; + if (str2chr(k, 0) == '!') { + k = substring(s, 1, -1); + b = false; + } + float f = stof(k); + bool isnum = ftos(f) == k; + X(boolean(isnum ? f : cvar(k)) == b); + } + #undef BINOP + #undef X + } + if (!expr_fail) { + ret = !ret; + } + // now ret is true if we want to keep the item, and false if we want to get rid of it + return ret; +} + ERASEABLE void RegisterCvars_Set(string name, string def, string desc, bool archive, string file) { diff --git a/qcsrc/server/main.qc b/qcsrc/server/main.qc index 351cf738d..359456b39 100644 --- a/qcsrc/server/main.qc +++ b/qcsrc/server/main.qc @@ -271,75 +271,6 @@ void StartFrame() .string gametypefilter; .string cvarfilter; -/** - * Evaluate an expression of the form: [+ | -]? [var[op]val | [op]var | val | var] ... - * +: all must match. this is the default - * -: one must NOT match - * - * var>x - * var=x - * var<=x - * var==x - * var!=x - * var===x - * var!==x - */ -bool expr_evaluate(string s) -{ - bool ret = false; - if (str2chr(s, 0) == '+') { - s = substring(s, 1, -1); - } else if (str2chr(s, 0) == '-') { - ret = true; - s = substring(s, 1, -1); - } - bool expr_fail = false; - for (int i = 0, n = tokenize_console(s); i < n; ++i) { - int o; - string k, v; - s = argv(i); - #define X(expr) \ - if (expr) \ - continue; \ - expr_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)); - BINOP("===", 3, cvar_string(k) == v); - BINOP("!==", 3, cvar_string(k) != v); - { - k = s; - bool b = true; - if (str2chr(k, 0) == '!') { - k = substring(s, 1, -1); - b = false; - } - float f = stof(k); - bool isnum = ftos(f) == k; - X(boolean(isnum ? f : cvar(k)) == b); - } - #undef BINOP - #undef X - } - if (!expr_fail) { - ret = !ret; - } - // now ret is true if we want to keep the item, and false if we want to get rid of it - return ret; -} - void SV_OnEntityPreSpawnFunction(entity this) { if (this) diff --git a/qcsrc/server/world.qc b/qcsrc/server/world.qc index c37998545..89c478ab7 100644 --- a/qcsrc/server/world.qc +++ b/qcsrc/server/world.qc @@ -2099,6 +2099,7 @@ void Physics_Frame() // make a second pass to see if any ents spawned this frame and make // sure they run their move/think. this is verified by checking .move_time, which will never be 0 if the entity has moved + // MOVETYPE_NONE is also checked as .move_time WILL be 0 with that movetype IL_EACH(g_moveables, it.move_qcphysics, { if(IS_CLIENT(it) || it.move_time || it.move_movetype == MOVETYPE_NONE || it.move_movetype == MOVETYPE_PHYSICS) -- 2.39.2