From: TimePath Date: Thu, 24 Sep 2015 11:59:05 +0000 (+1000) Subject: ReplicateVars, a more flexible GetCvars X-Git-Tag: xonotic-v0.8.2~1919 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=a8f2b876374839f2b0b2b5d57ccde8bd5aa288c6 ReplicateVars, a more flexible GetCvars --- diff --git a/qcsrc/lib/_all.inc b/qcsrc/lib/_all.inc index aa541bd69e..668e7decd6 100644 --- a/qcsrc/lib/_all.inc +++ b/qcsrc/lib/_all.inc @@ -19,6 +19,7 @@ #include "prandom.qc" #include "progname.qh" #include "registry.qh" +#include "replicate.qh" #include "sortlist.qc" #include "static.qh" #include "string.qh" diff --git a/qcsrc/lib/replicate.qh b/qcsrc/lib/replicate.qh new file mode 100644 index 0000000000..6ff77139f8 --- /dev/null +++ b/qcsrc/lib/replicate.qh @@ -0,0 +1,49 @@ +#ifndef REPLICATE_H +#define REPLICATE_H +#ifndef MENUQC + +#define REPLICATE(...) EVAL(OVERLOAD(REPLICATE, __VA_ARGS__)) + +[[accumulate]] void ReplicateVars(entity this, string thisname, int i) { } + +#define REPLICATE_3(fld, type, var) REPLICATE_4(fld, type, var, ) +#define REPLICATE_4(fld, type, var, func) REPLICATE_##type(fld, var, func) +#define REPLICATE_string(fld, var, func) REPLICATE_7(fld, string, var, , \ + { if (field) strunzone(field); field = strzone(it); }, \ + { if (field) strunzone(field); field = string_null; }, \ + { \ + /* also initialize to the default value of func when requesting cvars */ \ + string s = func(field); \ + if (s != field) { \ + strunzone(field); \ + field = strzone(s); \ + } \ + }) +#define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, { field = stof(it); }, , ) +#define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, { field = boolean(stoi(it)); }, , ) +#define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, { field = stoi(it); }, , ) + +#if defined(SVQC) + #define REPLICATE_7(fld, type, var, func, create, destroy, after) \ + void ReplicateVars(entity this, string thisname, int i) { \ + type field = this.fld; \ + if (i < 0) { destroy } \ + else { \ + string it = func(argv(i + 1)); \ + bool current = thisname == var; \ + if (i > 0) { \ + if (current) { create } \ + } else { \ + stuffcmd(this, "cl_cmd sendcvar " var "\n"); \ + } \ + if (current) { after } \ + } \ + this.fld = field; \ + } +#elif defined(CSQC) + // TODO + #define REPLICATE_7(fld, type, var, func, create, destroy, after) +#endif + +#endif +#endif diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 356a2b74af..eb8277abc2 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -417,6 +417,8 @@ void GetCvars(float f) Notification_GetCvars(); + ReplicateVars(this, s, f); + GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch"); GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot"); GetCvars_handleFloat(s, f, cvar_cl_jetpack_jump, "cl_jetpack_jump");