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