GuardExit() =========== FUNKTION -------- :: protected * >* GuardExit(object room, int hookid, * 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 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 --------- :: * >* GuardExit(object room, int hookid, * 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)