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