]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mutators/base.qh
Merge branch 'master' into TimePath/csqc_viewmodels
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / base.qh
index 270e1d8740fc915c393003e9345207c2eccdf2a2..07a3c82375e7d3813d0f6fdcc6225fb0dae476bb 100644 (file)
@@ -24,7 +24,6 @@ CLASS(Callback, Object)
     CONSTRUCTOR(Callback, bool() func) {
         CONSTRUCT(Callback);
         this.cbc_func = func;
-        return this;
     }
 ENDCLASS(Callback)
 
@@ -40,16 +39,14 @@ CLASS(CallbackChain, Object)
             CONSTRUCT(CallbackNode);
             this.cbc = it;
             this.cbc_order = order;
-            return this;
         }
     ENDCLASS(CallbackNode)
 
     ATTRIB(CallbackChain, cbc_next, CallbackNode, NULL)
     ATTRIB(CallbackChain, cbc_order, int, 0)
-    CONSTRUCTOR(CallbackChain, string name) {
+    CONSTRUCTOR(CallbackChain, string _name) {
         CONSTRUCT(CallbackChain);
-        this.netname = name;
-        return this;
+        this.netname = _name;
     }
 
     bool CallbackChain_Add(CallbackChain this, Callback cb, int order)
@@ -120,6 +117,9 @@ ENDCLASS(CallbackChain)
 #define _MUTATOR_HANDLE_POPTMP(type, id) id = tmp_##id;
 #define _MUTATOR_HANDLE_POPOUT(type, id) id = out_##id;
 
+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)) { \
@@ -131,7 +131,7 @@ ENDCLASS(CallbackChain)
         params(_MUTATOR_HANDLE_NOP,     _MUTATOR_HANDLE_POPOUT) \
         return ret; \
     } \
-    STATIC_INIT(HOOK_##id) { HOOK_##id = NEW(CallbackChain, #id); }
+    [[accumulate]] void RegisterHooks() { HOOK_##id = NEW(CallbackChain, #id); }
 #define MUTATOR_CALLHOOK(id, ...) APPLY(__Mutator_Send_##id, 0, ##__VA_ARGS__)
 
 enum {
@@ -144,24 +144,24 @@ typedef bool(int) mutatorfunc_t;
 
 CLASS(Mutator, Object)
     ATTRIB(Mutator, m_id, int, 0)
-    ATTRIB(Mutator, mutatorname, string, string_null)
+    ATTRIB(Mutator, m_name, string, string_null)
     ATTRIB(Mutator, mutatorfunc, mutatorfunc_t, func_null)
-    METHOD(Mutator, mutatorcheck, bool())
-    CONSTRUCTOR(Mutator, string name, mutatorfunc_t func) {
+    ATTRIB(Mutator, mutatorcheck, bool(), func_null)
+    CONSTRUCTOR(Mutator, string _name, mutatorfunc_t func) {
         CONSTRUCT(Mutator);
-        this.mutatorname = name;
+        this.m_name = _name;
         this.mutatorfunc = func;
-        return this;
     }
 ENDCLASS(Mutator)
 
-const int MAX_MUTATORS = 15;
-Mutator loaded_mutators[MAX_MUTATORS];
+REGISTRY(Mutators, BITS(7))
+#define Mutators_from(i) _Mutators_from(i, NULL)
+Mutator loaded_mutators[Mutators_MAX];
 
 bool Mutator_Add(Mutator mut)
 {
     int j = -1;
-    for (int i = 0; i < MAX_MUTATORS; ++i) {
+    for (int i = 0; i < Mutators_MAX; ++i) {
         if (loaded_mutators[i] == mut)
             return true; // already added
         if (!(loaded_mutators[i]))
@@ -188,10 +188,10 @@ bool Mutator_Add(Mutator mut)
 void Mutator_Remove(Mutator mut)
 {
     int i;
-    for (i = 0; i < MAX_MUTATORS; ++i)
+    for (i = 0; i < Mutators_MAX; ++i)
         if (loaded_mutators[i] == mut)
             break;
-    if (i >= MAX_MUTATORS) {
+    if (i >= Mutators_MAX) {
         backtrace("WARNING: removing not-added mutator\n");
         return;
     }
@@ -203,17 +203,6 @@ void Mutator_Remove(Mutator mut)
     }
 }
 
-#define MUTATOR_DECLARATION(name) \
-    Mutator MUTATOR_##name
-#define MUTATOR_DEFINITION(name) \
-    bool MUTATORFUNCTION_##name(int mode); \
-    STATIC_INIT(MUTATOR_##name) { MUTATOR_##name = NEW(Mutator, #name, MUTATORFUNCTION_##name); } \
-    [[last]] bool MUTATORFUNCTION_##name(int mode)
-
-void RegisterMutators();
-const int MUTATORS_MAX = MAX_MUTATORS;
-entity MUTATORS[MUTATORS_MAX], MUTATORS_first, MUTATORS_last;
-int MUTATORS_COUNT;
 #define REGISTER_MUTATOR(id, dependence) \
     bool MUTATORFUNCTION_##id##_hooks(int mode) { return = false; } \
     bool MUTATORFUNCTION_##id(int mode) { \
@@ -221,10 +210,19 @@ int MUTATORS_COUNT;
         bool ret = MUTATORFUNCTION_##id##_hooks(mode); if (ret) return ret; \
     } \
     bool MUTATOR_##id##_check() { return dependence; } \
-    REGISTER(RegisterMutators, MUTATOR, MUTATORS, MUTATORS_COUNT, id, m_id, NEW(Mutator, #id, MUTATORFUNCTION_##id)) \
+    REGISTER(RegisterMutators, MUTATOR, Mutators, id, m_id, NEW(Mutator, #id, MUTATORFUNCTION_##id)) \
     { this.mutatorcheck = MUTATOR_##id##_check; } \
     [[accumulate]] bool MUTATORFUNCTION_##id(int mode)
-REGISTER_REGISTRY(RegisterMutators)
+
+STATIC_INIT(Mutators) {
+    RegisterHooks();
+    RegisterCallbacks();
+    RegisterMutators();
+}
+
+STATIC_INIT_LATE(Mutators) {
+    FOREACH(Mutators, it.mutatorcheck(), LAMBDA(Mutator_Add(it)));
+}
 
 #define MUTATOR_ONADD                   if (mode == MUTATOR_ADDING)
 #define MUTATOR_ONREMOVE                if (mode == MUTATOR_REMOVING)
@@ -236,17 +234,13 @@ REGISTER_REGISTRY(RegisterMutators)
 #define _MUTATOR_CALLBACK(name, func) \
     Callback CALLBACK_##name; \
     bool func(); \
-    STATIC_INIT(CALLBACK_##name) { CALLBACK_##name = NEW(Callback, func); }
+    [[accumulate]] void RegisterCallbacks() { CALLBACK_##name = NEW(Callback, func); }
 
 #define MUTATOR_HOOKFUNCTION(...) \
-    OVERLOAD(MUTATOR_HOOKFUNCTION, __VA_ARGS__)
-
-#define MUTATOR_HOOKFUNCTION_1(name) \
-    _MUTATOR_CALLBACK(name, HOOKFUNCTION_##name) \
-    bool HOOKFUNCTION_##name()
+    EVAL(OVERLOAD(MUTATOR_HOOKFUNCTION, __VA_ARGS__))
 
 #define MUTATOR_HOOKFUNCTION_2(mut, cb) \
-    MUTATOR_HOOKFUNCTION(mut, cb, CBC_ORDER_ANY)
+    MUTATOR_HOOKFUNCTION_3(mut, cb, CBC_ORDER_ANY)
 
 #define MUTATOR_HOOKFUNCTION_3(mut, cb, order) \
     _MUTATOR_CALLBACK(mut##_##cb, mut##_##cb) \
@@ -257,7 +251,7 @@ REGISTER_REGISTRY(RegisterMutators)
 #define MUTATOR_HOOK(cb, func, order) do {                              \
     MUTATOR_ONADD {                                                     \
         if (!CallbackChain_Add(HOOK_##cb, CALLBACK_##func, order)) {    \
-            print("HOOK FAILED: ", #cb, ":", #func, "\n");              \
+            LOG_INFO("HOOK FAILED: ", #cb, ":", #func, "\n");           \
             return true;                                                \
         }                                                               \
     }                                                                   \