blob: 7fad0835d2ebd8c5b7dd2c95696451f32990c972 [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.
67 In diesem Fall ist der Rueckgabe der kleinste von allen gerufenen
68 ReceiveMsg() zurueckgelieferte Wert.
69
Bugfixb1d9b4d2021-09-14 20:07:04 +020070 Zur einfacheren Verwendung gibt es einige Wrapper-Funktionen, siehe
71 :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay` und
72 :doc:`ReceiveTeilemit`.
Zesstra18626972017-01-31 10:38:27 +010073
74RUeCKGABEWERT
75-------------
76::
77
78 > 0 fuer Erfolg, < 0 fuer Misserfolg, s.u.
79 MSG_DELIVERED bei erfolgreicher Zustellung
80 MSG_BUFFERED bei Zwischenspeicherung durch den Kobold
81
82 MSG_FAILED nicht naeher spezifizierter Fehler bei Zustellung
83 MSG_IGNORED Nachricht wurde ignoriert (Absender, origin)
84 MSG_VERB_IGN Nachricht wurde ignoriert (Kommandoverb, msg_action)
85 MSG_MUD_IGN Absendendes Mud wurde ignoriert.
86 MSG_SENSE_BLOCK Passende Sinne des Empfaenger sind blockiert (z.B.
87 blind, taub)
88 MSG_BUFFER_FULL Kobold kann sich nichts mehr merken
89
90BEMERKUNGEN
91-----------
92::
93
94 Fuer saemtliche Alternativmeldungen im Falle einer nicht erfolgreich
95 zugestellten Nachricht ist der Aufrufer von ReceiveMsg() verantwortlich.
96
97 NPCs:
98 * ReceiveMsg() ruft zwecks Abwaertskompatibilitaet catch_tell() auf
99 * empfohlen ist, in NPCs nun ReceiveMsg() zu ueberschreiben.
100 * catch_tell() muss weiterhin fuer andere tell_object()
101 ueberschrieben werden
102
103BEISPIELE
104---------
105::
106
107 #1.1 Nachricht an einen Spieler, zB in der Wueste
108 this_player()->ReceiveMsg("Die Sonne brennt dir auf den Kopf.",
109 MT_FEEL|MT_LOOK);
110
111 #1.2 Nachricht an einen Spieler von einem NPC mit Indent
112 // bei aktivem Editor+Kobold landet dieser Text auch im Kobold
113 this_player()->ReceiveMsg("Du haust ja ganz schoen rein!",
114 MT_COMM|MT_FAR|MSG_DONT_STORE,
115 MA_TELL,
116 "Arkshat teilt dir mit: ");
117
118 #1.3 Nachricht an einen Spieler mit Fallback-Kaskade
119 // Achtung, bei MT_COMM oder Ignorieren gibt es natuerlich auch
120 // Misserfolgs-Rueckgaben. Bei einem normalen Kommando wie diesem
121 // hier ist das unproblematisch und daher sinnvoll:
122 if(this_player()->ReceiveMsg(
123 "Du drueckst den Knopf und es oeffnet sich knirschend "
124 "ein kleines Fach in der Wand.", MT_LOOK) < MSG_DELIVERED &&
125 this_player()->ReceiveMsg(
126 "Du drueckst den Knopf und irgend etwas scheint sich "
127 "knirschend zu oeffnen. Das Geraeusch kam von der Wand.",
128 MT_LISTEN) < MSG_DELIVERED) // leider blind UND taub ... also:
129 this_player()->ReceiveMsg(
130 "Du drueckst den Knopf und irgend etwas scheint zu passieren, "
131 "aber leider siehst und hoerst du nichts.", MT_FEEL);
132
133
134 #2.1 Im NPC als Empfaenger auf ein TM reagieren
135 public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action,
136 string msg_prefix, mixed origin) {
137 int ret = MSG_DELIVERED; // Default
138
139 // eine OOC-Kommunikation?
140 if(msg_typ&MT_COMM) {
141 if(strstr(msg, "hilfe")>=0)
142 if(environment(origin)==environment()) {
143 origin->ReceiveMsg("Ich werd dir gleich helfen!",
144 MT_COMM|MSG_DONT_STORE, MA_TELL,
145 "Arkshat teilt dir mit: ");
146 } else {
147 origin->ReceiveMsg("Hilf dir selbst, dann hilft dir Gott!",
148 MT_COMM|MT_FAR|MSG_DONT_STORE,
149 MA_TELL,
150 "Arkshat teilt dir mit: ");
151 }
152 else if(...)
153 [...]
154 } else if(msg_typ&MT_LISTEN && msg_action==MA_SAY) {
155 [...]
156 }
157
158 return ret;
159 }
160
161
162 #3.1 als Sender an viele, Variante mit eigenem filter
163 // Achtung: siehe 3.3. send_room() loest vieles.
164 // Living nickt nur seinen Nichtgegnern zu
165 object *all = filter(all_inventory(environment(this_player())),
166 #'living) - ({this_player()});
167 all -= this_player()->PresentEnemies();
168 all->ReceiveMsg(this_player()->Name()+
169 " nickt dir verstohlen zu und scheint bereit.",
170 MT_LOOK, MA_EMOTE);
171
172 #3.2 als Sender an viele, Variante mit einzelnem Iterieren
173 // Achtung: siehe 3.3. send_room() loest vieles.
174 // Living trinkt etwas, jeder im Raum soll es sehen oder hoeren
175 object ob = first_inventory(environment(this_player()));
176 do {
177 if(living(ob) && ob!=this_player())
178 ob->ReceiveMsg(this_player()->Name()+" trinkt einen Schnaps aus.",
179 MT_LOOK|MT_LISTEN,
180 MA_DRINK);
181 ob = next_inventory(ob);
182 } while(ob);
183
184 #3.3 als Sender an viele, Variante mit send_room
185 // Living gruesst seine Freunde
186 // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern
187 object *exclude = this_player()->PresentEnemies();
188 send_room(this_object(),
189 this_player()->Name()+" gruesst dich.",
190 MT_LOOK|MT_LISTEN,
191 MA_EMOTE,
192 0,
193 exclude);
194
195 #3.4 als Sender an viele mit send_room und ReceiveMsg()
196 // Living gruesst seine Freunde, seine Feinde sehen das
197 // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern
198 object *exclude = this_player()->PresentEnemies();
199 send_room(this_object(),
200 this_player()->Name()+" gruesst dich.",
201 MT_LOOK|MT_LISTEN, MA_EMOTE, 0, exclude);
202 exclude->ReceiveMessage(
203 this_player()->Name()+" gruesst, aber nicht dich.",
204 MT_LOOK|MT_LISTEN, MA_EMOTE);
205
206KONSTANTEN FUER PARAMETER
207-------------------------
208::
209
210 Saemtlich in "/sys/living/comm.h". Hier nicht notwendigerweise
211 immer aktuell oder vollstaendig.
212
213 <msg_typ>
214 MT_UNKNOWN unspez. Nachrichtentyp (nicht verwenden). Es wird
215 versucht, aufgrund <msg_action> den Typ zu erraten.
216 MT_LOOK alles, was man sieht
217 MT_LISTEN alles, was man hoert
218 MT_FEEL alles, was man fuehlt
219 MT_TASTE alles, was man schmeckt
220 MT_SMELL alles, was man riecht
221 MT_MAGIC alle sonstigen (uebersinnlichen) Wahrnehmungen
222 MT_NOTIFICATION Statusmeldungen, Kommandobestaetigungen
223 MT_COMM alle OOC-Kommunikation, d.h. nicht durch o.g. Sinne
224 abgedeckt.
225 MT_FAR alles, was aus der Ferne / einem anderen Raum kommt.
226 muss mit min. einem anderen Typ kombiniert werden
227 MT_DEBUG Debugmeldungen, sehen nur Magier im Magiermodus
228 MT_NEWS Mails & MPA
229
230 MSG_DONT_BUFFER Nachricht darf nicht im Kobold gespeichert werden
231 MSG_DONT_STORE Nachricht darf nicht in die Comm-History
232 MSG_DONT_WRAP Nachricht nicht per break_string umbrechen
233 MSG_DONT_IGNORE Nachricht kann nicht ignoriert werden
Bugfix427a5812022-01-07 15:41:24 +0100234 MSG_ALL_TYPES alle relevanten Sinne fuer die angegebenen Nachrichten-
235 typen muessen benutzbar sein (UND statt ODER).
Bugfix3afcb792022-01-21 22:32:42 +0100236 MSG_ALERT Nachricht loest eine vom Spieler konfigurierte
237 Benachrichtigung aus (z.B. Piepston)
Zesstra18626972017-01-31 10:38:27 +0100238
239 MSG_BS_LEAVE_LFS wie BS_LEAVE_MY_LFS fuer break_string()
240 MSG_BS_SINGLE_SPACE wie BS_SINGLE_SPACE fuer break_string()
241 MSG_BS_BLOCK wie BS_BLOCK fuer break_string()
242 MSG_BS_NO_PARINDENT wie BS_NO_PARINDENT fuer break_string()
243 MSG_BS_INDENT_ONCE wie BS_INDENT_ONCE fuer break_string()
244 MSG_BS_PREP_INDENT wie BS_PREPEND_INDENT fuer break_string()
245
246 <msg_action> (optional)
247 MA_UNKNOWN Unspez. Aktion. Es wird der Default query_verb()
248 benutzt bzw. versucht, die Aktion zu erraten.
249 MA_PUT Jemand legt etwas hin und gibt jemanden etwas
250 MA_TAKE Jemand nimmt etwas
Bugfix1450fbd2022-10-05 23:03:44 +0200251 MA_GIVE Jemand gibt jemandem etwas
Zesstra18626972017-01-31 10:38:27 +0100252 MA_MOVE_IN Jemand betritt den Raum
253 MA_MOVE_OUT Jemand verlaesst den Raum
254 MA_MOVE Jemand bewegt sich
255 MA_FIGHT Jemand kaempft
256 MA_WIELD Jemand zueckt eine Waffe
257 MA_UNWIELD Jemand steckt eine Waffe weg
258 MA_WEAR Jemand zieht etwas an
259 MA_UNWEAR Jemand zieht etwas aus
260 MA_EAT Jemand isst etwas
261 MA_DRINK Jemand trinkt etwas
262 MA_SPELL Jemand wirkt einen Spell
263 MA_LOOK Jemand sieht etwas an, untersucht etwas
264 MA_LISTEN Jemand horcht oder lauscht an etwas
265 MA_FEEL Jemand betastet etwas
266 MA_SMELL Jemand schnueffelt herum
267 MA_SENSE Jemand macht eine uebersinnliche Wahrnehmung
268 MA_READ Jemand liest etwas
269 MA_USE Jemand benutzt etwas
270 MA_SAY Jemand sagt etwas
271 MA_REMOVE Etwas verschwindet
272 // MA_CHAT Chatkrams (z.B. teile-mit, Teamkampfchat)
273 MA_CHANNEL Ebenen
274 MA_EMOTE (r)Emotes, Soulverben (remotes mit Typ MT_COMM|MT_FAR)
275 MA_SHOUT Rufen (nicht: shout()!)
276 MA_SHOUT_SEFUN Rufen ueber shout(SE)
277
278SIEHE AUCH
279----------
280::
281
Bugfixb1d9b4d2021-09-14 20:07:04 +0200282 Wrapper-Funktionen: :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay`, :doc:`ReceiveTeilemit`
Zesstra18626972017-01-31 10:38:27 +0100283 Verwandt: send_room(SE)
284 Lfuns: TestIgnore(L)
285 Efuns: tell_object(E), catch_tell(L), catch_msg(L)
286 query_verb(E), query_once_interactive(E), break_string(SE)
287
Bugfix3afcb792022-01-21 22:32:42 +0100288Letzte Aenderung: 22.01.2022
289