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