
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)
