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