PreventMove()
*************


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


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()

Last modified: 09.01.2020, Zesstra
