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 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 33 | Consumer-Typen |
| 34 | -------------- |
| 35 | |
| 36 | Hook-Consumer koennen sich fuer verschiedene Rollen beim Hook-Provider |
| 37 | registrieren, die darueber entscheiden, was der Consumer innerhalb der |
| 38 | Callback-Funktion tun darf. Es gibt reine Zuhoerer (Listener), |
| 39 | Datenmodifizierer (Data-Modifier), Hook-Modifizierer (Hook-Modifier) und |
| 40 | sogenannte Surveyor-Hooks. Nachfolgend die Liste dieser Hook-Typen und |
| 41 | die 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) |
Arathorn | 0f6c74a | 2020-05-03 01:05:34 +0200 | [diff] [blame] | 51 | duerfen die Daten des Ereignisses aendern und zusaetzlich das Ereignis |
| 52 | auch abbrechen. |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 53 | |
| 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@Morgengrauen | 0f34a7e | 2016-10-30 22:33:25 +0100 | [diff] [blame] | 64 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 65 | |
Arathorn | 0f6c74a | 2020-05-03 01:05:34 +0200 | [diff] [blame] | 66 | Hook-Typen |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 67 | ---------- |
| 68 | |
| 69 | Es koennen grundsaetzlich nur die Hooks registriert werden, die ein Objekt |
| 70 | von sich aus aktiv anbietet. Ein Objekt, das Hooks zur Registrierung |
| 71 | anbieten will, muss /std/hook_provider erben. Die meisten Mudlib- |
| 72 | Basisobjekte tun dies bereits und bieten entsprechend die passenden Hooks |
| 73 | an. Objekte, die Surveyor-Hooks registrieren wollen, muessen |
| 74 | /std/hook_surveyor erben. |
| 75 | |
| 76 | Zum Verstaendnis: Objekte, die sich bei einem Provider registrieren wollen, |
| 77 | muessen keines dieser Objekte erben. Lediglich <hook.h> muss inkludiert |
| 78 | werden, damit die Defines zur Verfuegung stehen. |
| 79 | |
| 80 | |
| 81 | Folgende 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 | |
| 166 | Hook-Prioritaeten |
| 167 | ----------------- |
| 168 | |
| 169 | Hooks lassen sich darueber hinaus noch mit unterschiedlicher Prioritaet |
| 170 | eintragen, so dass bei Registrierung mehrerer Hooks am selben Provider diese |
| 171 | dann in der entsprechenden Reihenfolge abgearbeitet werden. Wenn ein neuer |
| 172 | Hook eingetragen wird, aber die max. Anzahl vorher schon erreicht war, wird |
| 173 | der Konsument mit der niedrigsten Prioritaet geloescht. In diesem Fall wird |
| 174 | der verdraengte Consumer durch Aufruf von superseededHook() darueber |
| 175 | informiert, dass seine Verbindung getrennt wurde. |
| 176 | |
| 177 | |
| 178 | HOOK-CONSUMER |
| 179 | ============= |
| 180 | |
| 181 | Um sich bei einem Provider zu registrieren, ruft man in diesem die Funktion |
| 182 | HRegisterToHook() auf (Beschreibung siehe unten bei den Hook-Providern). |
| 183 | Wenn die Registrierung erfolgreich war, ruft der Hook-Provider bei Eintritt |
| 184 | des Ereignisses in allen Konsumenten eine bestimmte Funktion auf. Wenn bei |
| 185 | der Registrierung ein Hook-Objekt angegeben wurde, wird standardmaessig die |
| 186 | Funktion HookCallback() gerufen. Registriert man stattdessen eine Closure, |
| 187 | wird diese mit denselben Daten wie die Lfun gerufen. Nachfolgend ist die |
| 188 | Lfun beschrieben, alles dort gesagte gilt aber genauso fuer Closures. |
| 189 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 190 | * mixed HookCallback(object hookSource, int hookid, mixed hookData) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 191 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 192 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 199 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 200 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 203 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 204 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 226 | |
| 227 | * void superseededHook(int hookid, object hookprovider) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 228 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 229 | Wird gerufen, wenn der Konsument von einem anderen mit hoeherer Prioritaet |
| 230 | verdraengt wurde. |
| 231 | |
| 232 | |
| 233 | HOOK-PROVIDER |
| 234 | ============= |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 235 | |
| 236 | Der Hook-Provider bietet eine Menge von Methoden an, die eine Konfiguration |
| 237 | ermoeglichen und die Eintragung von Hook-Konsumenten erlauben. Im |
| 238 | Normalfall sollte er geerbt und muss nicht modifiziert werden. Die einzige |
| 239 | Konfiguration, die man typischerweise vornehmen muss, ist, die vom Objekt |
| 240 | bereitgestellten Hooks zu benennen. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 241 | |
| 242 | * int* HListHooks(); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 243 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 256 | |
| 257 | |
| 258 | * protected void offerHook(int hookid, int offerstate); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 259 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 265 | |
| 266 | |
| 267 | * int HRegisterToHook(int hookid, mixed consumer, int hookprio, |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 268 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 309 | |
| 310 | * int HUnregisterFromHook(int hookid, mixed consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 311 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 325 | |
| 326 | * int HConsumerTypeIsAllowed(int type, object consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 327 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 340 | |
| 341 | |
| 342 | * int HPriorityIsAllowed(int prio, object consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 343 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 352 | |
| 353 | |
| 354 | * int HIsHookConsumer(int hookid, mixed consumer); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 355 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 360 | |
| 361 | |
| 362 | * protected mapping HCopyHookMapping(); |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 363 | Diese Methode liefert eine Kopie des Hook-Mappings. |
| 364 | ACHTUNG: diese Daten sollten das Objekt ausser fuer Debugzwecke |
| 365 | NIEMALS verlassen. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 366 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 367 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 372 | |
| 373 | |
| 374 | HOOK-SURVEYOR |
| 375 | ============= |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 376 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 377 | 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) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 386 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 391 | |
| 392 | * int HookCancelAllowanceCallback( |
| 393 | object cancellingObject, |
| 394 | int hookid, |
| 395 | object hookSource, |
| 396 | int cancellingObjectsPriority, |
| 397 | mixed hookData) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 398 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 403 | |
| 404 | * int HookModificationAllowanceCallback( |
| 405 | object modifyingObject, |
| 406 | int hookid, |
| 407 | object hookSource, |
| 408 | int modifyingObjectsPriority, |
| 409 | mixed hookData) |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 410 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 414 | |
| 415 | |
| 416 | WAS KOSTET DAS? |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 417 | |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 420 | 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 | |
Arathorn | 7c60174 | 2020-05-01 22:19:59 +0200 | [diff] [blame] | 432 | (Macht der Surveyor irgendwas anderes als 'return 1;', wirds natuerlich |
| 433 | entsprechend teurer.) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 434 | |