blob: 976c8bd766906563bdc48e79282b07eb0b1b33ba [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
2ReceiveMsg()
3************
4
MG Mud User88f12472016-06-24 23:31:02 +02005ReceiveMsg()
6
Zesstra953f9972017-02-18 15:37:36 +01007public varargs int ReceiveMsg(string msg, int msg_typ, string
8msg_action,
9 string msg_prefix, mixed origin)
MG Mud User88f12472016-06-24 23:31:02 +020010
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012DEFINIERT IN
13============
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015 /std/npc/comm.c
16 /std/player/comm.c
17 /std/room/items.c
Arathornf76eb122022-01-09 13:19:39 +010018 /sys/living/comm.h
MG Mud User88f12472016-06-24 23:31:02 +020019
MG Mud User88f12472016-06-24 23:31:02 +020020
Zesstra953f9972017-02-18 15:37:36 +010021ARGUMENTE
22=========
MG Mud User88f12472016-06-24 23:31:02 +020023
Zesstra953f9972017-02-18 15:37:36 +010024 string msg
25 String mit der uebermittelten Nachricht. Muss nicht umgebrochen sein,
26 da ReceiveMsg() das ebenfalls erledigt.
27 int msg_typ
28 Nachrichtentyp(en) fuer Filterung und Flags fuer Behandlung/Umbruch.
29 Siehe unten fuer mit | kombinierbare Konstanten.
30 string msg_action (optional)
31 Ausloesende Aktion, wird auch fuer Ignorieren verwendet.
32 Default ist query_verb(). Siehe unten fuer alternative Konstanten.
33 string msg_prefix (optional)
34 String, welcher ggf. im break_string() als indent verwendet wird.
35 Default ist 0 (kein Indent)
36 mixed origin (<object>) (optional)
37 Das die Meldung ausloesende Objekt, wird fuer Ignorieren verwendet.
38 Default: previous_object()
MG Mud User88f12472016-06-24 23:31:02 +020039
MG Mud User88f12472016-06-24 23:31:02 +020040
Zesstra953f9972017-02-18 15:37:36 +010041BESCHREIBUNG
42============
MG Mud User88f12472016-06-24 23:31:02 +020043
Zesstra953f9972017-02-18 15:37:36 +010044 ReceiveMsg() wird benutzt, um einem Lebewesen eine Nachricht zu senden.
45 Dabei ruft es das sonst uebliche tell_object() fuer Spieler bzw.
46 catch_tell() im NPC auf.
MG Mud User88f12472016-06-24 23:31:02 +020047
Zesstra953f9972017-02-18 15:37:36 +010048 Gerade fuer Nachrichten an Spieler bietet die Methode weitere Features,
49 die bisher sonst haendisch zu implementieren waren:
50 1) Pruefung auf Empfangbarkeit, je nach 'msg_typ', zB
51 MT_LOOK nur an Nichtblinde
52 MT_LISTEN nur an Nichttaube
53 MT_DEBUG nur an Magier/Testspieler
54 2) Pruefen auf Ignorieren von
55 - Aktion ('msg_action')
56 - mit 'msg_action' || query_verb()
57 - Urheber ('origin')
58 - fuer sendende Spieler mit origin->query_realname()
59 - fuer sendende NPCs mit origin->Name(RAW))
60 3) Speicherung in der tmhist (Typ MT_COMM)
61 4) Speicherung im Kobold (Typ MT_COMM + aktiver Kobold)
62 5) Umbrechen unter Beruecksichtigung von indent, 'msg_typ'-Flags
63 fuer Umbruch und P_PREPEND_BS
64
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
70
71RUeCKGABEWERT
72=============
73
74 > 0 fuer Erfolg, < 0 fuer Misserfolg, s.u.
75 MSG_DELIVERED bei erfolgreicher Zustellung
76 MSG_BUFFERED bei Zwischenspeicherung durch den Kobold
77
78 MSG_FAILED nicht naeher spezifizierter Fehler bei Zustellung
79 MSG_IGNORED Nachricht wurde ignoriert (Absender, origin)
80 MSG_VERB_IGN Nachricht wurde ignoriert (Kommandoverb, msg_action)
81 MSG_MUD_IGN Absendendes Mud wurde ignoriert.
82 MSG_SENSE_BLOCK Passende Sinne des Empfaenger sind blockiert (z.B.
83 blind, taub)
84 MSG_BUFFER_FULL Kobold kann sich nichts mehr merken
85
86
87BEMERKUNGEN
88===========
89
90 Fuer saemtliche Alternativmeldungen im Falle einer nicht erfolgreich
91 zugestellten Nachricht ist der Aufrufer von ReceiveMsg() verantwortlich.
92
93 NPCs:
94 * ReceiveMsg() ruft zwecks Abwaertskompatibilitaet catch_tell() auf
95 * empfohlen ist, in NPCs nun ReceiveMsg() zu ueberschreiben.
96 * catch_tell() muss weiterhin fuer andere tell_object()
97 ueberschrieben werden
98
99
100BEISPIELE
101=========
102
103 #1.1 Nachricht an einen Spieler, zB in der Wueste
104 this_player()->ReceiveMsg("Die Sonne brennt dir auf den Kopf.",
105 MT_FEEL|MT_LOOK);
106
107 #1.2 Nachricht an einen Spieler von einem NPC mit Indent
108 // bei aktivem Editor+Kobold landet dieser Text auch im Kobold
109 this_player()->ReceiveMsg("Du haust ja ganz schoen rein!",
110 MT_COMM|MT_FAR|MSG_DONT_STORE,
111 MA_TELL,
112 "Arkshat teilt dir mit: ");
113
114 #1.3 Nachricht an einen Spieler mit Fallback-Kaskade
115 // Achtung, bei MT_COMM oder Ignorieren gibt es natuerlich auch
116 // Misserfolgs-Rueckgaben. Bei einem normalen Kommando wie diesem
117 // hier ist das unproblematisch und daher sinnvoll:
118 if(this_player()->ReceiveMsg(
119 "Du drueckst den Knopf und es oeffnet sich knirschend "
120 "ein kleines Fach in der Wand.", MT_LOOK) < MSG_DELIVERED &&
121 this_player()->ReceiveMsg(
122 "Du drueckst den Knopf und irgend etwas scheint sich "
123 "knirschend zu oeffnen. Das Geraeusch kam von der Wand.",
124 MT_LISTEN) < MSG_DELIVERED) // leider blind UND taub ... also:
125 this_player()->ReceiveMsg(
126 "Du drueckst den Knopf und irgend etwas scheint zu passieren, "
127 "aber leider siehst und hoerst du nichts.", MT_FEEL);
128
129
130 #2.1 Im NPC als Empfaenger auf ein TM reagieren
131 public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action,
132 string msg_prefix, mixed origin) {
133 int ret = MSG_DELIVERED; // Default
134
135 // eine OOC-Kommunikation?
136 if(msg_typ&MT_COMM) {
137 if(strstr(msg, "hilfe")>=0)
138 if(environment(origin)==environment()) {
139 origin->ReceiveMsg("Ich werd dir gleich helfen!",
140 MT_COMM|MSG_DONT_STORE, MA_TELL,
141 "Arkshat teilt dir mit: ");
142 } else {
143 origin->ReceiveMsg("Hilf dir selbst, dann hilft dir Gott!",
MG Mud User88f12472016-06-24 23:31:02 +0200144 MT_COMM|MT_FAR|MSG_DONT_STORE,
145 MA_TELL,
146 "Arkshat teilt dir mit: ");
Zesstra953f9972017-02-18 15:37:36 +0100147 }
148 else if(...)
149 [...]
150 } else if(msg_typ&MT_LISTEN && msg_action==MA_SAY) {
151 [...]
152 }
MG Mud User88f12472016-06-24 23:31:02 +0200153
Zesstra953f9972017-02-18 15:37:36 +0100154 return ret;
155 }
MG Mud User88f12472016-06-24 23:31:02 +0200156
157
Zesstra953f9972017-02-18 15:37:36 +0100158 #3.1 als Sender an viele, Variante mit eigenem filter
159 // Achtung: siehe 3.3. send_room() loest vieles.
160 // Living nickt nur seinen Nichtgegnern zu
161 object *all = filter(all_inventory(environment(this_player())),
162 #'living) - ({this_player()});
163 all -= this_player()->PresentEnemies();
164 all->ReceiveMsg(this_player()->Name()+
165 " nickt dir verstohlen zu und scheint bereit.",
166 MT_LOOK, MA_EMOTE);
MG Mud User88f12472016-06-24 23:31:02 +0200167
Zesstra953f9972017-02-18 15:37:36 +0100168 #3.2 als Sender an viele, Variante mit einzelnem Iterieren
169 // Achtung: siehe 3.3. send_room() loest vieles.
170 // Living trinkt etwas, jeder im Raum soll es sehen oder hoeren
171 object ob = first_inventory(environment(this_player()));
172 do {
173 if(living(ob) && ob!=this_player())
174 ob->ReceiveMsg(this_player()->Name()+" trinkt einen Schnaps aus.",
175 MT_LOOK|MT_LISTEN,
176 MA_DRINK);
177 ob = next_inventory(ob);
178 } while(ob);
MG Mud User88f12472016-06-24 23:31:02 +0200179
Zesstra953f9972017-02-18 15:37:36 +0100180 #3.3 als Sender an viele, Variante mit send_room
181 // Living gruesst seine Freunde
182 // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern
183 object *exclude = this_player()->PresentEnemies();
184 send_room(this_object(),
185 this_player()->Name()+" gruesst dich.",
186 MT_LOOK|MT_LISTEN,
187 MA_EMOTE,
188 0,
189 exclude);
190
191 #3.4 als Sender an viele mit send_room und ReceiveMsg()
192 // Living gruesst seine Freunde, seine Feinde sehen das
193 // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern
194 object *exclude = this_player()->PresentEnemies();
195 send_room(this_object(),
196 this_player()->Name()+" gruesst dich.",
197 MT_LOOK|MT_LISTEN, MA_EMOTE, 0, exclude);
198 exclude->ReceiveMessage(
199 this_player()->Name()+" gruesst, aber nicht dich.",
200 MT_LOOK|MT_LISTEN, MA_EMOTE);
MG Mud User88f12472016-06-24 23:31:02 +0200201
202
Zesstra953f9972017-02-18 15:37:36 +0100203KONSTANTEN FUER PARAMETER
204=========================
MG Mud User88f12472016-06-24 23:31:02 +0200205
Zesstra953f9972017-02-18 15:37:36 +0100206 Saemtlich in "/sys/living/comm.h". Hier nicht notwendigerweise
207 immer aktuell oder vollstaendig.
MG Mud User88f12472016-06-24 23:31:02 +0200208
Zesstra953f9972017-02-18 15:37:36 +0100209 <msg_typ>
210 MT_UNKNOWN unspez. Nachrichtentyp (nicht verwenden). Es wird
211 versucht, aufgrund <msg_action> den Typ zu erraten.
212 MT_LOOK alles, was man sieht
213 MT_LISTEN alles, was man hoert
214 MT_FEEL alles, was man fuehlt
215 MT_TASTE alles, was man schmeckt
216 MT_SMELL alles, was man riecht
217 MT_MAGIC alle sonstigen (uebersinnlichen) Wahrnehmungen
218 MT_NOTIFICATION Statusmeldungen, Kommandobestaetigungen
219 MT_COMM alle OOC-Kommunikation, d.h. nicht durch o.g. Sinne
220 abgedeckt.
221 MT_FAR alles, was aus der Ferne / einem anderen Raum kommt.
222 muss mit min. einem anderen Typ kombiniert werden
223 MT_DEBUG Debugmeldungen, sehen nur Magier im Magiermodus
224 MT_NEWS Mails & MPA
MG Mud User88f12472016-06-24 23:31:02 +0200225
Zesstra953f9972017-02-18 15:37:36 +0100226 MSG_DONT_BUFFER Nachricht darf nicht im Kobold gespeichert werden
227 MSG_DONT_STORE Nachricht darf nicht in die Comm-History
228 MSG_DONT_WRAP Nachricht nicht per break_string umbrechen
229 MSG_DONT_IGNORE Nachricht kann nicht ignoriert werden
MG Mud User88f12472016-06-24 23:31:02 +0200230
Zesstra953f9972017-02-18 15:37:36 +0100231 MSG_BS_LEAVE_LFS wie BS_LEAVE_MY_LFS fuer break_string()
232 MSG_BS_SINGLE_SPACE wie BS_SINGLE_SPACE fuer break_string()
233 MSG_BS_BLOCK wie BS_BLOCK fuer break_string()
234 MSG_BS_NO_PARINDENT wie BS_NO_PARINDENT fuer break_string()
235 MSG_BS_INDENT_ONCE wie BS_INDENT_ONCE fuer break_string()
236 MSG_BS_PREP_INDENT wie BS_PREPEND_INDENT fuer break_string()
MG Mud User88f12472016-06-24 23:31:02 +0200237
Zesstra953f9972017-02-18 15:37:36 +0100238 <msg_action> (optional)
239 MA_UNKNOWN Unspez. Aktion. Es wird der Default query_verb()
240 benutzt bzw. versucht, die Aktion zu erraten.
241 MA_PUT Jemand legt etwas hin und gibt jemanden etwas
242 MA_TAKE Jemand nimmt etwas
243 MA_MOVE_IN Jemand betritt den Raum
244 MA_MOVE_OUT Jemand verlaesst den Raum
245 MA_MOVE Jemand bewegt sich
246 MA_FIGHT Jemand kaempft
247 MA_WIELD Jemand zueckt eine Waffe
248 MA_UNWIELD Jemand steckt eine Waffe weg
249 MA_WEAR Jemand zieht etwas an
250 MA_UNWEAR Jemand zieht etwas aus
251 MA_EAT Jemand isst etwas
252 MA_DRINK Jemand trinkt etwas
253 MA_SPELL Jemand wirkt einen Spell
254 MA_LOOK Jemand sieht etwas an, untersucht etwas
255 MA_LISTEN Jemand horcht oder lauscht an etwas
256 MA_FEEL Jemand betastet etwas
257 MA_SMELL Jemand schnueffelt herum
258 MA_SENSE Jemand macht eine uebersinnliche Wahrnehmung
259 MA_READ Jemand liest etwas
260 MA_USE Jemand benutzt etwas
261 MA_SAY Jemand sagt etwas
262 MA_REMOVE Etwas verschwindet
263 // MA_CHAT Chatkrams (z.B. teile-mit, Teamkampfchat)
264 MA_CHANNEL Ebenen
265 MA_EMOTE (r)Emotes, Soulverben (remotes mit Typ MT_COMM|MT_FAR)
266 MA_SHOUT Rufen (nicht: shout()!)
267 MA_SHOUT_SEFUN Rufen ueber shout(SE)
MG Mud User88f12472016-06-24 23:31:02 +0200268
MG Mud User88f12472016-06-24 23:31:02 +0200269
Zesstra953f9972017-02-18 15:37:36 +0100270SIEHE AUCH
271==========
MG Mud User88f12472016-06-24 23:31:02 +0200272
Zesstra953f9972017-02-18 15:37:36 +0100273 Verwandt: send_room(SE)
274 Lfuns: TestIgnore(L)
275 Efuns: tell_object(E), catch_tell(L), catch_msg(L)
276 query_verb(E), query_once_interactive(E), break_string(SE)
MG Mud User88f12472016-06-24 23:31:02 +0200277
27813.03.2016, Zesstra