PreventMove()
=============

PreventInsert()
---------------
::

FUNKTION
--------
::

     protected int PreventMove(object dest, object oldenv, int method);

DEFINIERT IN
------------
::

     /std/thing/moving.c
     /std/living/moving.c
     /std/player/moving.c

ARGUMENTE
---------
::

     dest
          Das Ziel des Moves
     oldenv
          Das (Noch-)Environment des Objekts
     method
          Die Move-Methode(n), mit der/denen bewegt werden soll

BESCHREIBUNG
------------
::

     Mit dieser Funktion prueft ein Objekt, ob es von 'oldenv' nach 'dest'
     bewegt werden mag. Dabei wird 'method' beruecksichtigt (z.B. schaltet
     M_NOCHECK die meisten Pruefungen ab).
     Bei Gegenstaenden wird z.B. P_NODROP, P_NOGET, das Gewicht, ob das Ziel
     das Objekt aufnehmen will (MayAddWeight(), PreventInsert) oder auch
     PreventLeave() geprueft.
     Bei Lebewesen wird z.B. P_NO_TPORT in 'dest' und 'oldenv' und
     PreventLeaveLiving/PreventInsertLiving() ausgewertet.
     Bei Spielern wird auch noch getestet, ob method M_GO oder M_TPORT
     enthaelt und ob das Ziel nur von Testspielern betreten werden kann.

RUeCKGABEWERT
-------------
::

     0, wenn das Objekt bewegt werden darf.
     Wenn es nicht bewegt werden darf, sind als Rueckgabewerte die in
     /sys/moving.h definierten Move-Fehlerwerte zulaessig (s. move()). Sollte
     hier ein ungueltiger Fehlerwert zurueckgegeben werden, wird das move()
     ebenfalls abgebrochen und ME_DONT_WANT_TO_BE_MOVED zurueckgeben.

BEMERKUNGEN
-----------
::

     Diese Funktion kann ueberschrieben, um feinere Kontrolle ueber die
     Bewegungen des Objekt zu haben. Dabei aber bitte einige Dinge beachten:
     1. Denkt daran, ggf. M_NOCHECK zu beruecksichtigen und und eure
     Pruefungen nur zu machen, wenn es nicht in method vorkommt.
     2. GANZ WICHTIG: Wenn ihr mit euren Pruefungen fertig sein und das Objekt
     bewegt werden duerfte, die geerbten Pruefungen noch testen, also _IMMER_
     das geerbte PreventMove() noch aufrufen und dessen Wert
     zurueckgeben/beruecksichtigen, da sonst Pruefungen des Gewichts etc. 
     nicht funktionieren oder bei Lebewesen die Prevent*() im Environment 
     nicht gerufen werden!
     3. Die Funktion ist nur objektintern zu verwenden, Call-Other von aussen
     sind nicht moeglich, beim Ueberschreiben 'protected' nicht vergessen.
     4. Nochmal: Geerbtes PreventMove() _NICHT VERGESSEN_!

BEISPIELE
---------
::

     Ein Objekt, was nur im Sternenlicht aufgenommen werden kann (warum
     auch immer):

     protected int PreventMove(object dest, object oldenv, int method) {
       if ( (method & M_NOCHECK) ) {
           // wenn mit M_NOCHECK bewegt, ist das Sternenlicht egal, nur
           // geerbtes PreventMove() beruecksichten:
           return ::PreventMove(dest, oldenv, method);
       }
       else if ( method & M_GET) {
           // wenn es aufgenommen werden soll: nach Sternenlicht im Raum
           // gucken:
           if (objectp(dest) && 
               (dest->QueryProp(P_LIGHT_TYPE) != LT_STARS))
               return ME_CANT_BE_TAKEN;
       }
       // Fall-through:
       return ::PreventMove(dest, oldenv, method);
     }

SIEHE AUCH
----------
::

     PreventLeave(), NotifyInsert(), NotifyLeave(), MayAddObject(),
     PreventInsertLiving(), PreventLeaveLiving(), NotifyMove(),
     PreventMove(), MayAddWeight(), move(), /std/container/restrictions.c


Last modified: 04.08.2007, Zesstra

