
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
