blob: 33a51ea7b11d879a49a4ab5d27597a0535765685 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001ReceiveMsg()
2************
3
Zesstra953f9972017-02-18 15:37:36 +01004public varargs int ReceiveMsg(string msg, int msg_typ, string
5msg_action,
6 string msg_prefix, mixed origin)
MG Mud User88f12472016-06-24 23:31:02 +02007
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra953f9972017-02-18 15:37:36 +01009DEFINIERT IN
10============
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012 /std/npc/comm.c
13 /std/player/comm.c
14 /std/room/items.c
Arathornf76eb122022-01-09 13:19:39 +010015 /sys/living/comm.h
MG Mud User88f12472016-06-24 23:31:02 +020016
MG Mud User88f12472016-06-24 23:31:02 +020017
Zesstra953f9972017-02-18 15:37:36 +010018ARGUMENTE
19=========
MG Mud User88f12472016-06-24 23:31:02 +020020
Zesstra953f9972017-02-18 15:37:36 +010021 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()
MG Mud User88f12472016-06-24 23:31:02 +020036
MG Mud User88f12472016-06-24 23:31:02 +020037
Zesstra953f9972017-02-18 15:37:36 +010038BESCHREIBUNG
39============
MG Mud User88f12472016-06-24 23:31:02 +020040
Zesstra953f9972017-02-18 15:37:36 +010041 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.
MG Mud User88f12472016-06-24 23:31:02 +020044
Zesstra953f9972017-02-18 15:37:36 +010045 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
Zesstrae959e722025-07-09 22:11:16 +020051 Bei gesetztem MSG_ALL_SENSES muessen alle fuer die angegebenen Typen
52 relevanten Sinne des Empfaengers benutzbar sein, nicht nur einer.
Zesstra953f9972017-02-18 15:37:36 +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
Zesstrae959e722025-07-09 22:11:16 +020063 6) Ersetzen von Farbtags entsprechendes Terminaltyps des Clients.
Zesstra953f9972017-02-18 15:37:36 +010064
65 Raeume definieren standardmaessig ebenfalls ein ReceiveMsg(), welches in
66 jedem Objekt im Raum ReceiveMsg() mit den uebergebenen Argumenten aufruft.
Zesstrae959e722025-07-09 22:11:16 +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.
70
71 Zur einfacheren Verwendung gibt es einige Wrapper-Funktionen, siehe
72 :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay` und
73 :doc:`ReceiveTeilemit`, :doc:`ReceiveWave`.
Zesstra953f9972017-02-18 15:37:36 +010074
75
76RUeCKGABEWERT
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
91
92BEMERKUNGEN
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
104
105BEISPIELE
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!",
MG Mud User88f12472016-06-24 23:31:02 +0200149 MT_COMM|MT_FAR|MSG_DONT_STORE,
150 MA_TELL,
151 "Arkshat teilt dir mit: ");
Zesstra953f9972017-02-18 15:37:36 +0100152 }
153 else if(...)
154 [...]
155 } else if(msg_typ&MT_LISTEN && msg_action==MA_SAY) {
156 [...]
157 }
MG Mud User88f12472016-06-24 23:31:02 +0200158
Zesstra953f9972017-02-18 15:37:36 +0100159 return ret;
160 }
MG Mud User88f12472016-06-24 23:31:02 +0200161
162
Zesstra953f9972017-02-18 15:37:36 +0100163 #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);
MG Mud User88f12472016-06-24 23:31:02 +0200172
Zesstra953f9972017-02-18 15:37:36 +0100173 #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);
MG Mud User88f12472016-06-24 23:31:02 +0200184
Zesstra953f9972017-02-18 15:37:36 +0100185 #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);
MG Mud User88f12472016-06-24 23:31:02 +0200206
207
Zesstra953f9972017-02-18 15:37:36 +0100208KONSTANTEN FUER PARAMETER
209=========================
MG Mud User88f12472016-06-24 23:31:02 +0200210
Zesstra953f9972017-02-18 15:37:36 +0100211 Saemtlich in "/sys/living/comm.h". Hier nicht notwendigerweise
212 immer aktuell oder vollstaendig.
MG Mud User88f12472016-06-24 23:31:02 +0200213
Zesstra953f9972017-02-18 15:37:36 +0100214 <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
MG Mud User88f12472016-06-24 23:31:02 +0200230
Zesstra953f9972017-02-18 15:37:36 +0100231 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
Zesstrae959e722025-07-09 22:11:16 +0200235 MSG_ALL_TYPES alle relevanten Sinne fuer die angegebenen Nachrichten-
236 typen muessen benutzbar sein (UND statt ODER).
237 MSG_ALERT Nachricht loest eine vom Spieler konfigurierte
238 Benachrichtigung aus (z.B. Piepston)
MG Mud User88f12472016-06-24 23:31:02 +0200239
Zesstra953f9972017-02-18 15:37:36 +0100240 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()
MG Mud User88f12472016-06-24 23:31:02 +0200246
Zesstra953f9972017-02-18 15:37:36 +0100247 <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
Arathornd69540a2023-11-02 21:43:37 +0100252 MA_GIVE Jemand gibt jemandem etwas
Zesstra953f9972017-02-18 15:37:36 +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)
MG Mud User88f12472016-06-24 23:31:02 +0200278
MG Mud User88f12472016-06-24 23:31:02 +0200279
Zesstra953f9972017-02-18 15:37:36 +0100280SIEHE AUCH
281==========
MG Mud User88f12472016-06-24 23:31:02 +0200282
Zesstrae959e722025-07-09 22:11:16 +0200283 Wrapper-Funktionen: :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay`, :doc:`ReceiveTeilemit`
Zesstra953f9972017-02-18 15:37:36 +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)
MG Mud User88f12472016-06-24 23:31:02 +0200288
Zesstrae959e722025-07-09 22:11:16 +0200289Letzte Aenderung: 22.01.2022