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