5 entity CallbackChain_New(string name)
9 e.classname = "callbackchain";
14 float CallbackChain_Add(entity cb, float() func, float order)
17 if(order & CBC_ORDER_FIRST)
19 if(order & CBC_ORDER_LAST)
20 if(cb.cbc_order & CBC_ORDER_ANY)
22 if(cb.cbc_order & CBC_ORDER_FIRST)
25 else if(order & CBC_ORDER_LAST)
27 if(cb.cbc_order & CBC_ORDER_LAST)
32 thiscb.classname = "callback";
33 thiscb.cbc_func = func;
34 thiscb.cbc_order = order;
35 if(order & CBC_ORDER_FIRST)
37 thiscb.cbc_next = cb.cbc_next;
40 else if(order & CBC_ORDER_LAST)
42 for(e = cb; e.cbc_next; e = e.cbc_next);
47 // by default we execute last, but before a possible CBC_ORDER_LAST callback
48 for(e = cb; e.cbc_next && !(e.cbc_next.cbc_order & CBC_ORDER_LAST); e = e.cbc_next); // we must make sure that we insert BEFORE an CBC_ORDER_LAST mutator!
49 thiscb.cbc_next = e.cbc_next;
52 cb.cbc_order |= (order | CBC_ORDER_ANY);
56 float CallbackChain_Remove(entity cb, float() func)
62 for(e = cb; e.cbc_next; e = e.cbc_next)
64 while(e.cbc_next.cbc_func == func)
66 // remove e.cbc_next from the chain
68 e2 = e.cbc_next.cbc_next;
73 // e.cbc_next is now something we want to keep
74 order |= (e.cbc_next.cbc_order & CBC_ORDER_ANY);
80 float CallbackChain_Call(entity cb)
85 for(e = cb; e.cbc_next; e = e.cbc_next)
87 CallbackChain_ReturnValue = r;
88 r |= e.cbc_next.cbc_func();
90 return r; // callbacks return an error status, so 0 is default return value
93 #define MAX_MUTATORS 8
94 string loaded_mutators[MAX_MUTATORS];
95 float Mutator_Add(mutatorfunc_t func, string name)
99 for(i = 0; i < MAX_MUTATORS; ++i)
101 if(name == loaded_mutators[i])
102 return 1; // already added
103 if(!loaded_mutators[i])
108 backtrace("WARNING: too many mutators, cannot add any more\n");
111 loaded_mutators[j] = name;
113 if(func(MUTATOR_ADDING) == 0)
118 backtrace("WARNING: when adding mutator: adding failed\n");
119 Mutator_Remove(func, name);
122 void Mutator_Remove(float(float) func, string name)
125 for(i = 0; i < MAX_MUTATORS; ++i)
126 if(name == loaded_mutators[i])
128 if(i >= MAX_MUTATORS)
130 backtrace("WARNING: removing not-added mutator\n");
133 loaded_mutators[i] = string_null;
135 if(func(MUTATOR_REMOVING) != 0)
138 error("Mutator_Remove: removing mutator failed");