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 (<object>) (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
      Bei gesetztem MSG_ALL_SENSES muessen alle fuer die angegebenen Typen
      relevanten Sinne des Empfaengers benutzbar sein, nicht nur einer.
   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
   6) Ersetzen von Farbtags entsprechendes Terminaltyps des Clients.

   Raeume definieren standardmaessig ebenfalls ein ReceiveMsg(), welches in
   jedem Objekt im Raum ReceiveMsg() mit den uebergebenen Argumenten aufruft.
   In diesem Fall ist der Rueckgabe 'void'. Ein einfacher 'int' waere hier
   nicht hilfreich und einen komplexer Rueckgabewert wuerde niemand auswerten
   wollen.

   Zur einfacheren Verwendung gibt es einige Wrapper-Funktionen, siehe
   :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay` und
   :doc:`ReceiveTeilemit`, :doc:`ReceiveWave`.


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.

   <msg_typ>
     MT_UNKNOWN      unspez. Nachrichtentyp (nicht verwenden). Es wird
                     versucht, aufgrund <msg_action> 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_ALL_TYPES   alle relevanten Sinne fuer die angegebenen Nachrichten-
                     typen muessen benutzbar sein (UND statt ODER).
     MSG_ALERT       Nachricht loest eine vom Spieler konfigurierte
                     Benachrichtigung aus (z.B. Piepston)

     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()

   <msg_action> (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
==========

   Wrapper-Funktionen: :doc:`ReceiveMultisense`, :doc:`ReceiveNotify`, :doc:`ReceiveSay`, :doc:`ReceiveTeilemit`
   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)

Letzte Aenderung: 22.01.2022
