X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fbase.qh;h=c1f7501c9bc5528536590c5e3b9cd4082e2afd9c;hb=65f79cc103dac145eebf7c179a16408935c176b9;hp=6e06e5590943b0c5a7619b96d46a5fcfa8876181;hpb=f1a87492d9fed27a64d0e99c068705aba5509f26;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/base.qh b/qcsrc/common/mutators/base.qh index 6e06e5590..c1f7501c9 100644 --- a/qcsrc/common/mutators/base.qh +++ b/qcsrc/common/mutators/base.qh @@ -112,7 +112,7 @@ ENDCLASS(CallbackChain) #define _MUTATOR_HANDLE_NOP(type, id) #define _MUTATOR_HANDLE_PARAMS(type, id) , type in_##id #define _MUTATOR_HANDLE_PREPARE(type, id) id = in_##id; -#define _MUTATOR_HANDLE_PUSHTMP(type, id) type tmp_##id = id; +#define _MUTATOR_HANDLE_PUSHTMP(type, id) TC(type, id); type tmp_##id = id; #define _MUTATOR_HANDLE_PUSHOUT(type, id) type out_##id = id; #define _MUTATOR_HANDLE_POPTMP(type, id) id = tmp_##id; #define _MUTATOR_HANDLE_POPOUT(type, id) id = out_##id; @@ -120,9 +120,10 @@ ENDCLASS(CallbackChain) void RegisterHooks() {}; void RegisterCallbacks() {}; -#define _MUTATOR_HOOKABLE(id, ...) CallbackChain HOOK_##id; bool __Mutator_Send_##id(__VA_ARGS__) -#define MUTATOR_HOOKABLE(id, params) \ - _MUTATOR_HOOKABLE(id, int params(_MUTATOR_HANDLE_PARAMS, _MUTATOR_HANDLE_NOP)) { \ +#define MUTATOR_HOOKABLE(id, params) _MUTATOR_HOOKABLE(id, params) +#define _MUTATOR_HOOKABLE(id, params) \ + CallbackChain HOOK_##id; \ + bool __Mutator_Send_##id(int params(_MUTATOR_HANDLE_PARAMS, _MUTATOR_HANDLE_NOP)) { \ params(_MUTATOR_HANDLE_PUSHTMP, _MUTATOR_HANDLE_NOP) \ params(_MUTATOR_HANDLE_PREPARE, _MUTATOR_HANDLE_NOP) \ bool ret = CallbackChain_Call(HOOK_##id); \ @@ -132,7 +133,13 @@ void RegisterCallbacks() {}; return ret; \ } \ [[accumulate]] void RegisterHooks() { HOOK_##id = NEW(CallbackChain, #id); } -#define MUTATOR_CALLHOOK(id, ...) APPLY(__Mutator_Send_##id, 0, ##__VA_ARGS__) + +#define MUTATOR_CALLHOOK(id, ...) _MUTATOR_CALLHOOK(id, __VA_ARGS__) +#ifdef __STDC__ + #define _MUTATOR_CALLHOOK(id, ...) APPLY(__Mutator_Send_##id, 0 P99_IF_EMPTY(__VA_ARGS__)()(, __VA_ARGS__)) +#else + #define _MUTATOR_CALLHOOK(id, ...) APPLY(__Mutator_Send_##id, 0, ##__VA_ARGS__) +#endif enum { MUTATOR_REMOVING, @@ -140,7 +147,7 @@ enum { MUTATOR_ROLLING_BACK }; -typedef bool(int) mutatorfunc_t; +USING(mutatorfunc_t, bool(int)); CLASS(Mutator, Object) ATTRIB(Mutator, m_id, int, 0) @@ -162,6 +169,7 @@ void Mutator_Remove(Mutator mut); bool mutator_log = false; #ifndef MENUQC +/** server mutators activate corresponding client mutators for all clients */ REGISTER_NET_LINKED(Mutator) #ifdef SVQC @@ -175,16 +183,16 @@ bool Mutator_SendEntity(entity this, entity to, int sf) #endif #ifdef CSQC -void NET_Mutator_Remove() +void NET_Mutator_Remove(entity this) { - SELFPARAM(); string s = this.netname; WITH(bool, mutator_log, true, LAMBDA( - FOREACH(Mutators, it.registered_id == s, LAMBDA(Mutator_Remove(it))); + FOREACH(Mutators, it.registered_id == s, Mutator_Remove(it)); )); } NET_HANDLE(Mutator, bool isNew) { + make_pure(this); string s = this.netname = ReadString(); return = true; if (isNew) @@ -193,7 +201,7 @@ NET_HANDLE(Mutator, bool isNew) this.entremove = NET_Mutator_Remove; int added = 0; WITH(bool, mutator_log, true, LAMBDA( - FOREACH(Mutators, it.registered_id == s, LAMBDA(Mutator_Add(it); ++added)); + FOREACH(Mutators, it.registered_id == s, { Mutator_Add(it); ++added; }); )); if (added > 1) LOG_WARNINGF("Added more than one mutator for %s\n", s); } @@ -273,7 +281,7 @@ STATIC_INIT(Mutators) { } STATIC_INIT_LATE(Mutators) { - FOREACH(Mutators, it.mutatorcheck(), LAMBDA(Mutator_Add(it))); + FOREACH(Mutators, it.mutatorcheck(), Mutator_Add(it)); } #define MUTATOR_ONADD if (mode == MUTATOR_ADDING) @@ -289,7 +297,8 @@ STATIC_INIT_LATE(Mutators) { [[accumulate]] void RegisterCallbacks() { CALLBACK_##name = NEW(Callback, func); } #define MUTATOR_HOOKFUNCTION(...) \ - EVAL(OVERLOAD(MUTATOR_HOOKFUNCTION, __VA_ARGS__)) + EVAL_MUTATOR_HOOKFUNCTION(OVERLOAD(MUTATOR_HOOKFUNCTION, __VA_ARGS__)) +#define EVAL_MUTATOR_HOOKFUNCTION(...) __VA_ARGS__ #define MUTATOR_HOOKFUNCTION_2(mut, cb) \ MUTATOR_HOOKFUNCTION_3(mut, cb, CBC_ORDER_ANY)