Morgengrauner Dokumentation
Dateipfad: /home/mud/mudlib/doc/lfun/PreventMovePreventMove()
*************
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
zurück zur Übersicht