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

