
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
