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