pick()
******


FUNKTION
========

   public varargs int pick(object o, mixed msg);


DEFINIERT IN
============

   /std/living/put_and_get.c


ARGUMENTE
=========

   object o
       Das Objekt, das aufgehoben werden soll.
   mixed msg
       Eine optionale Meldung, die anstelle von P_PICK_MSG oder der
       Standardmeldung verwendet wird, oder -1, um die Meldung zu
       unterdruecken.


BESCHREIBUNG
============

   Der Spieler oder NPC nimmt das Objekt auf. Gibt o->move() keinen positiven
   Wert zurueck, beispielsweise weil das Objekt zu schwer ist oder nicht
   genommen werden darf, bekommt er eine entsprechende Fehlermeldung.


RUECKGABEWERT
=============

   Wenn das Aufnehmen geklappt hat, 1, ansonsten 0.


BEMERKUNG
=========

   Diese Funktion ist dann sinnvoll, wenn man den Spieler ein Objekt
   aufnehmen lassen und sich nicht selbst um die Fehlerbehandlung kuemmern
   moechte - und da unzaehlige verschiedene Dinge schiefgehen koennen und
   manche Objekte eigene Fehlermeldungen definieren, eigentlich immer.

   Die Funktion prueft nicht, ob sich das Objekt ueberhaupt in der Reichweite
   des Spielers/NPC befindet, das muss man ggf. selbst ermitteln.


BEISPIEL
========

   ob = clone_object(WEINGUMMI);

   if (this_player()->pick(ob, ({ "Du nimmst @WENU2 aus dem Regal.",
                                  "@WER1 nimmt @WENU2 aus dem Regal." })))
       weingummi--;
   else
       ob->remove();


SIEHE AUCH
==========

   move(L), P_PICK_MSG, pick_objects(L), P_NOINSERT_MSG, P_NOLEAVE_MSG,
   P_TOO_MANY_MSG, P_TOO_HEAVY_MSG, P_ENV_TOO_HEAVY_MSG, P_NOGET

Last modified: Thu Aug 28 22:21:41 2008 by Amynthor
