blob: 88da3c9f589b8dd03f2b6df414c99124fadbb76f [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
2GuardExit()
3***********
4
5
6FUNKTION
7========
8
9 protected <int|<string|closure>* >* GuardExit(object room, int hookid,
10 <string|closure>* hdata);
11
12
13DEFINIERT IN
14============
15
16 /std/npc/moving.c
17
18
19ARGUMENTE
20=========
21
22 room
23 Der den Hook ausloesende Raum (environment())
24 hookid
25 Die ID des Hooks (H_HOOK_EXIT_USE)
26 hdata
27 Ein Array mit 3 Elementen:
28 ({
29 verb - Das Kommandoverb/Ausgangsname (string)
30 dest - Zielraum (string) oder closure (special exits)
31 msg - Bewegungsrichtung (string) oder 0
32 })
33
34
35BESCHREIBUNG
36============
37
38 Ist diese Funktion in einem NPC definiert, traegt sich der NPC bei jeder
39 Bewegung automatisch als Konsument von H_HOOK_EXIT_USE ein und diese
40 Funktion wird immer gerufen, wenn ein Lebewesen im gleichen Environment
41 wie der NPC versucht, einen Ausgang zu benutzen.
42 Der NPC kann dann die Bewegung abbrechen (und so den Ausgang
43 blockieren), Ziel oder Bewegungsmeldung aendern oder keine Veraenderung
44 vornehmen.
45 Die Konstanten fuer Hookid und Hookstatus (s. Rueckgabewert) sind in
46 <hook.h> definiert.
47
48
49RUeCKGABEWERT
50=============
51
52 Array mit zwei Elementen:
53 ({
54 H_NO_MOD / H_ALTERED / H_CANCELLED,
55 hdata
56 })
57 hdata ist ggf. das geaenderte Array, welches die Funktion uebergeben
58 wird. Weitere Details s. auch /doc/std/hooks
59
60
61BEMERKUNGEN
62===========
63
64 Die Anzahl an Konsumenten eines Hooks ist begrenzt. Es ist daher
65 moeglich, dass die Registrierung nicht klappt, wenn zuviele (>5) Waechter
66 im Raum sind. Will man darauf reagieren, muesste man die Registrierung
67 pruefen.
68 Ein NPC, welcher GuardExit() definiert, aber im aktuellen Environment
69 keine Wache halten will, koennte sich selber de-registrieren.
70
71
72BEISPIELE
73=========
74
75 <int|<string|closure>* >* GuardExit(object room, int hookid,
76 <string|closure>* hdata)
77 {
78 // Nur in Gefaengnisraeumen Wache halten
79 if (strstr(object_name(environment()), "/room/jail")==0)
80 {
81 // Hier gehts nicht raus. ;-)
82 if (hdata[0] == "raus") {
83 tell_object(this_player(), ...);
84 return ({H_CANCELLED, hdata});
85 }
86 // Special exits ersetzen wir durch einen eigenen
87 else if (closurep(hdata[1])) {
88 hdata[1] = #'my_special_exit;
89 return ({H_ALTERED, hdata});
90 }
91 // alle anderen Ausgaenge in die persoenliche Zelle
92 else {
93 tell_object(this_player(), ...);
94 hdata[1] = "/room/jail_"+getuid(this_player());
95 hdata[2] = "Sueden";
96 return ({H_ALTERED, hdata});
97 }
98 }
99 // in allen anderen Raeumen nicht eingreifen
100 return ({H_NO_MOD, hdata});
101 }
102
103
104SIEHE AUCH
105==========
106
107 AddExit, AddSpecialExit, RemoveExit
108 HRegisterToHook, HRegisterModifier, HUnregisterFromHook
109 /doc/std/hooks
110
11120.02.2016, Zesstra 22.05.2016, Mupfel (Beispiel korrigiert)