blob: 17a3dee6962f9c533f1ed7e8c5a5f58885a04b70 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001ReceiveMsg()
2============
3
4ReceiveMsg()
5
6public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action,
7 string msg_prefix, mixed origin)
8------------------------------------------------------------------------------------------------------------------------------------------------------
9::
10
11DEFINIERT IN
12------------
13::
14
Zesstra18626972017-01-31 10:38:27 +010015 /std/npc/comm.c
16 /std/player/comm.c
17 /std/room/items.c
Bugfix2f292a32021-09-21 12:01:20 +020018 /sys/living/comm.h
Zesstra18626972017-01-31 10:38:27 +010019
20ARGUMENTE
21---------
22::
23
24 string msg
25 String mit der uebermittelten Nachricht. Muss nicht umgebrochen sein,
26 da ReceiveMsg() das ebenfalls erledigt.
27 int msg_typ
28 Nachrichtentyp(en) fuer Filterung und Flags fuer Behandlung/Umbruch.
29 Siehe unten fuer mit | kombinierbare Konstanten.
30 string msg_action (optional)
31 Ausloesende Aktion, wird auch fuer Ignorieren verwendet.
32 Default ist query_verb(). Siehe unten fuer alternative Konstanten.
33 string msg_prefix (optional)
34 String, welcher ggf. im break_string() als indent verwendet wird.
35 Default ist 0 (kein Indent)
36 mixed origin (<object>) (optional)
37 Das die Meldung ausloesende Objekt, wird fuer Ignorieren verwendet.
38 Default: previous_object()
39
40BESCHREIBUNG
41------------
42::
43
44 ReceiveMsg() wird benutzt, um einem Lebewesen eine Nachricht zu senden.
45 Dabei ruft es das sonst uebliche tell_object() fuer Spieler bzw.
46 catch_tell() im NPC auf.
47
48 Gerade fuer Nachrichten an Spieler bietet die Methode weitere Features,
49 die bisher sonst haendisch zu implementieren waren:
50 1) Pruefung auf Empfangbarkeit, je nach 'msg_typ', zB
51 MT_LOOK nur an Nichtblinde
52 MT_LISTEN nur an Nichttaube
53 MT_DEBUG nur an Magier/Testspieler
54 2) Pruefen auf Ignorieren von
55 - Aktion ('msg_action')
56 - mit 'msg_action' || query_verb()
57 - Urheber ('origin')
58 - fuer sendende Spieler mit origin->query_realname()
59 - fuer sendende NPCs mit origin->Name(RAW))
60 3) Speicherung in der tmhist (Typ MT_COMM)
61 4) Speicherung im Kobold (Typ MT_COMM + aktiver Kobold)
62 5) Umbrechen unter Beruecksichtigung von indent, 'msg_typ'-Flags
63 fuer Umbruch und P_PREPEND_BS
64
65 Raeume definieren standardmaessig ebenfalls ein ReceiveMsg(), welches in
66 jedem Objekt im Raum ReceiveMsg() mit den uebergebenen Argumenten aufruft.
67 In diesem Fall ist der Rueckgabe der kleinste von allen gerufenen
68 ReceiveMsg() zurueckgelieferte Wert.
69
70
71
72RUeCKGABEWERT
73-------------
74::
75
76 > 0 fuer Erfolg, < 0 fuer Misserfolg, s.u.
77 MSG_DELIVERED bei erfolgreicher Zustellung
78 MSG_BUFFERED bei Zwischenspeicherung durch den Kobold
79
80 MSG_FAILED nicht naeher spezifizierter Fehler bei Zustellung
81 MSG_IGNORED Nachricht wurde ignoriert (Absender, origin)
82 MSG_VERB_IGN Nachricht wurde ignoriert (Kommandoverb, msg_action)
83 MSG_MUD_IGN Absendendes Mud wurde ignoriert.
84 MSG_SENSE_BLOCK Passende Sinne des Empfaenger sind blockiert (z.B.
85 blind, taub)
86 MSG_BUFFER_FULL Kobold kann sich nichts mehr merken
87
88BEMERKUNGEN
89-----------
90::
91
92 Fuer saemtliche Alternativmeldungen im Falle einer nicht erfolgreich
93 zugestellten Nachricht ist der Aufrufer von ReceiveMsg() verantwortlich.
94
95 NPCs:
96 * ReceiveMsg() ruft zwecks Abwaertskompatibilitaet catch_tell() auf
97 * empfohlen ist, in NPCs nun ReceiveMsg() zu ueberschreiben.
98 * catch_tell() muss weiterhin fuer andere tell_object()
99 ueberschrieben werden
100
101BEISPIELE
102---------
103::
104
105 #1.1 Nachricht an einen Spieler, zB in der Wueste
106 this_player()->ReceiveMsg("Die Sonne brennt dir auf den Kopf.",
107 MT_FEEL|MT_LOOK);
108
109 #1.2 Nachricht an einen Spieler von einem NPC mit Indent
110 // bei aktivem Editor+Kobold landet dieser Text auch im Kobold
111 this_player()->ReceiveMsg("Du haust ja ganz schoen rein!",
112 MT_COMM|MT_FAR|MSG_DONT_STORE,
113 MA_TELL,
114 "Arkshat teilt dir mit: ");
115
116 #1.3 Nachricht an einen Spieler mit Fallback-Kaskade
117 // Achtung, bei MT_COMM oder Ignorieren gibt es natuerlich auch
118 // Misserfolgs-Rueckgaben. Bei einem normalen Kommando wie diesem
119 // hier ist das unproblematisch und daher sinnvoll:
120 if(this_player()->ReceiveMsg(
121 "Du drueckst den Knopf und es oeffnet sich knirschend "
122 "ein kleines Fach in der Wand.", MT_LOOK) < MSG_DELIVERED &&
123 this_player()->ReceiveMsg(
124 "Du drueckst den Knopf und irgend etwas scheint sich "
125 "knirschend zu oeffnen. Das Geraeusch kam von der Wand.",
126 MT_LISTEN) < MSG_DELIVERED) // leider blind UND taub ... also:
127 this_player()->ReceiveMsg(
128 "Du drueckst den Knopf und irgend etwas scheint zu passieren, "
129 "aber leider siehst und hoerst du nichts.", MT_FEEL);
130
131
132 #2.1 Im NPC als Empfaenger auf ein TM reagieren
133 public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action,
134 string msg_prefix, mixed origin) {
135 int ret = MSG_DELIVERED; // Default
136
137 // eine OOC-Kommunikation?
138 if(msg_typ&MT_COMM) {
139 if(strstr(msg, "hilfe")>=0)
140 if(environment(origin)==environment()) {
141 origin->ReceiveMsg("Ich werd dir gleich helfen!",
142 MT_COMM|MSG_DONT_STORE, MA_TELL,
143 "Arkshat teilt dir mit: ");
144 } else {
145 origin->ReceiveMsg("Hilf dir selbst, dann hilft dir Gott!",
146 MT_COMM|MT_FAR|MSG_DONT_STORE,
147 MA_TELL,
148 "Arkshat teilt dir mit: ");
149 }
150 else if(...)
151 [...]
152 } else if(msg_typ&MT_LISTEN && msg_action==MA_SAY) {
153 [...]
154 }
155
156 return ret;
157 }
158
159
160 #3.1 als Sender an viele, Variante mit eigenem filter
161 // Achtung: siehe 3.3. send_room() loest vieles.
162 // Living nickt nur seinen Nichtgegnern zu
163 object *all = filter(all_inventory(environment(this_player())),
164 #'living) - ({this_player()});
165 all -= this_player()->PresentEnemies();
166 all->ReceiveMsg(this_player()->Name()+
167 " nickt dir verstohlen zu und scheint bereit.",
168 MT_LOOK, MA_EMOTE);
169
170 #3.2 als Sender an viele, Variante mit einzelnem Iterieren
171 // Achtung: siehe 3.3. send_room() loest vieles.
172 // Living trinkt etwas, jeder im Raum soll es sehen oder hoeren
173 object ob = first_inventory(environment(this_player()));
174 do {
175 if(living(ob) && ob!=this_player())
176 ob->ReceiveMsg(this_player()->Name()+" trinkt einen Schnaps aus.",
177 MT_LOOK|MT_LISTEN,
178 MA_DRINK);
179 ob = next_inventory(ob);
180 } while(ob);
181
182 #3.3 als Sender an viele, Variante mit send_room
183 // Living gruesst seine Freunde
184 // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern
185 object *exclude = this_player()->PresentEnemies();
186 send_room(this_object(),
187 this_player()->Name()+" gruesst dich.",
188 MT_LOOK|MT_LISTEN,
189 MA_EMOTE,
190 0,
191 exclude);
192
193 #3.4 als Sender an viele mit send_room und ReceiveMsg()
194 // Living gruesst seine Freunde, seine Feinde sehen das
195 // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern
196 object *exclude = this_player()->PresentEnemies();
197 send_room(this_object(),
198 this_player()->Name()+" gruesst dich.",
199 MT_LOOK|MT_LISTEN, MA_EMOTE, 0, exclude);
200 exclude->ReceiveMessage(
201 this_player()->Name()+" gruesst, aber nicht dich.",
202 MT_LOOK|MT_LISTEN, MA_EMOTE);
203
204KONSTANTEN FUER PARAMETER
205-------------------------
206::
207
208 Saemtlich in "/sys/living/comm.h". Hier nicht notwendigerweise
209 immer aktuell oder vollstaendig.
210
211 <msg_typ>
212 MT_UNKNOWN unspez. Nachrichtentyp (nicht verwenden). Es wird
213 versucht, aufgrund <msg_action> den Typ zu erraten.
214 MT_LOOK alles, was man sieht
215 MT_LISTEN alles, was man hoert
216 MT_FEEL alles, was man fuehlt
217 MT_TASTE alles, was man schmeckt
218 MT_SMELL alles, was man riecht
219 MT_MAGIC alle sonstigen (uebersinnlichen) Wahrnehmungen
220 MT_NOTIFICATION Statusmeldungen, Kommandobestaetigungen
221 MT_COMM alle OOC-Kommunikation, d.h. nicht durch o.g. Sinne
222 abgedeckt.
223 MT_FAR alles, was aus der Ferne / einem anderen Raum kommt.
224 muss mit min. einem anderen Typ kombiniert werden
225 MT_DEBUG Debugmeldungen, sehen nur Magier im Magiermodus
226 MT_NEWS Mails & MPA
227
228 MSG_DONT_BUFFER Nachricht darf nicht im Kobold gespeichert werden
229 MSG_DONT_STORE Nachricht darf nicht in die Comm-History
230 MSG_DONT_WRAP Nachricht nicht per break_string umbrechen
231 MSG_DONT_IGNORE Nachricht kann nicht ignoriert werden
232
233 MSG_BS_LEAVE_LFS wie BS_LEAVE_MY_LFS fuer break_string()
234 MSG_BS_SINGLE_SPACE wie BS_SINGLE_SPACE fuer break_string()
235 MSG_BS_BLOCK wie BS_BLOCK fuer break_string()
236 MSG_BS_NO_PARINDENT wie BS_NO_PARINDENT fuer break_string()
237 MSG_BS_INDENT_ONCE wie BS_INDENT_ONCE fuer break_string()
238 MSG_BS_PREP_INDENT wie BS_PREPEND_INDENT fuer break_string()
239
240 <msg_action> (optional)
241 MA_UNKNOWN Unspez. Aktion. Es wird der Default query_verb()
242 benutzt bzw. versucht, die Aktion zu erraten.
243 MA_PUT Jemand legt etwas hin und gibt jemanden etwas
244 MA_TAKE Jemand nimmt etwas
245 MA_MOVE_IN Jemand betritt den Raum
246 MA_MOVE_OUT Jemand verlaesst den Raum
247 MA_MOVE Jemand bewegt sich
248 MA_FIGHT Jemand kaempft
249 MA_WIELD Jemand zueckt eine Waffe
250 MA_UNWIELD Jemand steckt eine Waffe weg
251 MA_WEAR Jemand zieht etwas an
252 MA_UNWEAR Jemand zieht etwas aus
253 MA_EAT Jemand isst etwas
254 MA_DRINK Jemand trinkt etwas
255 MA_SPELL Jemand wirkt einen Spell
256 MA_LOOK Jemand sieht etwas an, untersucht etwas
257 MA_LISTEN Jemand horcht oder lauscht an etwas
258 MA_FEEL Jemand betastet etwas
259 MA_SMELL Jemand schnueffelt herum
260 MA_SENSE Jemand macht eine uebersinnliche Wahrnehmung
261 MA_READ Jemand liest etwas
262 MA_USE Jemand benutzt etwas
263 MA_SAY Jemand sagt etwas
264 MA_REMOVE Etwas verschwindet
265 // MA_CHAT Chatkrams (z.B. teile-mit, Teamkampfchat)
266 MA_CHANNEL Ebenen
267 MA_EMOTE (r)Emotes, Soulverben (remotes mit Typ MT_COMM|MT_FAR)
268 MA_SHOUT Rufen (nicht: shout()!)
269 MA_SHOUT_SEFUN Rufen ueber shout(SE)
270
271SIEHE AUCH
272----------
273::
274
275 Verwandt: send_room(SE)
276 Lfuns: TestIgnore(L)
277 Efuns: tell_object(E), catch_tell(L), catch_msg(L)
278 query_verb(E), query_once_interactive(E), break_string(SE)
279
28013.03.2016, Zesstra
281