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