TestIgnore()

FUNKTION:
     public int TestIgnore(string|string* arg)

DEFINIERT IN:
     /std/player/comm.c

ARGUMENTE:
     arg
         String oder Array von Strings, die getestet werden sollen,
         Format jeweils: [spieler].aktion[.qualifizierer]

RUeCKGABEWERT:
     0, wenn arg nicht ignoriert wird
     MSG_IGNORED, wenn (min. ein Element von) arg ignoriert wird

BESCHREIBUNG:
     Es wird geprueft, ob der Spieler irgendeinen Eintrag auf seiner Liste
     hat, der dazu fuehrt, dass <arg> ignoriert wird. Hierbei kommen je nach
     den Angaben in <arg> folgende Regeln zum Tragen:
     1) spieler
        Wird der Spieler ignoriert?
     2) .aktion
        Ignoriert der Spieler .aktion, d.h. die Aktion komplett (OHNE
        Qualifizierer)?
     3) spieler.aktion
        Ignoriert der Spieler spieler, .aktion oder spieler.aktion?
     4) spieler.aktion.qualifizierer
        Ignoriert der Spieler spieler, .aktion, spieler.aktion oder
        spieler.aktion.qualifizierer?
     5) .aktion.qualifizierer
        Ignoriert der Spieler .aktion oder .aktion.qualifizierer?

     Da TestIgnore() damit durchaus etwas aufwendiger sein kann, sollte
     man dies nicht unnoetig oft aufrufen. (Braucht man das Ergebnis z.B.
     kurz spaeter nochmal, koennte man das Ergebnis speichern.) Wird der
     Qualifizierer nicht gebraucht, sollte man ihn weglassen.

BEISPIEL:
     if (!this_player()->TestIgnore("andy"))
       tell_object(this_player(), "Andy teilt Dir mit: Hallo!\n");

     // Beispiel fuer eine Ignore-Check fuer Aktion (kratzen) fuer einen
     // Spieler (this_player()) an einem anderen Spieler (target)
     if (!target->TestIgnore( ({getuid(this_player()) + ".kratze",
                                   getuid(this_player()) + ".kratz"}) ))
     {
       tell_object(target, this_player()->Name()+" kratzt dich.\n");
       tell_object(this_player(), "Du kratzt "+target->Name()+".\n");
     }
     else
       tell_object(this_player(), target->Name()+" ignoriert dich.\n");

     // allumfassender Ignorier-Check in einer Gilde (Klerus) auf
     // eine Aktion (kurieren) fuer einen bestimmten Spieler (den caster)
     // an einem zu kurierenden Spieler (target)
     if (target->TestIgnore(getuid(caster)+".kuriere.klerus"))
       tell_object(caster, break_string(
         target->Name()+" ignoriert deinen Versuch.", 78));

SIEHE AUCH:
     P_IGNORE, AddIgnore, RemoveIgnore, TestIgnoreSimple, /std/player/comm.c

26.04.2014 Zesstra

