
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
