blob: bdfb8524546bde203f73f22a5c07b4f47d64ed62 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001Das neue Hooksystem
2(Implementierung von Muadib, ueberarbeitet von Zesstra)
3
4EINLEITUNG
5==========
MG Mud User88f12472016-06-24 23:31:02 +02006
Arathorn7c601742020-05-01 22:19:59 +02007Das Hook-System stellt folgende Funktionalitaet zur Verfuegung:
8Ein Objekt A kann sich von einem anderen Objekt B ueber den Eintritt von
9bestimmten, Objekt B betreffenden Ereignissen informieren lassen. Hierzu
10meldet Objekt A sich bei Objekt B fuer das interessierende Ereignis an,
11dies wird als "registrieren" bezeichnet. Bei der Registrierung gibt
12Objekt A an, welche Funktion bei Eintritt des Ereignisses durch Objekt B
13gerufen werden soll.
MG Mud User88f12472016-06-24 23:31:02 +020014
Arathorn7c601742020-05-01 22:19:59 +020015Die Verbindung von Objekt A nach B nennen wir "Hook" (Objekt A "hakt" sich
16sozusagen bei B ein, um wie beim Angeln das Zappeln des Fisches am Haken
17mitzubekommen.) Der Funktionsaufruf von B bei Eintritt des Ereignisses
18wird "Callback" genannt (Objekt B ruft gewissermassen bei A an, um ihm
19mitzuteilen, dass das Ereignis eingetreten ist.)
MG Mud User88f12472016-06-24 23:31:02 +020020
Arathorn7c601742020-05-01 22:19:59 +020021Das registrierende Objekt A heisst Consumer (Konsument), Objekt B heisst
22Hook-Provider (Anbieter).
23
24Im Grunde funktionieren Hooks aehnlich wie Events, jedoch sind Hooks
25zusaetzlich dadurch gekennzeichnet, dass sie auch den Abbruch des Ereignisses
26oder die Veraenderung der ereignisrelevanten Daten bewirken koennen.
27Zudem sind Hooks in ihrer Anzahl pro Provider limitiert.
28
29Anmerkung: Das neue Hooksystem baut nicht mehr auf der Eintragung eines
30Hooks in einer Property auf. Dadurch wird es moeglich, dass sich mehrere
31Objekte als Consumer eintragen.
MG Mud User88f12472016-06-24 23:31:02 +020032
33
Arathorn7c601742020-05-01 22:19:59 +020034Consumer-Typen
35--------------
36
37Hook-Consumer koennen sich fuer verschiedene Rollen beim Hook-Provider
38registrieren, die darueber entscheiden, was der Consumer innerhalb der
39Callback-Funktion tun darf. Es gibt reine Zuhoerer (Listener),
40Datenmodifizierer (Data-Modifier), Hook-Modifizierer (Hook-Modifier) und
41sogenannte Surveyor-Hooks. Nachfolgend die Liste dieser Hook-Typen und
42die Moeglichkeiten, die ihnen zur Verfuegung stehen:
43
44 * Listener (H_LISTENER, max. Anzahl 5)
45 werden ueber ein Ereignis nur informiert, koennen aber nicht in den
46 Ablauf eingreifen oder Daten aendern.
47
48 * Data-Modifier (H_DATA_MODIFICATOR, max. Anzahl 3)
49 duerfen die Daten eines Ereignisses aendern.
50
51 * Hook-Modifier (H_HOOK_MODIFICATOR, max. Anzahl 2)
52 die Daten des Ereignisses aendern und zusaetzlich das Ereignis auch
53 abbrechen.
54
55 * Surveyor (H_HOOK_SURVEYOR, max. Anzahl 1)
56 duerfen alles oben beschriebene. Zusaetzlich werden sie gefragt, wenn
57 andere Objekte einen Hook eintragen wollen, einen Hook abbrechen
58 wollen oder Daten aendern wollen.
59 Anders ausgedrueck: Surveyorhooks entscheiden, was andere duerfen.
60 Kein normales Objekte sollte diese Art von Hook eintragen. Der RM
61 muss die Verwendung eines Surveyors genehmigen.
62
63 Die angegebene Limitierung bezieht sich auf die Anzahl der beim jeweiligen
64 Provider registrierten Hook-Objekte.
Zesstra@Morgengrauen0f34a7e2016-10-30 22:33:25 +010065
MG Mud User88f12472016-06-24 23:31:02 +020066
Arathorn7c601742020-05-01 22:19:59 +020067ANCELLED, hookData});
68----------
69
70Es koennen grundsaetzlich nur die Hooks registriert werden, die ein Objekt
71von sich aus aktiv anbietet. Ein Objekt, das Hooks zur Registrierung
72anbieten will, muss /std/hook_provider erben. Die meisten Mudlib-
73Basisobjekte tun dies bereits und bieten entsprechend die passenden Hooks
74an. Objekte, die Surveyor-Hooks registrieren wollen, muessen
75/std/hook_surveyor erben.
76
77Zum Verstaendnis: Objekte, die sich bei einem Provider registrieren wollen,
78muessen keines dieser Objekte erben. Lediglich <hook.h> muss inkludiert
79werden, damit die Defines zur Verfuegung stehen.
80
81
82Folgende Hooks gibt es zur Zeit in der Basis-Mudlib:
83
84 * H_HOOK_MOVE
85 Vor Bewegung eines Lebewesens ausgeloest.
86 Datenveraenderung und Abbruch moeglich.
87 Daten: ({dest,method,direction,textout,textin}), siehe move()
88
89 * H_HOOK_DIE
90 Beim Tod eines Lebewesens ausgeloest. Kann den Tod abbrechen oder
91 <poisondeath> abaendern.
92 Daten: int poisondeath, siehe die()
93
94 * H_HOOK_DEFEND
95 Im Defend() eines Lebenwesens ausgeloest. Kann das Defend() abbrechen
96 und Daten des Defend() aendern. Dieser Hook kommt nach einem eventuell
97 in P_TMP_DEFEND_HOOK registrierten Legacy-Hook zum Zuge. Dessen Daten
98 sind in den EINFO-Daten enthalten und werden durch die Rueckgabedaten
99 dieses Hooks ersetzt.
100 Daten: ({dam, dam_type, spell, enemy}), siehe Defend()
101
102 * H_HOOK_ATTACK
103 Im Attack() eines Lebenwesens ausgeloest. Kann das Attack() abbrechen.
104 Daten: object* enemy (enthaelt nur enemy als einziges Element)
105
106 * H_HOOK_ATTACK_MOD
107 Wird im Attack() ausgeloest, nachdem die fuer den Angriff wichtigen Daten
108 ermittelt und berechnet wurden. Diese koennen dann vom Hook-Consumer
109 nochmal geaendert werden. Auch ein Abbruch des Attack() ist moeglich.
110 Dieser Hook kommt nach Auswertung eines ggf. mittels P_TMP_ATTACK_HOOK
111 eingetragenen Legacy-Hooks zum Zuge.
112 Daten: deep_copy(ainfo), siehe Defendinfo, Abschnitt ORIGINAL_AINFO
113
114 * H_HOOK_HP
115 * H_HOOK_SP
116 Bei Veraenderung der Property eines Spielers gerufen. Falls eine
117 Setmethode auf der Property liegt, wird der Hook wahrscheinlich meist
118 doch nicht gerufen. Wenn sich der Wert nicht geaendert hat, wird er auch
119 nicht gerufen: der Hook reagiert auf Veraenderung des Wertes, nicht
120 auf den Aufruf von SetProp().
121 Keine Datenveraenderung und kein Abbruch moeglich.
122 Daten: der neue Wert der Property
123
124 * H_HOOK_ALCOHOL
125 * H_HOOK_FOOD
126 * H_HOOK_DRINK
127 * H_HOOK_POISON
128 Bei Veraenderung der Property des Lebewesens gerufen. Falls eine
129 Setmethode auf der Property liegt, wird der Hook wahrscheinlich meist
130 doch nicht gerufen. Wenn sich der Wert nicht geaendert hat, wird er auch
131 nicht gerufen: der Hook reagiert auf Veraenderung des Wertes, nicht
132 auf den Aufruf von SetProp().
133 Datenveraenderung und Abbruch moeglich.
134 Daten: neuer Wert der Property
135
136 * H_HOOK_CONSUME
137 Wird gerufen, wenn ein Lebewesen Speisen oder Getraenke in Kneipen
138 konsumiert.
139 Datenveraenderung von <cinfo> und Abbruch moeglich. Aenderung von
140 <testonly> nicht moeglich.
141 Daten: ({cinfo, testonly}), siehe consume()
142
143 * H_HOOK_TEAMROWCHANGE
144 Bei Teamreihenwechsel eines Lebewesens ausgeloest.
145 Keine Datenveraenderung und kein Abbruch moeglich.
146 Daten: int* ({alteTeamreihe, neueTeamreihe})
147
148 * H_HOOK_INSERT
149 Wird von Spielerobjekten ausgeloest, nachdem ein Objekt ins
150 Spielerinventar bewegt wurde.
151 Keine Datenveraenderung und kein Abbruch moeglich.
152 Daten: object, das ins Inventar bewegte Objekt.
153
154 * H_HOOK_EXIT_USE
155 Wird von einem Raum ausgeloest, wenn ein Lebewesen einen Ausgang benutzt.
156 Datenveraenderung und Abbruch moeglich.
157 Daten: ({string verb, string|closure destroom, string message})
158
159 * H_HOOK_INIT
160 Wird von einem Raum ausgeloest, wenn init() gerufen wird (d.h. ein
161 Lebewesen den Raum betritt).
162 Abbruch moeglich.
163 ACHTUNG: bei Abbruch von init() sind schwere Bugs wahrscheinlich!
164 Daten: keine.
165
166
167Hook-Prioritaeten
168-----------------
169
170Hooks lassen sich darueber hinaus noch mit unterschiedlicher Prioritaet
171eintragen, so dass bei Registrierung mehrerer Hooks am selben Provider diese
172dann in der entsprechenden Reihenfolge abgearbeitet werden. Wenn ein neuer
173Hook eingetragen wird, aber die max. Anzahl vorher schon erreicht war, wird
174der Konsument mit der niedrigsten Prioritaet geloescht. In diesem Fall wird
175der verdraengte Consumer durch Aufruf von superseededHook() darueber
176informiert, dass seine Verbindung getrennt wurde.
177
178
179HOOK-CONSUMER
180=============
181
182Um sich bei einem Provider zu registrieren, ruft man in diesem die Funktion
183HRegisterToHook() auf (Beschreibung siehe unten bei den Hook-Providern).
184Wenn die Registrierung erfolgreich war, ruft der Hook-Provider bei Eintritt
185des Ereignisses in allen Konsumenten eine bestimmte Funktion auf. Wenn bei
186der Registrierung ein Hook-Objekt angegeben wurde, wird standardmaessig die
187Funktion HookCallback() gerufen. Registriert man stattdessen eine Closure,
188wird diese mit denselben Daten wie die Lfun gerufen. Nachfolgend ist die
189Lfun beschrieben, alles dort gesagte gilt aber genauso fuer Closures.
190
MG Mud User88f12472016-06-24 23:31:02 +0200191 * mixed HookCallback(object hookSource, int hookid, mixed hookData)
MG Mud User88f12472016-06-24 23:31:02 +0200192
Arathorn7c601742020-05-01 22:19:59 +0200193 Diese Methode wird in jedem Hook-Konsumenten eines Hook-Providers
194 aufgerufen, solange die Verarbeitung nicht vorher abgebrochen wurde.
195 Die Reihenfolge des Aufrufs ist Surveyor, Hook-Modifikator,
196 Data-Modifikator, Listener. Innerhalb der Gruppen wird nach Prioritaet
197 abgearbeitet.
198 Ein Surveyor-Hook kann verhindern, dass Hooks bestimmte Aenderungen
199 durchfuehren.
MG Mud User88f12472016-06-24 23:31:02 +0200200
Arathorn7c601742020-05-01 22:19:59 +0200201 Der Funktion wird der Hook-Provider als Objekt hookSource, der Hook-Typ
202 sowie dessen Daten uebergeben. Das bedeutet, man kann diese Funktion
203 fuer die Bearbeitung verschiedener Hook-Typen registrieren.
MG Mud User88f12472016-06-24 23:31:02 +0200204
Arathorn7c601742020-05-01 22:19:59 +0200205 Als Rueckgabewert wird immer ein Array aus zwei Elementen erwartet, das
206 die folgenden Angaben beinhalten muss:
207
208 Element 0 (H_RETCODE) gibt an, welche Aktion die Callback-Funktion
209 ausgefuehrt hat:
210 H_NO_MOD => keine Aenderungen
211 H_ALTERED => Daten wurden veraendert
212 H_CANCELLED => Hook-Kette soll abgebrochen werden, d.h. nach
213 Prioritaet spaeter aufzurufende Hooks kommen nicht mehr zum Zuge.
214 => Ausserdem soll die Hook-ausloesende Stelle abgebrochen werden.
215 Beispielsweise wird das Defend() abgebrochen, wenn ein
216 H_HOOK_DEFEND mit H_CANCELLED beantwortet wird.
217
218 Element 1 (H_RETDATA) gibt die (evtl. geaenderten) Daten an
219 mixed-Objekt, das wie der Parameter hookData aufgebaut ist.
220
221 Hinweis: auch reine Listener-Objekte muessen ein Array zurueckgeben, das
222 dann als erstes Element H_NO_MOD enthaelt.
223
224 Ein Objekt darf sich mehrfach fuer den gleichen Hook registrieren.
225 Allerdings ist dann fuer jede Registrierung eine andere Closure noetig.
226
MG Mud User88f12472016-06-24 23:31:02 +0200227
228 * void superseededHook(int hookid, object hookprovider)
Arathorn7c601742020-05-01 22:19:59 +0200229
MG Mud User88f12472016-06-24 23:31:02 +0200230 Wird gerufen, wenn der Konsument von einem anderen mit hoeherer Prioritaet
231 verdraengt wurde.
232
233
234HOOK-PROVIDER
235=============
Arathorn7c601742020-05-01 22:19:59 +0200236
237Der Hook-Provider bietet eine Menge von Methoden an, die eine Konfiguration
238ermoeglichen und die Eintragung von Hook-Konsumenten erlauben. Im
239Normalfall sollte er geerbt und muss nicht modifiziert werden. Die einzige
240Konfiguration, die man typischerweise vornehmen muss, ist, die vom Objekt
241bereitgestellten Hooks zu benennen.
MG Mud User88f12472016-06-24 23:31:02 +0200242
243 * int* HListHooks();
Arathorn7c601742020-05-01 22:19:59 +0200244
245 Diese Methode liefert eine Liste von Hooktypen, fuer die das Objekt
246 Registrierungen akzeptiert. Standardmaessig bieten die Mudlib-Basis-
247 objekte folgende Hooks an:
248 Spielerobjekte: H_HOOK_MOVE, H_HOOK_DIE, H_HOOK_DEFEND, H_HOOK_ATTACK,
249 H_HOOK_HP, H_HOOK_SP, H_HOOK_ATTACK_MOD, H_HOOK_ALCOHOL
250 H_HOOK_FOOD, H_HOOK_DRINK, H_HOOK_POISON, H_HOOK_CONSUME,
251 H_HOOK_TEAMROWCHANGE ,H_HOOK_INSERT
252 NPCs: H_HOOK_MOVE, H_HOOK_DIE, H_HOOK_DEFEND, H_HOOK_ATTACK,
253 H_HOOK_ATTACK_MOD, H_HOOK_ALCOHOL, H_HOOK_FOOD, H_HOOK_DRINK,
254 H_HOOK_POISON, H_HOOK_CONSUME, H_HOOK_TEAMROWCHANGE
255 Raeume: H_HOOK_EXIT_USE, H_HOOK_INIT
256 Dinge: keine
MG Mud User88f12472016-06-24 23:31:02 +0200257
258
259 * protected void offerHook(int hookid, int offerstate);
Arathorn7c601742020-05-01 22:19:59 +0200260
261 Diese Methode dient dazu, einen bestimmten Hook anzubieten. Nur Hooks,
262 die hiermit angeboten wurden, stehen zur Registrierung zur Verfuegung
263 und werden im Rueckgabewert von HListHooks() aufgefuehrt.
264
265 'offerstate': 0 (nicht verfuegbar), 1 (verfuegbar)
MG Mud User88f12472016-06-24 23:31:02 +0200266
267
268 * int HRegisterToHook(int hookid, mixed consumer, int hookprio,
Arathorn7c601742020-05-01 22:19:59 +0200269 int consumertype, int timeInSeconds);
270
271 Registriert ein Objekt oder eine Closure als Hook-Konsument.
272 Argumente:
273 'hookid' gibt den Hook-Typ an, s.o.
274 Man kann sich nur fuer Hooktypen eintragen, die die Methode
275 HListHooks() angeboten hat.
276 'consumer' Objekt oder Closure. Wenn ein Objekt uebergeben wird,
277 wird dieses eingetragen und spaeter HookCallback() an
278 diesem Objekt gerufen.
279 Wenn eine Closure uebergeben wird, wird das Objekt der
280 Closure eingetragen und spaeter diese Closure gerufen.
281 'hookprio' Gibt die Prioritaet an, mit der der Hook laufen soll.
282 Diese Angabe bestimmt die Reihenfolge, in der die Hooks
283 in der Liste der Hooks eingetragen werden. Die moeglichen
284 Prioritaeten sind:
285 - H_HOOK_LIBPRIO(x)
286 - H_HOOK_GUILDPRIO(x) oder
287 - H_HOOK_OTHERPRIO(x).
288 x darf 0, 1 oder 2 sein (je niedriger, desto hoeher die
289 Prioritaet).
290 'consumertype' Gibt an, um welche Art von Consumer es sich handelt.
291 Es gibt vier festgelegten Arten, die fuer alle Hooks
292 existieren koennen, aber nicht muessen. Die Methode
293 HConsumerTypeIsAllowed() gibt Aufschluss darueber, welche
294 Consumer-Typen tatsaechlich freigegeben sind (s.u.)
295 'timeInSeconds' gibt die Laufzeit des Hooks an. Falls 0 eingetragen wird,
296 laeuft der Hook ewig.
297
298 Rueckgabewerte:
299 1 - Registrierung erfolgreich
300 <=0 - Registrierung fehlgeschlagen mit folgendem Ergebnis:
301 -1 : Hook unbekannt
302 -2 : consumer ist keine closure und es konnte kein Callback auf
303 HookCallback im consumer erstellt werden.
304 -3 : Consumer ist bereits registriert
305 -4 : Consumer-Typ ist nicht erlaubt
306 -5 : hookprio ist nicht erlaubt
307 -6 : Surveyor hat Registrierung nicht erlaubt
308 -7 : zuviele Hooks registriert / kein Hookeintrag frei
309
MG Mud User88f12472016-06-24 23:31:02 +0200310
311 * int HUnregisterFromHook(int hookid, mixed consumer);
Arathorn7c601742020-05-01 22:19:59 +0200312
313 Hebt die Registrierung von <consumer> fuer einen bestimmten Hook-Typ
314 wieder auf.
315 Argumente:
316 'hookid' der Hook-Typ (s.o.)
317 'consumer' Das Objekt oder die Closure, dessen/deren Registrierung
318 aufgehoben werden soll. Bei einer Closure wird genau diese
319 ausgetragen. Bei der Angabe eines Objekts wird versucht, die
320 Closure auf HookCallback() in diesem Objekt auszutragen.
321
322 Rueckgabewerte:
323 0 - 'consumer' nicht als Konsument gefunden
324 1 - Austragen erfolgreich
325
MG Mud User88f12472016-06-24 23:31:02 +0200326
327 * int HConsumerTypeIsAllowed(int type, object consumer);
Arathorn7c601742020-05-01 22:19:59 +0200328 Diese Methode liefert 1 zurueck, wenn ein bestimmter Consumer-Typ
329 (fuer diesen Konsumenten) erlaubt wird.
330 Die Standardmethode liefert immer 1 (true) zurueck. Erbende Objekte
331 koennen diese Methode ueberschreiben, wenn sie nicht alle Consumer-Typen
332 anbieten.
333 Wenn man diese Methode in einem eigenen Hook-Provider ueberschreibt,
334 kann man Consumer-Typen nur global abschalten, aber nicht selektiv
335 pro Hook-Typ.
336 Alle Mudlib-Basisobjekte, die Hooks anbieten, geben hier zur Zeit immer
337 1 zurueck, auch wenn die Hook-Typen die gewuenschte Funktionalitaet nicht
338 auswerten. Beispielsweise kann man einen Hook-Modifikator fuer den
339 Insert-Hook registrieren, damit aber nicht verhindern, dass das Objekt
340 ins Spielerinventar bewegt wird.
MG Mud User88f12472016-06-24 23:31:02 +0200341
342
343 * int HPriorityIsAllowed(int prio, object consumer);
Arathorn7c601742020-05-01 22:19:59 +0200344 Diese Methode gibt an, ob eine bestimmte Prioritaet (fuer den angegebenen
345 Konsumenten) erlaubt ist. Die Standardmethode liefert immer 1 (true)
346 zurueck. Erbende Objekte koennen diese Methode ueberschreiben, wenn
347 sie die verfuegbaren Hook-Prioritaeten einschraenken wollen.
348 Wenn man diese Methode in einem eigenen Hook-Provider ueberschreibt,
349 kann man Prioritaeten nur global abschalten, aber nicht selektiv
350 pro Hook-Typ.
351 Alle Mudlib-Basisobjekte, die Hooks anbieten, geben hier zur Zeit immer
352 1 zurueck.
MG Mud User88f12472016-06-24 23:31:02 +0200353
354
355 * int HIsHookConsumer(int hookid, mixed consumer);
Arathorn7c601742020-05-01 22:19:59 +0200356 Ist <consumer> ein Objekt, liefert die Methode die Anzahl, wie oft dieses
357 Objekt (mit verschiedenen Closures) fuer den Hook <hookid> eingetragen
358 ist.
359 Ist <consumer> eine Closure, liefert diese Methode 1, wenn diese
360 Closure fuer den Hook <hookid> eingetragen ist.
MG Mud User88f12472016-06-24 23:31:02 +0200361
362
363 * protected mapping HCopyHookMapping();
Arathorn7c601742020-05-01 22:19:59 +0200364 Diese Methode liefert eine Kopie des Hook-Mappings.
365 ACHTUNG: diese Daten sollten das Objekt ausser fuer Debugzwecke
366 NIEMALS verlassen.
MG Mud User88f12472016-06-24 23:31:02 +0200367
Arathorn7c601742020-05-01 22:19:59 +0200368
369 * protected mapping HCopyHookConsumers(int hookid);
370 Dieser Methode liefert eine Kopie der Hook-Consumer des Objektes.
371 ACHTUNG: diese Daten sollten das Objekt ausser fuer Debugzwecke
372 NIEMALS verlassen.
MG Mud User88f12472016-06-24 23:31:02 +0200373
374
375HOOK-SURVEYOR
376=============
Arathorn7c601742020-05-01 22:19:59 +0200377
MG Mud User88f12472016-06-24 23:31:02 +0200378 Objekte mit Surveyorhooks muessen eine Menge von Methoden definieren, die
379 der Hookprovider aufruft:
380
381 * status HookRegistrationCallback(
382 object registringObject,
383 int hookid,
384 object hookSource,
385 int registringObjectsPriority,
386 int registringObjectsType)
Arathorn7c601742020-05-01 22:19:59 +0200387 Diese Methode wird vom Hook-Provider aufgerufen, wenn der Hook-Konsument
388 als Surveyor eingetragen ist und ein weiterer Hook eingetragen werden
389 soll.
390 Gibt diese Methode 0 zurueck, dann verbietet der Surveyor, dass der
391 andere Konsument als Hook eingetragen wird.
MG Mud User88f12472016-06-24 23:31:02 +0200392
393 * int HookCancelAllowanceCallback(
394 object cancellingObject,
395 int hookid,
396 object hookSource,
397 int cancellingObjectsPriority,
398 mixed hookData)
Arathorn7c601742020-05-01 22:19:59 +0200399 Diese Methode wird aufgerufen, um herauszufinden, ob ein bestimmter
400 anderer Hook die Ausfuehrung der Hook-Kette unterbrechen darf.
401 Nur Hooks des Consumer-Typs H_HOOK_MODIFICATOR werden der Methode
402 uebergeben, weil nur diese neben dem Surveyor selbst ueberhaupt die
403 Berechtigung haben, die Hook-Kette abzubrechen.
MG Mud User88f12472016-06-24 23:31:02 +0200404
405 * int HookModificationAllowanceCallback(
406 object modifyingObject,
407 int hookid,
408 object hookSource,
409 int modifyingObjectsPriority,
410 mixed hookData)
Arathorn7c601742020-05-01 22:19:59 +0200411 Diese Methode wird aufgerufen, um herauszufinden, ob ein bestimmter
412 anderer Hook die Daten des Hooks veraendern darf oder nicht.
413 Es werden die Hooks der Consumer-Typen H_HOOK_MODIFICATOR und
414 H_DATA_MODIFICATOR (in dieser Reihenfolge) aufgerufen.
MG Mud User88f12472016-06-24 23:31:02 +0200415
416
417WAS KOSTET DAS?
Arathorn7c601742020-05-01 22:19:59 +0200418
419 Das Ausloesen eines Hooks per HookFlow() kostet 111 Ticks und ca. 7 us,
420 wenn es gar keinen gibt, der drauf lauscht (sozusagen Fixkosten).
MG Mud User88f12472016-06-24 23:31:02 +0200421 Pro H_LISTENER kommen dann 31 Ticks und ca. 2 us dazu.
422
423 Gibts einen Surveyor-Hook (der wird dann gefragt, ob andere Objekte die
424 Daten des Hooks aendern oder die Hookverarbeitung abbrechen duerfen):
425 Fixkosten: 155 Ticks, 11 us.
426 Plus pro Data-Modifier:
427 106 Ticks, 5.6 us
428 Plus pro Hook-Modifier, der aber nur Daten aendert:
429 112 Ticks, 6.4 us
430 Und ein Hook-Modifier, der den Hook abbricht:
431 76 Ticks, 4 us
432
Arathorn7c601742020-05-01 22:19:59 +0200433 (Macht der Surveyor irgendwas anderes als 'return 1;', wirds natuerlich
434 entsprechend teurer.)
MG Mud User88f12472016-06-24 23:31:02 +0200435