]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/replicate.qh
Merge branch 'master' into terencehill/menu_gametype_tooltips_2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / replicate.qh
1 #ifndef REPLICATE_H
2 #define REPLICATE_H
3 #ifndef MENUQC
4
5 #define REPLICATE(...) EVAL(OVERLOAD(REPLICATE, __VA_ARGS__))
6
7 [[accumulate]] void ReplicateVars(entity this, string thisname, int i) { }
8
9 #define REPLICATE_3(fld, type, var)         REPLICATE_4(fld, type, var, )
10 #define REPLICATE_4(fld, type, var, func)   REPLICATE_##type(fld, var, func)
11 #define REPLICATE_string(fld, var, func)    REPLICATE_7(fld, string, var, , \
12     { if (field) strunzone(field); field = strzone(it); }, \
13     { if (field) strunzone(field); field = string_null; }, \
14     { \
15         /* also initialize to the default value of func when requesting cvars */ \
16         string s = func(field); \
17         if (s != field) { \
18             strunzone(field); \
19             field = strzone(s); \
20         } \
21     })
22 #define REPLICATE_float(fld, var, func)     REPLICATE_7(fld, float, var, func,  { field = stof(it); },          , )
23 #define REPLICATE_bool(fld, var, func)      REPLICATE_7(fld, bool, var, func,   { field = boolean(stoi(it)); }, , )
24 #define REPLICATE_int(fld, var, func)       REPLICATE_7(fld, int, var, func,    { field = stoi(it); },          , )
25
26 #if defined(SVQC)
27     #define REPLICATE_7(fld, type, var, func, create, destroy, after) \
28         void ReplicateVars(entity this, string thisname, int i) { \
29             type field = this.fld; \
30             if (i < 0) { destroy } \
31             else { \
32                 string it = func(argv(i + 1)); \
33                 bool current = thisname == var; \
34                 if (i > 0) { \
35                     if (current) { create } \
36                 } else { \
37                     stuffcmd(this, "cl_cmd sendcvar " var "\n"); \
38                 } \
39                 if (current) { after } \
40             } \
41             this.fld = field; \
42         }
43 #elif defined(CSQC)
44     // TODO
45     #define REPLICATE_7(fld, type, var, func, create, destroy, after)
46 #endif
47
48 #endif
49 #endif