6 * Replicate a client cvar into a server field
8 * @param fld The field to replicate into
9 * @param type The field type
10 * @param cvar The cvar name
12 #define REPLICATE(...) EVAL_REPLICATE(OVERLOAD(REPLICATE, __VA_ARGS__))
13 #define EVAL_REPLICATE(...) __VA_ARGS__
16 ACCUMULATE void ReplicateVars(entity this, entity store, string thisname, int i) {}
18 ACCUMULATE void ReplicateVars(int mode) {}
21 #define REPLICATE_3(fld, type, var) REPLICATE_4(fld, type, var, )
22 #define REPLICATE_4(fld, type, var, func) REPLICATE_##type(fld, var, func)
24 #define REPLICATE_string(fld, var, func) \
25 REPLICATE_7(fld, string, var, , \
26 { strcpy(field, it); }, \
27 { strfree(field); }, \
29 /* also initialize to the default value of func when requesting cvars */ \
30 string s = func(field); \
36 #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, { field = stof(it); }, , )
37 #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, { field = boolean(stoi(it)); }, , )
38 #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, { field = stoi(it); }, , )
40 #define REPLICATE_7(fld, type, var, func, create, destroy, after) \
41 void ReplicateVars(entity this, entity store, string thisname, int i) \
43 type field = store.fld; \
44 if (i < 0) { destroy } \
47 string it = func(argv(i + 1)); \
48 bool current = thisname == var; \
51 if (current) { create } \
55 stuffcmd(this, strcat("cl_cmd sendcvar ", var, "\n")); \
57 if (current) { after } \
62 noref float ReplicateVars_time;
63 #define ReplicateVars_NOT_SENDING() (time > ReplicateVars_time)
64 #define ReplicateVars_DELAY(t) ReplicateVars_time = time + t
65 #define ReplicateVars_DELAY_1FRAME() ReplicateVars_time = time
66 #define REPLICATE_string(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar_string(var)), { strcpy(fld, cvar_string(var)); }, { strfree(fld); })
67 #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
68 #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
69 #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
71 void ReplicateVars_Destroy() { ReplicateVars(1); }
72 void ReplicateVars_Send_All() { ReplicateVars(-1); }
73 void ReplicateVars_Check()
75 // if a cvar has changed send it and check cvars again next frame
77 if (ReplicateVars_NOT_SENDING()) // if no cvar has changed
78 ReplicateVars_DELAY(0.8 + random() * 0.4); // check cvars after a while
80 void ReplicateVars_Send(string cvarname) { localcmd(strcat("cl_cmd sendcvar ", cvarname, "\n")); }
82 #define REPLICATE_7(fld, type, var, func, check, update, destroy) \
83 void ReplicateVars(int mode) \
85 if (mode == 1) { destroy } \
86 else if (mode == -1) { ReplicateVars_Send(var); update } \
87 else if (ReplicateVars_NOT_SENDING() && check) \
89 ReplicateVars_Send(var); \
90 ReplicateVars_DELAY_1FRAME(); \
96 #define REPLICATE_SIMPLE(field, cvarname) MACRO_BEGIN \
97 if (ReplicateVars_NOT_SENDING()) \
99 float thecvar = cvar(cvarname); \
100 if(field != thecvar) \
102 ReplicateVars_Send(cvarname); \
103 ReplicateVars_DELAY_1FRAME(); \