WieldFunc()

FUNKTION:
     int WieldFunc(object weapon, int silent, object user);

DEFINIERT IN:
     eigenen Objekten (fuer /std/weapon/combat)

ARGUMENTE:
     weapon (object)
          Die Waffe, die gezueckt werden soll.
     silent (int)
          Ob dabei eine Meldung ausgegeben werden soll.
     user (object)
          Das Lebewesen, welches die Waffe zuecken will.

BESCHREIBUNG:
     In dieser Funktion kann man zusaetzliche Abfragen vornehmen, ob sich
     die Waffe <weapon> von <user> zuecken laesst oder nicht.

RUeCKGABEWERT:
     0, wenn die Waffe nicht gezueckt werden kann, sonst ungleich 0.

BEMERKUNGEN:
     Selbst wenn man einen Wert ungleich Null zurueckgibt, ist das noch
     keine Garantie, dass sich die Waffe auch wirklich zuecken laesst! Der
     Spieler koennte zum Beispiel noch eine Waffe gezueckt haben, die sich
     nicht wegstecken laesst, etc.
     Wenn ihr sicher sein wollt, dass der Spieler ein Objekt gezueckt hat,
     benutzt bitte InformWield().
     Bitte nicht drauf verlassen, dass this_player() das Lebewesen ist,
     welches die Waffe zuecke will.
     Die Reihenfolge der Argumente ist etwas unschoen, aber leider wurde <user>
     erheblich spaeter hinzugefuegt und es war unmoeglich, einige hundert
     Objekte zu aendern.

BEISPIELE:
     Eine Waffe, die sich nicht von Zwergen zuecken laesst:

     inherit "std/weapon";

     #include <properties.h>
     #include <combat.h>

     create()
     {
       ::create();

       ... /* zig SetProp's, um die Waffe zu konfigurieren */

       /* WieldFunc() ist in der Waffe selbst zu finden */
       SetProp(P_WIELD_FUNC, this_object());
     }

     int WieldFunc(object weapon, int silent, object user)
     {
       /* Nicht-Zwerge duerfen die Waffe zuecken */
       if (user->QueryProp(P_RACE) != "Zwerg")
         return 1;

       /* Ansonsten sagen wir evtl., warum das Zuecken nicht klappt... */
       if (!silent)
         write( "Deine kleinen Haendchen koennen den Griff nicht "+
                "umklammern.\n");

       /* ...und brechen das Zuecken ab. */
       return 0;
     }

SIEHE AUCH:
     P_WIELD_MSG, P_UNWIELD_MSG, P_WEAR_MSG, P_UNWEAR_MSG
     DoWield(), DoUnwield(), InformUnwield(), InformWield() 
     UnwieldFunc, WieldFunc 
     /std/weapon/combat.c

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