X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Freplicate.qh;h=a88bde462934134f3585707eff76e81303e8d6c2;hb=e0012447bfce1b551df3dc01b043655aa93dafad;hp=656989782672e60c948199c0b8deb94f2f10b0a6;hpb=e51ce3d45d2852ca793118fc73da9c25f789101f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/replicate.qh b/qcsrc/lib/replicate.qh index 656989782..a88bde462 100644 --- a/qcsrc/lib/replicate.qh +++ b/qcsrc/lib/replicate.qh @@ -12,27 +12,31 @@ #define REPLICATE(...) EVAL_REPLICATE(OVERLOAD(REPLICATE, __VA_ARGS__)) #define EVAL_REPLICATE(...) __VA_ARGS__ + #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, , \ - { strcpy(field, it); }, \ - { strfree(field); }, \ - { \ - /* 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); }, \ { \ - 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); }, , ) + /* 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, entity store, string thisname, int i) \ { \ @@ -48,15 +52,44 @@ } \ else \ { \ - stuffcmd(this, "cl_cmd sendcvar " var "\n"); \ + stuffcmd(this, strcat("cl_cmd sendcvar ", var, "\n")); \ } \ if (current) { after } \ } \ store.fld = field; \ } #elif defined(CSQC) - // TODO - #define REPLICATE_7(fld, type, var, func, create, destroy, after) + 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() && field != cvar(cvarname)) \ + { \ + localcmd(strcat("cl_cmd sendcvar ", cvarname, "\n")); \ + ReplicateVars_DELAY_1FRAME(); \ + field = cvar(cvarname); \ + return; \ + } \ + MACRO_END #endif #endif