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)
      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.


ANCELLED, hookData});
----------

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.)

