+#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