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
