TestIgnoreSimple()

FUNKTION:
     public int TestIgnoreSimple(string *arg)

DEFINIERT IN:
     /std/player/comm.c

ARGUMENTE:
     arg
         Liste von Strings, die getestet werden sollen

BESCHREIBUNG:
     TestIgnoreSimple() prueft, ob der Spieler min. einen der uebergebenen
     Eintraege auf seiner Ignoriereliste hat.
     Falls man mehrere Eintraege pruefen muss/moechte, ist es schneller, alle
     Eintraege in einem zu uebergeben anstatt fuer jeden einzeln 
     TestIgnoreSimple() aufzurufen.

RUeCKGABEWERT:
     1, falls es mindestens eine Uebereinstimmungen von arg und der
     Ignoriere-Liste des Spielers gibt.
     0, sonst.

BEISPIEL:
     if (!this_player()->TestIgnoreSimple(({"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->TestIgnoreSimple(getuid(this_player()),
                             getuid(this_player())+".kratz",
                             getuid(this_player())+".kratze",
                             ".kratz", ".kratze"}))) {
       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->TestIgnoreSimple(({getuid(caster),
                              getuid(caster)+".kuriere",
                              getuid(caster)+".kuriere.klerus",
                              ".kuriere",
                              ".kuriere.klerus"})))
       tell_object(caster, break_string(
         target->Name()+" ignoriert deinen Versuch.", 78));

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

26.04.2014 Zesstra

