Das neue Hooksystem
(Implementierung von Muadib, ueberarbeitet von Zesstra)

EINLEITUNG
==========

Das Hook-System stellt folgende Funktionalitaet zur Verfuegung:
Ein Objekt A kann sich von einem anderen Objekt B ueber den Eintritt von
bestimmten, Objekt B betreffenden Ereignissen informieren lassen. Hierzu
meldet Objekt A sich bei Objekt B fuer das interessierende Ereignis an,
dies wird als "registrieren" bezeichnet. Bei der Registrierung gibt 
Objekt A an, welche Funktion bei Eintritt des Ereignisses durch Objekt B
gerufen werden soll.

Die Verbindung von Objekt A nach B nennen wir "Hook" (Objekt A "hakt" sich
sozusagen bei B ein, um wie beim Angeln das Zappeln des Fisches am Haken
mitzubekommen.) Der Funktionsaufruf von B bei Eintritt des Ereignisses 
wird "Callback" genannt (Objekt B ruft gewissermassen bei A an, um ihm 
mitzuteilen, dass das Ereignis eingetreten ist.)

Das registrierende Objekt A heisst Consumer (Konsument), Objekt B heisst 
Hook-Provider (Anbieter).

Im Grunde funktionieren Hooks aehnlich wie Events, jedoch sind Hooks
zusaetzlich dadurch gekennzeichnet, dass sie auch den Abbruch des Ereignisses
oder die Veraenderung der ereignisrelevanten Daten bewirken koennen.
Zudem sind Hooks in ihrer Anzahl pro Provider limitiert.

Anmerkung: Das neue Hooksystem baut nicht mehr auf der Eintragung eines 
Hooks in einer Property auf. Dadurch wird es moeglich, dass sich mehrere 
Objekte als Consumer eintragen.

Consumer-Typen
--------------

Hook-Consumer koennen sich fuer verschiedene Rollen beim Hook-Provider
registrieren, die darueber entscheiden, was der Consumer innerhalb der
Callback-Funktion tun darf. Es gibt reine Zuhoerer (Listener), 
Datenmodifizierer (Data-Modifier), Hook-Modifizierer (Hook-Modifier) und
sogenannte Surveyor-Hooks. Nachfolgend die Liste dieser Hook-Typen und
die Moeglichkeiten, die ihnen zur Verfuegung stehen:

  * Listener (H_LISTENER, max. Anzahl 5)
      werden ueber ein Ereignis nur informiert, koennen aber nicht in den
      Ablauf eingreifen oder Daten aendern.

  * Data-Modifier (H_DATA_MODIFICATOR, max. Anzahl 3)
      duerfen die Daten eines Ereignisses aendern.

  * Hook-Modifier (H_HOOK_MODIFICATOR, max. Anzahl 2)
      duerfen die Daten des Ereignisses aendern und zusaetzlich das Ereignis
      auch abbrechen.

  * Surveyor (H_HOOK_SURVEYOR, max. Anzahl 1)
      duerfen alles oben beschriebene. Zusaetzlich werden sie gefragt, wenn
      andere Objekte einen Hook eintragen wollen, einen Hook abbrechen 
      wollen oder Daten aendern wollen.
      Anders ausgedrueck: Surveyorhooks entscheiden, was andere duerfen.
      Kein normales Objekte sollte diese Art von Hook eintragen. Der RM
      muss die Verwendung eines Surveyors genehmigen.

  Die angegebene Limitierung bezieht sich auf die Anzahl der beim jeweiligen
  Provider registrierten Hook-Objekte.


Hook-Typen
----------

Es koennen grundsaetzlich nur die Hooks registriert werden, die ein Objekt
von sich aus aktiv anbietet. Ein Objekt, das Hooks zur Registrierung
anbieten will, muss /std/hook_provider erben. Die meisten Mudlib-
Basisobjekte tun dies bereits und bieten entsprechend die passenden Hooks 
an. Objekte, die Surveyor-Hooks registrieren wollen, muessen 
/std/hook_surveyor erben. 

Zum Verstaendnis: Objekte, die sich bei einem Provider registrieren wollen,
muessen keines dieser Objekte erben. Lediglich <hook.h> muss inkludiert
werden, damit die Defines zur Verfuegung stehen.


Folgende Hooks gibt es zur Zeit in der Basis-Mudlib:

  * H_HOOK_MOVE
    Vor Bewegung eines Lebewesens ausgeloest.
    Datenveraenderung und Abbruch moeglich.
    Daten: ({dest,method,direction,textout,textin}), siehe move()

  * H_HOOK_DIE
    Beim Tod eines Lebewesens ausgeloest. Kann den Tod abbrechen oder
    <poisondeath> abaendern.
    Daten: int poisondeath, siehe die()

  * H_HOOK_DEFEND
    Im Defend() eines Lebenwesens ausgeloest. Kann das Defend() abbrechen 
    und Daten des Defend() aendern. Dieser Hook kommt nach einem eventuell
    in P_TMP_DEFEND_HOOK registrierten Legacy-Hook zum Zuge. Dessen Daten
    sind in den EINFO-Daten enthalten und werden durch die Rueckgabedaten
    dieses Hooks ersetzt.
    Daten: ({dam, dam_type, spell, enemy}), siehe Defend()

  * H_HOOK_ATTACK
    Im Attack() eines Lebenwesens ausgeloest. Kann das Attack() abbrechen.
    Daten: object* enemy (enthaelt nur enemy als einziges Element)

  * H_HOOK_ATTACK_MOD
    Wird im Attack() ausgeloest, nachdem die fuer den Angriff wichtigen Daten
    ermittelt und berechnet wurden. Diese koennen dann vom Hook-Consumer
    nochmal geaendert werden. Auch ein Abbruch des Attack() ist moeglich.
    Dieser Hook kommt nach Auswertung eines ggf. mittels P_TMP_ATTACK_HOOK
    eingetragenen Legacy-Hooks zum Zuge.
    Daten: deep_copy(ainfo), siehe Defendinfo, Abschnitt ORIGINAL_AINFO

  * H_HOOK_HP
  * H_HOOK_SP
    Bei Veraenderung der Property eines Spielers gerufen. Falls eine 
    Setmethode auf der Property liegt, wird der Hook wahrscheinlich meist
    doch nicht gerufen. Wenn sich der Wert nicht geaendert hat, wird er auch
    nicht gerufen: der Hook reagiert auf Veraenderung des Wertes, nicht
    auf den Aufruf von SetProp().
    Keine Datenveraenderung und kein Abbruch moeglich.
    Daten: der neue Wert der Property

  * H_HOOK_ALCOHOL
  * H_HOOK_FOOD
  * H_HOOK_DRINK
  * H_HOOK_POISON
    Bei Veraenderung der Property des Lebewesens gerufen. Falls eine 
    Setmethode auf der Property liegt, wird der Hook wahrscheinlich meist
    doch nicht gerufen. Wenn sich der Wert nicht geaendert hat, wird er auch
    nicht gerufen: der Hook reagiert auf Veraenderung des Wertes, nicht
    auf den Aufruf von SetProp().
    Datenveraenderung und Abbruch moeglich.
    Daten: neuer Wert der Property

  * H_HOOK_CONSUME
    Wird gerufen, wenn ein Lebewesen Speisen oder Getraenke in Kneipen 
    konsumiert.
    Datenveraenderung von <cinfo> und Abbruch moeglich. Aenderung von
    <testonly> nicht moeglich.
    Daten: ({cinfo, testonly}), siehe consume()

  * H_HOOK_TEAMROWCHANGE
    Bei Teamreihenwechsel eines Lebewesens ausgeloest.
    Keine Datenveraenderung und kein Abbruch moeglich.
    Daten: int* ({alteTeamreihe, neueTeamreihe})

  * H_HOOK_INSERT
    Wird von Spielerobjekten ausgeloest, nachdem ein Objekt ins 
    Spielerinventar bewegt wurde. 
    Keine Datenveraenderung und kein Abbruch moeglich.
    Daten: object, das ins Inventar bewegte Objekt.

  * H_HOOK_EXIT_USE
    Wird von einem Raum ausgeloest, wenn ein Lebewesen einen Ausgang benutzt.
    Datenveraenderung und Abbruch moeglich.
    Daten: ({string verb, string|closure destroom, string message})

  * H_HOOK_INIT
    Wird von einem Raum ausgeloest, wenn init() gerufen wird (d.h. ein 
    Lebewesen den Raum betritt).
    Abbruch moeglich.
    ACHTUNG: bei Abbruch von init() sind schwere Bugs wahrscheinlich!
    Daten: keine.


Hook-Prioritaeten
-----------------

Hooks lassen sich darueber hinaus noch mit unterschiedlicher Prioritaet 
eintragen, so dass bei Registrierung mehrerer Hooks am selben Provider diese
dann in der entsprechenden Reihenfolge abgearbeitet werden. Wenn ein neuer
Hook eingetragen wird, aber die max. Anzahl vorher schon erreicht war, wird
der Konsument mit der niedrigsten Prioritaet geloescht. In diesem Fall wird
der verdraengte Consumer durch Aufruf von superseededHook() darueber 
informiert, dass seine Verbindung getrennt wurde.


HOOK-CONSUMER
=============

Um sich bei einem Provider zu registrieren, ruft man in diesem die Funktion 
HRegisterToHook() auf (Beschreibung siehe unten bei den Hook-Providern).
Wenn die Registrierung erfolgreich war, ruft der Hook-Provider bei Eintritt
des Ereignisses in allen Konsumenten eine bestimmte Funktion auf. Wenn bei
der Registrierung ein Hook-Objekt angegeben wurde, wird standardmaessig die
Funktion HookCallback() gerufen. Registriert man stattdessen eine Closure,
wird diese mit denselben Daten wie die Lfun gerufen. Nachfolgend ist die
Lfun beschrieben, alles dort gesagte gilt aber genauso fuer Closures.

  * mixed HookCallback(object hookSource, int hookid, mixed hookData)

    Diese Methode wird in jedem Hook-Konsumenten eines Hook-Providers
    aufgerufen, solange die Verarbeitung nicht vorher abgebrochen wurde.
    Die Reihenfolge des Aufrufs ist Surveyor, Hook-Modifikator, 
    Data-Modifikator, Listener. Innerhalb der Gruppen wird nach Prioritaet
    abgearbeitet.
    Ein Surveyor-Hook kann verhindern, dass Hooks bestimmte Aenderungen
    durchfuehren.

    Der Funktion wird der Hook-Provider als Objekt hookSource, der Hook-Typ
    sowie dessen Daten uebergeben. Das bedeutet, man kann diese Funktion
    fuer die Bearbeitung verschiedener Hook-Typen registrieren.

    Als Rueckgabewert wird immer ein Array aus zwei Elementen erwartet, das
    die folgenden Angaben beinhalten muss:

    Element 0 (H_RETCODE) gibt an, welche Aktion die Callback-Funktion
    ausgefuehrt hat:
        H_NO_MOD     => keine Aenderungen
        H_ALTERED    => Daten wurden veraendert
        H_CANCELLED  => Hook-Kette soll abgebrochen werden, d.h. nach 
          Prioritaet spaeter aufzurufende Hooks kommen nicht mehr zum Zuge.
          => Ausserdem soll die Hook-ausloesende Stelle abgebrochen werden.
             Beispielsweise wird das Defend() abgebrochen, wenn ein 
             H_HOOK_DEFEND mit H_CANCELLED beantwortet wird.
    
    Element 1 (H_RETDATA) gibt die (evtl. geaenderten) Daten an
        mixed-Objekt, das wie der Parameter hookData aufgebaut ist.

    Hinweis: auch reine Listener-Objekte muessen ein Array zurueckgeben, das
    dann als erstes Element H_NO_MOD enthaelt.

    Ein Objekt darf sich mehrfach fuer den gleichen Hook registrieren.
    Allerdings ist dann fuer jede Registrierung eine andere Closure noetig.


  * void superseededHook(int hookid, object hookprovider)

    Wird gerufen, wenn der Konsument von einem anderen mit hoeherer Prioritaet
    verdraengt wurde.


HOOK-PROVIDER
=============

Der Hook-Provider bietet eine Menge von Methoden an, die eine Konfiguration
ermoeglichen und die Eintragung von Hook-Konsumenten erlauben. Im
Normalfall sollte er geerbt und muss nicht modifiziert werden. Die einzige
Konfiguration, die man typischerweise vornehmen muss, ist, die vom Objekt
bereitgestellten Hooks zu benennen.

  * int* HListHooks();

    Diese Methode liefert eine Liste von Hooktypen, fuer die das Objekt
    Registrierungen akzeptiert. Standardmaessig bieten die Mudlib-Basis-
    objekte folgende Hooks an:
    Spielerobjekte: H_HOOK_MOVE, H_HOOK_DIE, H_HOOK_DEFEND, H_HOOK_ATTACK,
                    H_HOOK_HP, H_HOOK_SP, H_HOOK_ATTACK_MOD, H_HOOK_ALCOHOL 
                    H_HOOK_FOOD, H_HOOK_DRINK, H_HOOK_POISON, H_HOOK_CONSUME,
                    H_HOOK_TEAMROWCHANGE ,H_HOOK_INSERT
    NPCs: H_HOOK_MOVE, H_HOOK_DIE, H_HOOK_DEFEND, H_HOOK_ATTACK, 
          H_HOOK_ATTACK_MOD, H_HOOK_ALCOHOL, H_HOOK_FOOD, H_HOOK_DRINK, 
          H_HOOK_POISON, H_HOOK_CONSUME, H_HOOK_TEAMROWCHANGE
    Raeume: H_HOOK_EXIT_USE, H_HOOK_INIT
    Dinge: keine


  * protected void offerHook(int hookid, int offerstate);

    Diese Methode dient dazu, einen bestimmten Hook anzubieten. Nur Hooks,
    die hiermit angeboten wurden, stehen zur Registrierung zur Verfuegung
    und werden im Rueckgabewert von HListHooks() aufgefuehrt.
    
    'offerstate': 0 (nicht verfuegbar), 1 (verfuegbar)


  * int HRegisterToHook(int hookid, mixed consumer, int hookprio,
                        int consumertype, int timeInSeconds);
    
    Registriert ein Objekt oder eine Closure als Hook-Konsument.
    Argumente:
    'hookid'        gibt den Hook-Typ an, s.o.
                    Man kann sich nur fuer Hooktypen eintragen, die die Methode
                    HListHooks() angeboten hat.
    'consumer'      Objekt oder Closure. Wenn ein Objekt uebergeben wird,
                    wird dieses eingetragen und spaeter HookCallback() an 
                    diesem Objekt gerufen.
                    Wenn eine Closure uebergeben wird, wird das Objekt der
                    Closure eingetragen und spaeter diese Closure gerufen.
    'hookprio'      Gibt die Prioritaet an, mit der der Hook laufen soll.
                    Diese Angabe bestimmt die Reihenfolge, in der die Hooks
                    in der Liste der Hooks eingetragen werden. Die moeglichen
                    Prioritaeten sind:
                    - H_HOOK_LIBPRIO(x)
                    - H_HOOK_GUILDPRIO(x) oder
                    - H_HOOK_OTHERPRIO(x).
                    x darf 0, 1 oder 2 sein (je niedriger, desto hoeher die
                    Prioritaet).
    'consumertype'  Gibt an, um welche Art von Consumer es sich handelt.
                    Es gibt vier festgelegten Arten, die fuer alle Hooks
                    existieren koennen, aber nicht muessen. Die Methode 
                    HConsumerTypeIsAllowed() gibt Aufschluss darueber, welche
                    Consumer-Typen tatsaechlich freigegeben sind (s.u.)
    'timeInSeconds' gibt die Laufzeit des Hooks an. Falls 0 eingetragen wird,
                    laeuft der Hook ewig.

    Rueckgabewerte:
      1 - Registrierung erfolgreich
    <=0 - Registrierung fehlgeschlagen mit folgendem Ergebnis:
          -1 : Hook unbekannt
          -2 : consumer ist keine closure und es konnte kein Callback auf
               HookCallback im consumer erstellt werden.
          -3 : Consumer ist bereits registriert
          -4 : Consumer-Typ ist nicht erlaubt
          -5 : hookprio ist nicht erlaubt
          -6 : Surveyor hat Registrierung nicht erlaubt
          -7 : zuviele Hooks registriert / kein Hookeintrag frei


  * int HUnregisterFromHook(int hookid, mixed consumer);

    Hebt die Registrierung von <consumer> fuer einen bestimmten Hook-Typ 
    wieder auf.
    Argumente:
    'hookid'    der Hook-Typ (s.o.)
    'consumer'  Das Objekt oder die Closure, dessen/deren Registrierung 
                aufgehoben werden soll. Bei einer Closure wird genau diese
                ausgetragen. Bei der Angabe eines Objekts wird versucht, die
                Closure auf HookCallback() in diesem Objekt auszutragen.

    Rueckgabewerte:
    0 - 'consumer' nicht als Konsument gefunden
    1 - Austragen erfolgreich


  * int HConsumerTypeIsAllowed(int type, object consumer);
    Diese Methode liefert 1 zurueck, wenn ein bestimmter Consumer-Typ
    (fuer diesen Konsumenten) erlaubt wird.
    Die Standardmethode liefert immer 1 (true) zurueck. Erbende Objekte
    koennen diese Methode ueberschreiben, wenn sie nicht alle Consumer-Typen
    anbieten.
    Wenn man diese Methode in einem eigenen Hook-Provider ueberschreibt,
    kann man Consumer-Typen nur global abschalten, aber nicht selektiv
    pro Hook-Typ.
    Alle Mudlib-Basisobjekte, die Hooks anbieten, geben hier zur Zeit immer
    1 zurueck, auch wenn die Hook-Typen die gewuenschte Funktionalitaet nicht
    auswerten. Beispielsweise kann man einen Hook-Modifikator fuer den
    Insert-Hook registrieren, damit aber nicht verhindern, dass das Objekt
    ins Spielerinventar bewegt wird.


  * int HPriorityIsAllowed(int prio, object consumer);
    Diese Methode gibt an, ob eine bestimmte Prioritaet (fuer den angegebenen
    Konsumenten) erlaubt ist. Die Standardmethode liefert immer 1 (true)
    zurueck. Erbende Objekte koennen diese Methode ueberschreiben, wenn
    sie die verfuegbaren Hook-Prioritaeten einschraenken wollen.
    Wenn man diese Methode in einem eigenen Hook-Provider ueberschreibt,
    kann man Prioritaeten nur global abschalten, aber nicht selektiv
    pro Hook-Typ.
    Alle Mudlib-Basisobjekte, die Hooks anbieten, geben hier zur Zeit immer
    1 zurueck.


  * int HIsHookConsumer(int hookid, mixed consumer);
    Ist <consumer> ein Objekt, liefert die Methode die Anzahl, wie oft dieses
    Objekt (mit verschiedenen Closures) fuer den Hook <hookid> eingetragen 
    ist.
    Ist <consumer> eine Closure, liefert diese Methode 1, wenn diese
    Closure fuer den Hook <hookid> eingetragen ist.


  * protected mapping HCopyHookMapping();
    Diese Methode liefert eine Kopie des Hook-Mappings.
    ACHTUNG: diese Daten sollten das Objekt ausser fuer Debugzwecke
             NIEMALS verlassen.

             
  * protected mapping HCopyHookConsumers(int hookid);
    Dieser Methode liefert eine Kopie der Hook-Consumer des Objektes.
    ACHTUNG: diese Daten sollten das Objekt ausser fuer Debugzwecke
             NIEMALS verlassen.


HOOK-SURVEYOR
=============

  Objekte mit Surveyorhooks muessen eine Menge von Methoden definieren, die
  der Hookprovider aufruft:

  * status HookRegistrationCallback(
                object registringObject,
                int hookid,
                object hookSource,
                int registringObjectsPriority,
                int registringObjectsType)
    Diese Methode wird vom Hook-Provider aufgerufen, wenn der Hook-Konsument
    als Surveyor eingetragen ist und ein weiterer Hook eingetragen werden 
    soll.
    Gibt diese Methode 0 zurueck, dann verbietet der Surveyor, dass der
    andere Konsument als Hook eingetragen wird.

  * int HookCancelAllowanceCallback(
                object cancellingObject,
                int hookid,
                object hookSource,
                int cancellingObjectsPriority,
                mixed hookData)
    Diese Methode wird aufgerufen, um herauszufinden, ob ein bestimmter
    anderer Hook die Ausfuehrung der Hook-Kette unterbrechen darf.
    Nur Hooks des Consumer-Typs H_HOOK_MODIFICATOR werden der Methode 
    uebergeben, weil nur diese neben dem Surveyor selbst ueberhaupt die
    Berechtigung haben, die Hook-Kette abzubrechen.

  * int HookModificationAllowanceCallback(
                object modifyingObject,
                int hookid,
                object hookSource,
                int modifyingObjectsPriority,
                mixed hookData)
    Diese Methode wird aufgerufen, um herauszufinden, ob ein bestimmter
    anderer Hook die Daten des Hooks veraendern darf oder nicht.
    Es werden die Hooks der Consumer-Typen H_HOOK_MODIFICATOR und
    H_DATA_MODIFICATOR (in dieser Reihenfolge) aufgerufen.


WAS KOSTET DAS?

  Das Ausloesen eines Hooks per HookFlow() kostet 111 Ticks und ca. 7 us, 
  wenn es gar keinen gibt, der drauf lauscht (sozusagen Fixkosten).
  Pro H_LISTENER kommen dann 31 Ticks und ca. 2 us dazu.

  Gibts einen Surveyor-Hook (der wird dann gefragt, ob andere Objekte die
  Daten des Hooks aendern oder die Hookverarbeitung abbrechen duerfen):
  Fixkosten: 155 Ticks, 11 us.
  Plus pro Data-Modifier:
  106 Ticks, 5.6 us
  Plus pro Hook-Modifier, der aber nur Daten aendert:
  112 Ticks, 6.4 us
  Und ein Hook-Modifier, der den Hook abbricht:
  76 Ticks, 4 us

  (Macht der Surveyor irgendwas anderes als 'return 1;', wirds natuerlich 
   entsprechend teurer.)

