GuardExit()

FUNKTION

protected <int|<string|closure>* >* GuardExit(object room, int hookid,
                                              <string|closure>* hdata);

DEFINIERT IN

/std/npc/moving.c

ARGUMENTE

room
     Der den Hook ausloesende Raum (environment())
hookid
     Die ID des Hooks (H_HOOK_EXIT_USE)
hdata
     Ein Array mit 3 Elementen:
     ({
         verb - Das Kommandoverb/Ausgangsname (string)
         dest - Zielraum (string) oder closure (special exits)
         msg  - Bewegungsrichtung (string) oder 0
     })

BESCHREIBUNG

Ist diese Funktion in einem NPC definiert, traegt sich der NPC bei jeder
Bewegung automatisch als Konsument von H_HOOK_EXIT_USE ein und diese
Funktion wird immer gerufen, wenn ein Lebewesen im gleichen Environment
wie der NPC versucht, einen Ausgang zu benutzen.
Der NPC kann dann die Bewegung abbrechen (und so den Ausgang
blockieren), Ziel oder Bewegungsmeldung aendern oder keine Veraenderung
vornehmen.
Die Konstanten fuer Hookid und Hookstatus (s. Rueckgabewert) sind in
<hook.h> definiert.

RUeCKGABEWERT

Array mit zwei Elementen:
({
    H_NO_MOD / H_ALTERED / H_CANCELLED,
    hdata
})
hdata ist ggf. das geaenderte Array, welches die Funktion uebergeben
wird. Weitere Details s. auch /doc/std/hooks

BEMERKUNGEN

Die Anzahl an Konsumenten eines Hooks ist begrenzt. Es ist daher
moeglich, dass die Registrierung nicht klappt, wenn zuviele (>5) Waechter
im Raum sind. Will man darauf reagieren, muesste man die Registrierung
pruefen.
Ein NPC, welcher GuardExit() definiert, aber im aktuellen Environment
keine Wache halten will, koennte sich selber de-registrieren.

BEISPIELE

 <int|<string|closure>* >* GuardExit(object room, int hookid,
                                     <string|closure>* hdata)
 {
   // Nur in Gefaengnisraeumen Wache halten
   if (strstr(object_name(environment()), "/room/jail")==0)
   {
     // Hier gehts nicht raus. ;-)
     if (hdata[0] == "raus") {
         tell_object(this_player(), ...);
         return ({H_CANCELLED, hdata});
     }
     // Special exits ersetzen wir durch einen eigenen
     else if (closurep(hdata[1])) {
       hdata[1] = #'my_special_exit;
       return ({H_ALTERED, hdata});
     }
     // alle anderen Ausgaenge in die persoenliche Zelle
     else {
       tell_object(this_player(), ...);
       hdata[1] = "/room/jail_"+getuid(this_player());
       hdata[2] = "Sueden";
       return ({H_ALTERED, hdata});
     }
  }
  // in allen anderen Raeumen nicht eingreifen
  return ({H_NO_MOD, hdata});
}

SIEHE AUCH

AddExit, AddSpecialExit, RemoveExit
HRegisterToHook, HRegisterModifier, HUnregisterFromHook
/doc/std/hooks

20.02.2016, Zesstra 22.05.2016, Mupfel (Beispiel korrigiert)