Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 1 | ReceiveMsg() |
| 2 | ============ |
| 3 | |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 4 | public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action, |
| 5 | string msg_prefix, mixed origin) |
Zesstra | d57c06d | 2022-10-07 09:12:43 +0200 | [diff] [blame] | 6 | |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 7 | |
| 8 | DEFINIERT IN |
| 9 | ------------ |
| 10 | :: |
| 11 | |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 12 | /std/npc/comm.c |
| 13 | /std/player/comm.c |
| 14 | /std/room/items.c |
Bugfix | 2f292a3 | 2021-09-21 12:01:20 +0200 | [diff] [blame] | 15 | /sys/living/comm.h |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 16 | |
| 17 | ARGUMENTE |
| 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 | |
| 37 | BESCHREIBUNG |
| 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 |
Bugfix | 427a581 | 2022-01-07 15:41:24 +0100 | [diff] [blame^] | 51 | Bei gesetztem MSG_ALL_SENSES muessen alle fuer die angegebenen Typen |
| 52 | relevanten Sinne des Empfaengers benutzbar sein, nicht nur einer. |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 53 | 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 | |
| 71 | RUeCKGABEWERT |
| 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 | |
| 87 | BEMERKUNGEN |
| 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 | |
| 100 | BEISPIELE |
| 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 | |
| 203 | KONSTANTEN 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 |
Bugfix | 427a581 | 2022-01-07 15:41:24 +0100 | [diff] [blame^] | 231 | MSG_ALL_TYPES alle relevanten Sinne fuer die angegebenen Nachrichten- |
| 232 | typen muessen benutzbar sein (UND statt ODER). |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 233 | |
| 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 |
Bugfix | 1450fbd | 2022-10-05 23:03:44 +0200 | [diff] [blame] | 246 | MA_GIVE Jemand gibt jemandem etwas |
Zesstra | 1862697 | 2017-01-31 10:38:27 +0100 | [diff] [blame] | 247 | 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 | |
| 273 | SIEHE 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 | |
| 282 | 13.03.2016, Zesstra |
| 283 | |