X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Freplicate.qh;h=31177426066b5b1a78b6ea9cf3b271caad0bd74d;hb=d4a342bf6f9ba1f3eeaf5b5efc658a068fd4d718;hp=f69b6072bea77316d2b5154a20cf760e92cd3c54;hpb=eac60648c4017e495060dd3ba9e50ac4bad5000a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/replicate.qh b/qcsrc/lib/replicate.qh index f69b6072b..311774260 100644 --- a/qcsrc/lib/replicate.qh +++ b/qcsrc/lib/replicate.qh @@ -1,6 +1,6 @@ #pragma once -#ifndef MENUQC +#ifdef GAMEQC /** * Replicate a client cvar into a server field @@ -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) + 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