4 // copies a string to a tempstring (so one can strunzone it)
5 string strcat1(string s) = #115; // FRIK_FILE
9 #define REPLICATE_FIELD(type, name) type name
11 #define REPLICATE_FIELD(type, name) .type name
17 * Replicate a client cvar into a server field
19 * @param fld The field to replicate into
20 * @param type The field type
21 * @param cvar The cvar name
23 #define REPLICATE(...) EVAL_REPLICATE(OVERLOAD(REPLICATE, __VA_ARGS__))
24 #define EVAL_REPLICATE(...) __VA_ARGS__
27 ACCUMULATE void ReplicateVars(entity this, entity store, string thisname, int i) {}
29 ACCUMULATE void ReplicateVars(int mode) {}
32 #define REPLICATE_3(fld, type, var) REPLICATE_4(fld, type, var, )
33 #define REPLICATE_4(fld, type, var, func) REPLICATE_##type(fld, var, func)
35 #define REPLICATE_string(fld, var, func) \
36 REPLICATE_7(fld, string, var, , \
37 { strcpy(field, it); }, \
38 { strfree(field); }, \
40 /* also initialize to the default value of func when requesting cvars */ \
41 string s = func(this, strcat1(field)); \
47 #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, { field = stof(it); }, , )
48 #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, { field = boolean(stoi(it)); }, , )
49 #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, { field = stoi(it); }, , )
51 #define REPLICATE_7(fld, type, var, func, create, destroy, after) \
52 void ReplicateVars(entity this, entity store, string thisname, int i) \
54 type field = store.fld; \
55 if (i < 0) { destroy } \
58 string it = func(argv(i + 1)); \
59 bool current = thisname == var; \
62 if (current) { create } \
66 stuffcmd(this, strcat("cl_cmd sendcvar ", var, "\n")); \
68 if (current) { after } \
73 noref float ReplicateVars_time;
74 #define ReplicateVars_NOT_SENDING() (time > ReplicateVars_time)
75 #define ReplicateVars_DELAY(t) ReplicateVars_time = time + t
76 #define ReplicateVars_DELAY_1FRAME() ReplicateVars_time = time
77 #define REPLICATE_string(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar_string(var)), { strcpy(fld, cvar_string(var)); }, { strfree(fld); })
78 #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
79 #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
80 #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
82 void ReplicateVars_Destroy() { ReplicateVars(1); }
83 void ReplicateVars_Send_All() { ReplicateVars(-1); }
84 void ReplicateVars_Check()
86 // if a cvar has changed send it and check cvars again next frame
88 if (ReplicateVars_NOT_SENDING()) // if no cvar has changed
89 ReplicateVars_DELAY(0.8 + random() * 0.4); // check cvars after a while
91 void ReplicateVars_Send(string cvarname) { localcmd(strcat("cl_cmd sendcvar ", cvarname, "\n")); }
93 #define REPLICATE_7(fld, type, var, func, check, update, destroy) \
94 void ReplicateVars(int mode) \
96 if (mode == 1) { destroy } \
97 else if (mode == -1) { ReplicateVars_Send(var); update } \
98 else if (ReplicateVars_NOT_SENDING() && check) \
100 ReplicateVars_Send(var); \
101 ReplicateVars_DELAY_1FRAME(); \
107 #define REPLICATE_SIMPLE(field, cvarname) MACRO_BEGIN \
108 if (ReplicateVars_NOT_SENDING()) \
110 float thecvar = cvar(cvarname); \
111 if(field != thecvar) \
113 ReplicateVars_Send(cvarname); \
114 ReplicateVars_DELAY_1FRAME(); \