ReceiveMsg() ============ public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action, string msg_prefix, mixed origin) DEFINIERT IN ------------ :: /std/npc/comm.c /std/player/comm.c /std/room/items.c /sys/living/comm.h ARGUMENTE --------- :: string msg String mit der uebermittelten Nachricht. Muss nicht umgebrochen sein, da ReceiveMsg() das ebenfalls erledigt. int msg_typ Nachrichtentyp(en) fuer Filterung und Flags fuer Behandlung/Umbruch. Siehe unten fuer mit | kombinierbare Konstanten. string msg_action (optional) Ausloesende Aktion, wird auch fuer Ignorieren verwendet. Default ist query_verb(). Siehe unten fuer alternative Konstanten. string msg_prefix (optional) String, welcher ggf. im break_string() als indent verwendet wird. Default ist 0 (kein Indent) mixed origin () (optional) Das die Meldung ausloesende Objekt, wird fuer Ignorieren verwendet. Default: previous_object() BESCHREIBUNG ------------ :: ReceiveMsg() wird benutzt, um einem Lebewesen eine Nachricht zu senden. Dabei ruft es das sonst uebliche tell_object() fuer Spieler bzw. catch_tell() im NPC auf. Gerade fuer Nachrichten an Spieler bietet die Methode weitere Features, die bisher sonst haendisch zu implementieren waren: 1) Pruefung auf Empfangbarkeit, je nach 'msg_typ', zB MT_LOOK nur an Nichtblinde MT_LISTEN nur an Nichttaube MT_DEBUG nur an Magier/Testspieler 2) Pruefen auf Ignorieren von - Aktion ('msg_action') - mit 'msg_action' || query_verb() - Urheber ('origin') - fuer sendende Spieler mit origin->query_realname() - fuer sendende NPCs mit origin->Name(RAW)) 3) Speicherung in der tmhist (Typ MT_COMM) 4) Speicherung im Kobold (Typ MT_COMM + aktiver Kobold) 5) Umbrechen unter Beruecksichtigung von indent, 'msg_typ'-Flags fuer Umbruch und P_PREPEND_BS Raeume definieren standardmaessig ebenfalls ein ReceiveMsg(), welches in jedem Objekt im Raum ReceiveMsg() mit den uebergebenen Argumenten aufruft. In diesem Fall ist der Rueckgabe der kleinste von allen gerufenen ReceiveMsg() zurueckgelieferte Wert. RUeCKGABEWERT ------------- :: > 0 fuer Erfolg, < 0 fuer Misserfolg, s.u. MSG_DELIVERED bei erfolgreicher Zustellung MSG_BUFFERED bei Zwischenspeicherung durch den Kobold MSG_FAILED nicht naeher spezifizierter Fehler bei Zustellung MSG_IGNORED Nachricht wurde ignoriert (Absender, origin) MSG_VERB_IGN Nachricht wurde ignoriert (Kommandoverb, msg_action) MSG_MUD_IGN Absendendes Mud wurde ignoriert. MSG_SENSE_BLOCK Passende Sinne des Empfaenger sind blockiert (z.B. blind, taub) MSG_BUFFER_FULL Kobold kann sich nichts mehr merken BEMERKUNGEN ----------- :: Fuer saemtliche Alternativmeldungen im Falle einer nicht erfolgreich zugestellten Nachricht ist der Aufrufer von ReceiveMsg() verantwortlich. NPCs: * ReceiveMsg() ruft zwecks Abwaertskompatibilitaet catch_tell() auf * empfohlen ist, in NPCs nun ReceiveMsg() zu ueberschreiben. * catch_tell() muss weiterhin fuer andere tell_object() ueberschrieben werden BEISPIELE --------- :: #1.1 Nachricht an einen Spieler, zB in der Wueste this_player()->ReceiveMsg("Die Sonne brennt dir auf den Kopf.", MT_FEEL|MT_LOOK); #1.2 Nachricht an einen Spieler von einem NPC mit Indent // bei aktivem Editor+Kobold landet dieser Text auch im Kobold this_player()->ReceiveMsg("Du haust ja ganz schoen rein!", MT_COMM|MT_FAR|MSG_DONT_STORE, MA_TELL, "Arkshat teilt dir mit: "); #1.3 Nachricht an einen Spieler mit Fallback-Kaskade // Achtung, bei MT_COMM oder Ignorieren gibt es natuerlich auch // Misserfolgs-Rueckgaben. Bei einem normalen Kommando wie diesem // hier ist das unproblematisch und daher sinnvoll: if(this_player()->ReceiveMsg( "Du drueckst den Knopf und es oeffnet sich knirschend " "ein kleines Fach in der Wand.", MT_LOOK) < MSG_DELIVERED && this_player()->ReceiveMsg( "Du drueckst den Knopf und irgend etwas scheint sich " "knirschend zu oeffnen. Das Geraeusch kam von der Wand.", MT_LISTEN) < MSG_DELIVERED) // leider blind UND taub ... also: this_player()->ReceiveMsg( "Du drueckst den Knopf und irgend etwas scheint zu passieren, " "aber leider siehst und hoerst du nichts.", MT_FEEL); #2.1 Im NPC als Empfaenger auf ein TM reagieren public varargs int ReceiveMsg(string msg, int msg_typ, string msg_action, string msg_prefix, mixed origin) { int ret = MSG_DELIVERED; // Default // eine OOC-Kommunikation? if(msg_typ&MT_COMM) { if(strstr(msg, "hilfe")>=0) if(environment(origin)==environment()) { origin->ReceiveMsg("Ich werd dir gleich helfen!", MT_COMM|MSG_DONT_STORE, MA_TELL, "Arkshat teilt dir mit: "); } else { origin->ReceiveMsg("Hilf dir selbst, dann hilft dir Gott!", MT_COMM|MT_FAR|MSG_DONT_STORE, MA_TELL, "Arkshat teilt dir mit: "); } else if(...) [...] } else if(msg_typ&MT_LISTEN && msg_action==MA_SAY) { [...] } return ret; } #3.1 als Sender an viele, Variante mit eigenem filter // Achtung: siehe 3.3. send_room() loest vieles. // Living nickt nur seinen Nichtgegnern zu object *all = filter(all_inventory(environment(this_player())), #'living) - ({this_player()}); all -= this_player()->PresentEnemies(); all->ReceiveMsg(this_player()->Name()+ " nickt dir verstohlen zu und scheint bereit.", MT_LOOK, MA_EMOTE); #3.2 als Sender an viele, Variante mit einzelnem Iterieren // Achtung: siehe 3.3. send_room() loest vieles. // Living trinkt etwas, jeder im Raum soll es sehen oder hoeren object ob = first_inventory(environment(this_player())); do { if(living(ob) && ob!=this_player()) ob->ReceiveMsg(this_player()->Name()+" trinkt einen Schnaps aus.", MT_LOOK|MT_LISTEN, MA_DRINK); ob = next_inventory(ob); } while(ob); #3.3 als Sender an viele, Variante mit send_room // Living gruesst seine Freunde // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern object *exclude = this_player()->PresentEnemies(); send_room(this_object(), this_player()->Name()+" gruesst dich.", MT_LOOK|MT_LISTEN, MA_EMOTE, 0, exclude); #3.4 als Sender an viele mit send_room und ReceiveMsg() // Living gruesst seine Freunde, seine Feinde sehen das // send_room() ruft ReceiveMsg mit allen entsprechenden Parametern object *exclude = this_player()->PresentEnemies(); send_room(this_object(), this_player()->Name()+" gruesst dich.", MT_LOOK|MT_LISTEN, MA_EMOTE, 0, exclude); exclude->ReceiveMessage( this_player()->Name()+" gruesst, aber nicht dich.", MT_LOOK|MT_LISTEN, MA_EMOTE); KONSTANTEN FUER PARAMETER ------------------------- :: Saemtlich in "/sys/living/comm.h". Hier nicht notwendigerweise immer aktuell oder vollstaendig. MT_UNKNOWN unspez. Nachrichtentyp (nicht verwenden). Es wird versucht, aufgrund den Typ zu erraten. MT_LOOK alles, was man sieht MT_LISTEN alles, was man hoert MT_FEEL alles, was man fuehlt MT_TASTE alles, was man schmeckt MT_SMELL alles, was man riecht MT_MAGIC alle sonstigen (uebersinnlichen) Wahrnehmungen MT_NOTIFICATION Statusmeldungen, Kommandobestaetigungen MT_COMM alle OOC-Kommunikation, d.h. nicht durch o.g. Sinne abgedeckt. MT_FAR alles, was aus der Ferne / einem anderen Raum kommt. muss mit min. einem anderen Typ kombiniert werden MT_DEBUG Debugmeldungen, sehen nur Magier im Magiermodus MT_NEWS Mails & MPA MSG_DONT_BUFFER Nachricht darf nicht im Kobold gespeichert werden MSG_DONT_STORE Nachricht darf nicht in die Comm-History MSG_DONT_WRAP Nachricht nicht per break_string umbrechen MSG_DONT_IGNORE Nachricht kann nicht ignoriert werden MSG_BS_LEAVE_LFS wie BS_LEAVE_MY_LFS fuer break_string() MSG_BS_SINGLE_SPACE wie BS_SINGLE_SPACE fuer break_string() MSG_BS_BLOCK wie BS_BLOCK fuer break_string() MSG_BS_NO_PARINDENT wie BS_NO_PARINDENT fuer break_string() MSG_BS_INDENT_ONCE wie BS_INDENT_ONCE fuer break_string() MSG_BS_PREP_INDENT wie BS_PREPEND_INDENT fuer break_string() (optional) MA_UNKNOWN Unspez. Aktion. Es wird der Default query_verb() benutzt bzw. versucht, die Aktion zu erraten. MA_PUT Jemand legt etwas hin und gibt jemanden etwas MA_TAKE Jemand nimmt etwas MA_GIVE Jemand gibt jemandem etwas MA_MOVE_IN Jemand betritt den Raum MA_MOVE_OUT Jemand verlaesst den Raum MA_MOVE Jemand bewegt sich MA_FIGHT Jemand kaempft MA_WIELD Jemand zueckt eine Waffe MA_UNWIELD Jemand steckt eine Waffe weg MA_WEAR Jemand zieht etwas an MA_UNWEAR Jemand zieht etwas aus MA_EAT Jemand isst etwas MA_DRINK Jemand trinkt etwas MA_SPELL Jemand wirkt einen Spell MA_LOOK Jemand sieht etwas an, untersucht etwas MA_LISTEN Jemand horcht oder lauscht an etwas MA_FEEL Jemand betastet etwas MA_SMELL Jemand schnueffelt herum MA_SENSE Jemand macht eine uebersinnliche Wahrnehmung MA_READ Jemand liest etwas MA_USE Jemand benutzt etwas MA_SAY Jemand sagt etwas MA_REMOVE Etwas verschwindet // MA_CHAT Chatkrams (z.B. teile-mit, Teamkampfchat) MA_CHANNEL Ebenen MA_EMOTE (r)Emotes, Soulverben (remotes mit Typ MT_COMM|MT_FAR) MA_SHOUT Rufen (nicht: shout()!) MA_SHOUT_SEFUN Rufen ueber shout(SE) SIEHE AUCH ---------- :: Verwandt: send_room(SE) Lfuns: TestIgnore(L) Efuns: tell_object(E), catch_tell(L), catch_msg(L) query_verb(E), query_once_interactive(E), break_string(SE) 13.03.2016, Zesstra