blob: 798ee0bc43cc2b2b4aea485591a9beb2d73b93c3 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001PreventInsert()
2
3FUNKTION:
4 protected int PreventMove(object dest, object oldenv, int method);
5
6DEFINIERT IN:
7 /std/thing/moving.c
8 /std/living/moving.c
9 /std/player/moving.c
10
11ARGUMENTE:
12 dest
13 Das Ziel des Moves
14 oldenv
15 Das (Noch-)Environment des Objekts
16 method
17 Die Move-Methode(n), mit der/denen bewegt werden soll
18
19BESCHREIBUNG:
20 Mit dieser Funktion prueft ein Objekt, ob es von 'oldenv' nach 'dest'
21 bewegt werden mag. Dabei wird 'method' beruecksichtigt (z.B. schaltet
22 M_NOCHECK die meisten Pruefungen ab).
23 Bei Gegenstaenden wird z.B. P_NODROP, P_NOGET, das Gewicht, ob das Ziel
24 das Objekt aufnehmen will (MayAddWeight(), PreventInsert) oder auch
25 PreventLeave() geprueft.
26 Bei Lebewesen wird z.B. P_NO_TPORT in 'dest' und 'oldenv' und
27 PreventLeaveLiving/PreventInsertLiving() ausgewertet.
28 Bei Spielern wird auch noch getestet, ob method M_GO oder M_TPORT
29 enthaelt und ob das Ziel nur von Testspielern betreten werden kann.
30
31RUeCKGABEWERT:
32 0, wenn das Objekt bewegt werden darf.
33 Wenn es nicht bewegt werden darf, sind als Rueckgabewerte die in
34 /sys/moving.h definierten Move-Fehlerwerte zulaessig (s. move()). Sollte
35 hier ein ungueltiger Fehlerwert zurueckgegeben werden, wird das move()
36 ebenfalls abgebrochen und ME_DONT_WANT_TO_BE_MOVED zurueckgeben.
37
38BEMERKUNGEN:
39 Diese Funktion kann ueberschrieben, um feinere Kontrolle ueber die
40 Bewegungen des Objekt zu haben. Dabei aber bitte einige Dinge beachten:
41 1. Denkt daran, ggf. M_NOCHECK zu beruecksichtigen und und eure
42 Pruefungen nur zu machen, wenn es nicht in method vorkommt.
43 2. GANZ WICHTIG: Wenn ihr mit euren Pruefungen fertig sein und das Objekt
44 bewegt werden duerfte, die geerbten Pruefungen noch testen, also _IMMER_
45 das geerbte PreventMove() noch aufrufen und dessen Wert
46 zurueckgeben/beruecksichtigen, da sonst Pruefungen des Gewichts etc.
47 nicht funktionieren oder bei Lebewesen die Prevent*() im Environment
48 nicht gerufen werden!
49 3. Die Funktion ist nur objektintern zu verwenden, Call-Other von aussen
50 sind nicht moeglich, beim Ueberschreiben 'protected' nicht vergessen.
51 4. Nochmal: Geerbtes PreventMove() _NICHT VERGESSEN_!
52
53BEISPIELE:
54 Ein Objekt, was nur im Sternenlicht aufgenommen werden kann (warum
55 auch immer):
56
57 protected int PreventMove(object dest, object oldenv, int method) {
58 if ( (method & M_NOCHECK) ) {
59 // wenn mit M_NOCHECK bewegt, ist das Sternenlicht egal, nur
60 // geerbtes PreventMove() beruecksichten:
61 return ::PreventMove(dest, oldenv, method);
62 }
63 else if ( method & M_GET) {
64 // wenn es aufgenommen werden soll: nach Sternenlicht im Raum
65 // gucken:
66 if (objectp(dest) &&
67 (dest->QueryProp(P_LIGHT_TYPE) != LT_STARS))
68 return ME_CANT_BE_TAKEN;
69 }
70 // Fall-through:
71 return ::PreventMove(dest, oldenv, method);
72 }
73
74
75SIEHE AUCH:
76 PreventLeave(), NotifyInsert(), NotifyLeave(), MayAddObject(),
77 PreventInsertLiving(), PreventLeaveLiving(), NotifyMove(),
78 PreventMove(), MayAddWeight(), move(), /std/container/restrictions.c
79
80----------------------------------------------------------------------------
81Last modified: 04.08.2007, Zesstra