
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
