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