WearFunc()

FUNKTION:
     int WearFunc(object ruest, int silent, object user);

DEFINIERT IN:
     eigenen Objekten (fuer /std/clothing/wear)

ARGUMENTE:
     ruest (object)
          Die Ruestung/Kleidung, die angezogen werden soll.
     silent (int)
          Ob dabei eine Meldung ausgegeben wird.
     user (object)
          Das Lebewesen, welches die Ruestung/Kleidung anziehen will.

BESCHREIBUNG:
     Mit dieser Funktion kann man pruefen, ob sich das Kleidungsstueck bzw.
     Ruestung <ruest> von this_player() anziehen laesst oder nicht.
     Kann die Ruestung angezogen werden, so muss ein Wert ungleich 0
     zurueckgegeben werden.

RUeCKGABEWERT:
     0, wenn sich die Ruestung nicht anziehen laesst, ansonsten ungleich 0.

BEMERKUNGEN:
     Bitte nicht darauf verlassen, dass der Spieler das Objekt auch wirklich
     anzieht, wenn man hier 1 zurueckgibt.
     Speziell bei Schilden kann das Anziehen trotz eines Rueckgabewertes 
     != 0 immer noch schief gehen, wenn der Spieler keine Hand mehr frei hat.
     Wenn ihr sicher sein wollt, dass der Spieler ein Objekt angezogen hat,
     benutzt bitte InformWear().
     Bitte nicht drauf verlassen, dass this_player() das ausziehende Lebewesen
     ist.
     Die Reihenfolge der Argumente ist etwas unschoen, aber leider wurde <user>
     erheblich spaeter hinzugefuegt und es war unmoeglich, einige hundert
     Objekte zu aendern.

BEISPIELE:
     Ein Helm, der nur von Elfen getragen werden kann:

     inherit "std/armour.c";

     #include <properties.h>

     create()
     {
       ::create();

       SetProp(P_ARMOUR_TYPE, AT_HELMET);
       /* zig weitere SetProp's, um den Helm zu konfigurieren */

       /* WearFunc() ist im Helm selbst zu finden */
       SetProp(P_WEAR_FUNC, this_object());
     }

     int WearFunc(object me, int silent, object user)
     {
       if (user->QueryProp(P_RACE) == "Elf")
         return 1;   /* Elfen duerfen den Helm tragen */

       /* Die anderen Rassen sollten zumindest erfahren koennen, wieso
          sie den Helm nicht tragen koennen... */
       if (!silent)
           write( "Der Helm rutscht Dir immer ueber Deine runden "
                 +"Ohren.\n" );
       return 0;
     }

     Gibt jetzt ein Nicht-Elf "trage helm" ein, so bekommt er die Meldung
     "Der Helm rutscht Dir immer ueber Deine runden Ohren.", Elfen dagegen
     passt das Teil wie angegossen.

SIEHE AUCH:
     P_WEAR_MSG, P_UNWEAR_MSG, P_WIELD_MSG, P_UNWIELD_MSG
     DoWear(), DoUnwear(), InformUnwear(), InformWear()
     /std/clothing/wear.c

----------------------------------------------------------------------------
02.02.2009, Zesstra
