MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | ReceiveMsg() |
| 2 | |
| 3 | public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action, |
| 4 | string msg_prefix, mixed origin) |
| 5 | |
| 6 | DEFINIERT IN: |
| 7 | /std/living/comm.c |
| 8 | /std/npc/comm.c |
| 9 | /std/player/comm.c |
| 10 | /std/room/items.c |
| 11 | |
| 12 | ARGUMENTE: |
| 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 | |
| 29 | BESCHREIBUNG: |
| 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 | |
| 56 | RUeCKGABEWERT: |
| 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 | |
| 69 | BEMERKUNGEN: |
| 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 | |
| 79 | BEISPIELE: |
| 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 | |
| 179 | KONSTANTEN 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 | |
| 243 | SIEHE 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 | |
| 249 | 13.03.2016, Zesstra |
| 250 | |