X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Freplicate.qh;h=019194a6d55df61e608e4fe9d6c126fb73ed08ad;hb=93afc08b09294e6dea4d0c98ce5226fdee9d1c92;hp=a36466d2e0ffb8daca62e22bd35706bbeb5e761a;hpb=e424ba544c41fc40b241b17bd7c1d9c2fc930705;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/replicate.qh b/qcsrc/lib/replicate.qh index a36466d2e..019194a6d 100644 --- a/qcsrc/lib/replicate.qh +++ b/qcsrc/lib/replicate.qh @@ -12,32 +12,35 @@ #define REPLICATE(...) EVAL_REPLICATE(OVERLOAD(REPLICATE, __VA_ARGS__)) #define EVAL_REPLICATE(...) __VA_ARGS__ - [[accumulate]] void ReplicateVars(entity this, string thisname, int i) {} + #if defined(SVQC) + ACCUMULATE void ReplicateVars(entity this, entity store, string thisname, int i) {} + #elif defined(CSQC) + ACCUMULATE void ReplicateVars(bool would_destroy) {} + #endif #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) \ + #if defined(SVQC) + #define REPLICATE_string(fld, var, func) \ + REPLICATE_7(fld, string, var, , \ + { strcpy(field, it); }, \ + { strfree(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); }, , ) + /* also initialize to the default value of func when requesting cvars */ \ + string s = func(field); \ + if (s != field) \ + { \ + strcpy(field, 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) \ + void ReplicateVars(entity this, entity store, string thisname, int i) \ { \ - type field = this.fld; \ + type field = store.fld; \ if (i < 0) { destroy } \ else \ { \ @@ -49,15 +52,48 @@ } \ else \ { \ - stuffcmd(this, "cl_cmd sendcvar " var "\n"); \ + stuffcmd(this, strcat("cl_cmd sendcvar ", var, "\n")); \ } \ if (current) { after } \ } \ - this.fld = field; \ + store.fld = field; \ } #elif defined(CSQC) - // TODO - #define REPLICATE_7(fld, type, var, func, create, destroy, after) + noref float ReplicateVars_time; + #define ReplicateVars_NOT_SENDING() (time > ReplicateVars_time) + #define ReplicateVars_DELAY(t) ReplicateVars_time = time + t + #define ReplicateVars_DELAY_1FRAME() ReplicateVars_time = time + #define REPLICATE_string(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar_string(var)), { strcpy(fld, cvar_string(var)); }, { strfree(fld); }) + #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar(var)), { fld = cvar(var); }, ) + #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, (fld != cvar(var)), { fld = cvar(var); }, ) + #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, (fld != cvar(var)), { fld = cvar(var); }, ) + + #define REPLICATE_7(fld, type, var, func, check, update, destroy) \ + void ReplicateVars(bool would_destroy) \ + { \ + if (would_destroy) { destroy } \ + else if (ReplicateVars_NOT_SENDING() && check) \ + { \ + localcmd(strcat("cl_cmd sendcvar ", var, "\n")); \ + ReplicateVars_DELAY_1FRAME(); \ + update \ + return; \ + } \ + } + + #define REPLICATE_SIMPLE(field, cvarname) MACRO_BEGIN \ + if (ReplicateVars_NOT_SENDING()) \ + { \ + float thecvar = cvar(cvarname); \ + if(field != thecvar) \ + { \ + localcmd(strcat("cl_cmd sendcvar ", cvarname, "\n")); \ + ReplicateVars_DELAY_1FRAME(); \ + field = thecvar; \ + return; \ + } \ + } \ + MACRO_END #endif #endif