blob: 798ee0bc43cc2b2b4aea485591a9beb2d73b93c3 [file] [log] [blame]
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