blob: e6092f009f3ba3abcaa296f76ca6da0d1dfad884 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001PreventMove()
2*************
3
4
Zesstraef629dc2020-01-09 21:11:25 +01005PreventMove()
6=============
MG Mud User88f12472016-06-24 23:31:02 +02007
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra953f9972017-02-18 15:37:36 +01009FUNKTION
10========
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012 protected int PreventMove(object dest, object oldenv, int method);
MG Mud User88f12472016-06-24 23:31:02 +020013
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015DEFINIERT IN
16============
MG Mud User88f12472016-06-24 23:31:02 +020017
Zesstraef629dc2020-01-09 21:11:25 +010018 /std/thing/moving.c /std/living/moving.c /std/player/moving.c
MG Mud User88f12472016-06-24 23:31:02 +020019
MG Mud User88f12472016-06-24 23:31:02 +020020
Zesstra953f9972017-02-18 15:37:36 +010021ARGUMENTE
22=========
23
24 dest
Zesstraef629dc2020-01-09 21:11:25 +010025 Das Ziel des Moves
26
Zesstra953f9972017-02-18 15:37:36 +010027 oldenv
Zesstraef629dc2020-01-09 21:11:25 +010028 Das (Noch-)Environment des Objekts
29
Zesstra953f9972017-02-18 15:37:36 +010030 method
Zesstraef629dc2020-01-09 21:11:25 +010031 Die Move-Methode(n), mit der/denen bewegt werden soll
Zesstra953f9972017-02-18 15:37:36 +010032
33
34BESCHREIBUNG
35============
36
Zesstraef629dc2020-01-09 21:11:25 +010037 Mit dieser Funktion prueft ein Objekt, ob es von 'oldenv' nach
38 'dest' bewegt werden mag. Dabei wird 'method' beruecksichtigt (z.B.
39 schaltet M_NOCHECK die meisten Pruefungen ab). Bei Gegenstaenden
40 wird z.B. P_NODROP, P_NOGET, das Gewicht, ob das Ziel das Objekt
41 aufnehmen will (MayAddWeight(), PreventInsert) oder auch
42 PreventLeave() geprueft. Bei Lebewesen wird z.B. P_NO_TPORT in
43 'dest' und 'oldenv' und PreventLeaveLiving/PreventInsertLiving()
44 ausgewertet. Bei Spielern wird auch noch getestet, ob method M_GO
45 oder M_TPORT enthaelt und ob das Ziel nur von Testspielern betreten
46 werden kann.
Zesstra953f9972017-02-18 15:37:36 +010047
48
49RUeCKGABEWERT
50=============
51
Zesstraef629dc2020-01-09 21:11:25 +010052 0, wenn das Objekt bewegt werden darf. Wenn es nicht bewegt werden
53 darf, sind als Rueckgabewerte die in /sys/moving.h definierten
54 Move-Fehlerwerte zulaessig (s. move()). Sollte hier ein ungueltiger
55 Fehlerwert zurueckgegeben werden, wird das move() ebenfalls
56 abgebrochen und ME_DONT_WANT_TO_BE_MOVED zurueckgeben.
Zesstra953f9972017-02-18 15:37:36 +010057
58
59BEMERKUNGEN
60===========
61
62 Diese Funktion kann ueberschrieben, um feinere Kontrolle ueber die
Zesstraef629dc2020-01-09 21:11:25 +010063 Bewegungen des Objekt zu haben. Dabei aber bitte einige Dinge
64 beachten:
65
Zesstra953f9972017-02-18 15:37:36 +010066 1. Denkt daran, ggf. M_NOCHECK zu beruecksichtigen und und eure
67 Pruefungen nur zu machen, wenn es nicht in method vorkommt.
Zesstraef629dc2020-01-09 21:11:25 +010068
69 2. *GANZ WICHTIG*: Wenn ihr mit euren Pruefungen fertig sein und
70 das Objekt bewegt werden duerfte, die geerbten Pruefungen noch
71 testen, also *IMMER* das geerbte PreventMove() noch aufrufen und
72 dessen Wert zurueckgeben/beruecksichtigen, da sonst Pruefungen des
73 Gewichts etc. nicht funktionieren oder bei Lebewesen die Prevent*()
74 im Environment nicht gerufen werden!
75
76 3. Die Funktion ist nur objektintern zu verwenden, Call-Other von
77 aussen sind nicht moeglich, beim Ueberschreiben 'protected' nicht
78 vergessen.
79
80 4. Nochmal: Geerbtes PreventMove() *NICHT VERGESSEN*!
Zesstra953f9972017-02-18 15:37:36 +010081
82
83BEISPIELE
84=========
85
86 Ein Objekt, was nur im Sternenlicht aufgenommen werden kann (warum
87 auch immer):
88
89 protected int PreventMove(object dest, object oldenv, int method) {
90 if ( (method & M_NOCHECK) ) {
91 // wenn mit M_NOCHECK bewegt, ist das Sternenlicht egal, nur
92 // geerbtes PreventMove() beruecksichten:
93 return ::PreventMove(dest, oldenv, method);
MG Mud User88f12472016-06-24 23:31:02 +020094 }
Zesstra953f9972017-02-18 15:37:36 +010095 else if ( method & M_GET) {
96 // wenn es aufgenommen werden soll: nach Sternenlicht im Raum
97 // gucken:
98 if (objectp(dest) &&
99 (dest->QueryProp(P_LIGHT_TYPE) != LT_STARS))
100 return ME_CANT_BE_TAKEN;
101 }
102 // Fall-through:
103 return ::PreventMove(dest, oldenv, method);
104 }
MG Mud User88f12472016-06-24 23:31:02 +0200105
106
Zesstra953f9972017-02-18 15:37:36 +0100107SIEHE AUCH
108==========
MG Mud User88f12472016-06-24 23:31:02 +0200109
Zesstra953f9972017-02-18 15:37:36 +0100110 PreventLeave(), NotifyInsert(), NotifyLeave(), MayAddObject(),
111 PreventInsertLiving(), PreventLeaveLiving(), NotifyMove(),
Zesstraef629dc2020-01-09 21:11:25 +0100112 PreventMove(), MayAddWeight(), move()
Zesstra953f9972017-02-18 15:37:36 +0100113
Zesstraef629dc2020-01-09 21:11:25 +0100114Last modified: 09.01.2020, Zesstra