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)
