MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | Das neue Hooksystem |
| 2 | (Implementierung von Muadib, ueberarbeitet von Zesstra) |
| 3 | |
| 4 | EINLEITUNG |
| 5 | ========== |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 6 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 7 | Das Hook-System stellt folgende Funktionalitaet zur Verfuegung: |
| 8 | Ein Objekt A kann sich von einem anderen Objekt B ueber den Eintritt von |
| 9 | bestimmten, Objekt B betreffenden Ereignissen informieren lassen. Hierzu |
| 10 | meldet Objekt A sich bei Objekt B fuer das interessierende Ereignis an, |
| 11 | dies wird als "registrieren" bezeichnet. Bei der Registrierung gibt |
| 12 | Objekt A an, welche Funktion bei Eintritt des Ereignisses durch Objekt B |
| 13 | gerufen werden soll. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 14 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 15 | Die Verbindung von Objekt A nach B nennen wir "Hook" (Objekt A "hakt" sich |
| 16 | sozusagen bei B ein, um wie beim Angeln das Zappeln des Fisches am Haken |
| 17 | mitzubekommen.) Der Funktionsaufruf von B bei Eintritt des Ereignisses |
| 18 | wird "Callback" genannt (Objekt B ruft gewissermassen bei A an, um ihm |
| 19 | mitzuteilen, dass das Ereignis eingetreten ist.) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 20 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 21 | Das registrierende Objekt A heisst Consumer (Konsument), Objekt B heisst |
| 22 | Hook-Provider (Anbieter). |
| 23 | |
| 24 | Im Grunde funktionieren Hooks aehnlich wie Events, jedoch sind Hooks |
| 25 | zusaetzlich dadurch gekennzeichnet, dass sie auch den Abbruch des Ereignisses |
| 26 | oder die Veraenderung der ereignisrelevanten Daten bewirken koennen. |
| 27 | Zudem sind Hooks in ihrer Anzahl pro Provider limitiert. |
| 28 | |
| 29 | Anmerkung: Das neue Hooksystem baut nicht mehr auf der Eintragung eines |
| 30 | Hooks in einer Property auf. Dadurch wird es moeglich, dass sich mehrere |
| 31 | Objekte als Consumer eintragen. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 32 | |
| 33 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 34 | Consumer-Typen |
| 35 | -------------- |
| 36 | |
| 37 | Hook-Consumer koennen sich fuer verschiedene Rollen beim Hook-Provider |
| 38 | registrieren, die darueber entscheiden, was der Consumer innerhalb der |
| 39 | Callback-Funktion tun darf. Es gibt reine Zuhoerer (Listener), |
| 40 | Datenmodifizierer (Data-Modifier), Hook-Modifizierer (Hook-Modifier) und |
| 41 | sogenannte Surveyor-Hooks. Nachfolgend die Liste dieser Hook-Typen und |
| 42 | die 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@Morgengrauen | 0f34a7e | 2016-10-30 22:33:25 +0100 | [diff] [blame] | 65 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 66 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 67 | ANCELLED, hookData}); |
| 68 | ---------- |
| 69 | |
| 70 | Es koennen grundsaetzlich nur die Hooks registriert werden, die ein Objekt |
| 71 | von sich aus aktiv anbietet. Ein Objekt, das Hooks zur Registrierung |
| 72 | anbieten will, muss /std/hook_provider erben. Die meisten Mudlib- |
| 73 | Basisobjekte tun dies bereits und bieten entsprechend die passenden Hooks |
| 74 | an. Objekte, die Surveyor-Hooks registrieren wollen, muessen |
| 75 | /std/hook_surveyor erben. |
| 76 | |
| 77 | Zum Verstaendnis: Objekte, die sich bei einem Provider registrieren wollen, |
| 78 | muessen keines dieser Objekte erben. Lediglich <hook.h> muss inkludiert |
| 79 | werden, damit die Defines zur Verfuegung stehen. |
| 80 | |
| 81 | |
| 82 | Folgende 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 | |
| 167 | Hook-Prioritaeten |
| 168 | ----------------- |
| 169 | |
| 170 | Hooks lassen sich darueber hinaus noch mit unterschiedlicher Prioritaet |
| 171 | eintragen, so dass bei Registrierung mehrerer Hooks am selben Provider diese |
| 172 | dann in der entsprechenden Reihenfolge abgearbeitet werden. Wenn ein neuer |
| 173 | Hook eingetragen wird, aber die max. Anzahl vorher schon erreicht war, wird |
| 174 | der Konsument mit der niedrigsten Prioritaet geloescht. In diesem Fall wird |
| 175 | der verdraengte Consumer durch Aufruf von superseededHook() darueber |
| 176 | informiert, dass seine Verbindung getrennt wurde. |
| 177 | |
| 178 | |
| 179 | HOOK-CONSUMER |
| 180 | ============= |
| 181 | |
| 182 | Um sich bei einem Provider zu registrieren, ruft man in diesem die Funktion |
| 183 | HRegisterToHook() auf (Beschreibung siehe unten bei den Hook-Providern). |
| 184 | Wenn die Registrierung erfolgreich war, ruft der Hook-Provider bei Eintritt |
| 185 | des Ereignisses in allen Konsumenten eine bestimmte Funktion auf. Wenn bei |
| 186 | der Registrierung ein Hook-Objekt angegeben wurde, wird standardmaessig die |
| 187 | Funktion HookCallback() gerufen. Registriert man stattdessen eine Closure, |
| 188 | wird diese mit denselben Daten wie die Lfun gerufen. Nachfolgend ist die |
| 189 | Lfun beschrieben, alles dort gesagte gilt aber genauso fuer Closures. |
| 190 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 191 | * mixed HookCallback(object hookSource, int hookid, mixed hookData) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 192 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 193 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 200 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 201 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 204 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 205 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 227 | |
| 228 | * void superseededHook(int hookid, object hookprovider) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 229 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 230 | Wird gerufen, wenn der Konsument von einem anderen mit hoeherer Prioritaet |
| 231 | verdraengt wurde. |
| 232 | |
| 233 | |
| 234 | HOOK-PROVIDER |
| 235 | ============= |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 236 | |
| 237 | Der Hook-Provider bietet eine Menge von Methoden an, die eine Konfiguration |
| 238 | ermoeglichen und die Eintragung von Hook-Konsumenten erlauben. Im |
| 239 | Normalfall sollte er geerbt und muss nicht modifiziert werden. Die einzige |
| 240 | Konfiguration, die man typischerweise vornehmen muss, ist, die vom Objekt |
| 241 | bereitgestellten Hooks zu benennen. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 242 | |
| 243 | * int* HListHooks(); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 244 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 257 | |
| 258 | |
| 259 | * protected void offerHook(int hookid, int offerstate); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 260 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 266 | |
| 267 | |
| 268 | * int HRegisterToHook(int hookid, mixed consumer, int hookprio, |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 269 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 310 | |
| 311 | * int HUnregisterFromHook(int hookid, mixed consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 312 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 326 | |
| 327 | * int HConsumerTypeIsAllowed(int type, object consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 328 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 341 | |
| 342 | |
| 343 | * int HPriorityIsAllowed(int prio, object consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 344 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 353 | |
| 354 | |
| 355 | * int HIsHookConsumer(int hookid, mixed consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 356 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 361 | |
| 362 | |
| 363 | * protected mapping HCopyHookMapping(); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 364 | Diese Methode liefert eine Kopie des Hook-Mappings. |
| 365 | ACHTUNG: diese Daten sollten das Objekt ausser fuer Debugzwecke |
| 366 | NIEMALS verlassen. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 367 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 368 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 373 | |
| 374 | |
| 375 | HOOK-SURVEYOR |
| 376 | ============= |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 377 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 378 | 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) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 387 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 392 | |
| 393 | * int HookCancelAllowanceCallback( |
| 394 | object cancellingObject, |
| 395 | int hookid, |
| 396 | object hookSource, |
| 397 | int cancellingObjectsPriority, |
| 398 | mixed hookData) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 399 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 404 | |
| 405 | * int HookModificationAllowanceCallback( |
| 406 | object modifyingObject, |
| 407 | int hookid, |
| 408 | object hookSource, |
| 409 | int modifyingObjectsPriority, |
| 410 | mixed hookData) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 411 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 415 | |
| 416 | |
| 417 | WAS KOSTET DAS? |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 418 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 421 | 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 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 433 | (Macht der Surveyor irgendwas anderes als 'return 1;', wirds natuerlich |
| 434 | entsprechend teurer.) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 435 | |