blob: bef7161d9e15dbf78bf095465fd2e871d72a0e58 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
MG Mud User88f12472016-06-24 23:31:02 +02002Set()
Zesstra953f9972017-02-18 15:37:36 +01003*****
MG Mud User88f12472016-06-24 23:31:02 +02004
MG Mud User88f12472016-06-24 23:31:02 +02005
Zesstra953f9972017-02-18 15:37:36 +01006FUNKTION
7========
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra953f9972017-02-18 15:37:36 +01009 public varargs mixed Set(string name, mixed Value, int Type, int extern);
MG Mud User88f12472016-06-24 23:31:02 +020010
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012DEFINIERT IN
13============
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015 /std/thing/properties.c
16 /sys/thing/properties.h (Prototyp)
MG Mud User88f12472016-06-24 23:31:02 +020017
MG Mud User88f12472016-06-24 23:31:02 +020018
Zesstra953f9972017-02-18 15:37:36 +010019ARGUMENTE
20=========
MG Mud User88f12472016-06-24 23:31:02 +020021
Zesstra953f9972017-02-18 15:37:36 +010022 name - Property, die manipuliert werden soll
23 Value - der zu setzende/aendernde Wert
24 Type - die Eigenschaft der Property, die manipuliert werden soll
25 extern - Interne Verwendung:
26 Wurde Set ueber SetProp von aussen gerufen.
MG Mud User88f12472016-06-24 23:31:02 +020027
MG Mud User88f12472016-06-24 23:31:02 +020028
Zesstra953f9972017-02-18 15:37:36 +010029BESCHREIBUNG
30============
MG Mud User88f12472016-06-24 23:31:02 +020031
Zesstra953f9972017-02-18 15:37:36 +010032 Eine der inneren Eigenschaften der Property 'name' wird veraendert.
33 'Type' ist dabei einer der in /sys/thing/properties.h definierten
34 F_XXX - Werte:
MG Mud User88f12472016-06-24 23:31:02 +020035
Zesstra953f9972017-02-18 15:37:36 +010036 F_VALUE (==0, default)
37 Setzt den Inhalt der Property auf 'Value'. Aehnlich "SetProp",
38 umgeht jedoch eine etwaige F_SET_METHOD oder _set_'name'()-Methode.
39 F_MODE
40 F_MODE_AS
41 F_MODE_AD
42 Aendert eines der internen Flags der Property. F_MODE negiert den
43 vorherigen Wert vom Flag 'Value', F_MODE_AS setzt und F_MODE_AD
44 loescht ihn.
45 Verfuegbare interne Flags:
MG Mud User88f12472016-06-24 23:31:02 +020046
Zesstra953f9972017-02-18 15:37:36 +010047 SAVE
MG Mud User88f12472016-06-24 23:31:02 +020048
Zesstra953f9972017-02-18 15:37:36 +010049 Property wird bei save_object() gespeichert
MG Mud User88f12472016-06-24 23:31:02 +020050
Zesstra953f9972017-02-18 15:37:36 +010051 PROTECTED
MG Mud User88f12472016-06-24 23:31:02 +020052
Zesstra953f9972017-02-18 15:37:36 +010053 Flag setzbar durch: beliebiges Objekt
54 Flag loeschbar durch: this_object(), ROOT, EM+
55 Inhalt der Property veraendern sowie Set- und Query-Methoden
56 setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+
57 WARNUNG: Dieses Flag nicht leichtfertig bei Spielern setzen!
58
59 SECURED
60
61 Flag setzbar durch: this_object(), ROOT, EM+
62 Flag loeschbar durch: Niemanden!
63 Inhalt der Property veraendern sowie Set- und Query-Methoden
64 setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+
65
66 NOSETMETHOD
67
68 Property nicht mehr ueber SetProp() aenderbar
69 (damit entfallen auch SET_METHOD, _set_'name')
Zesstraf54f03a2021-12-29 19:55:08 +010070
71 SETMAPPED
72
73 Die Set-Methode speichert den Werte nicht selber, sondern gibt
74 ihn zurueck, das Property-System speichert ihn dann.
75 WARNUNG: Dieses Flag nicht per Hand manipulieren.
76
Zesstra953f9972017-02-18 15:37:36 +010077 F_SET_METHOD
78 Aendert den Eintrag fuer eine SetMethod - eine Closure, die anstatt
79 des Setzens der Property beim Aufruf von SetProp mit 'Value'
80 aufgerufen wird.
Zesstraf54f03a2021-12-29 19:55:08 +010081 F_SET_MAPPER
82 Setzt wie F_SET_METHOD eine Set-Methode (Closure), welche aber den Wert
83 der Property beim Aufruf nicht selber (durch Aufruf von Set()) setzt,
84 sondern den Wert zurueckgeben muss, der gesetzt werden soll.
85 Bsp. #'copy um vor dem Speichern eine Kopie zu erstellen
Zesstra953f9972017-02-18 15:37:36 +010086 F_QUERY_METHOD
87 Aendert den Eintrag fuer eine QueryMethod - eine Closure, die anstatt
88 des Lesens der Property beim Aufruf von QueryProp aufgerufen wird.
Zesstraf54f03a2021-12-29 19:55:08 +010089 Diese bekommt den gespeicherten Wert der Property uebergeben und muss
90 den an den Aufrufer von QueryProp() zurueckzugebenden Wert
91 zurueckgeben.
92 Bsp: #'copy, um eine Kopie des gespeicherten Wertes zurueckzugeben
Zesstra953f9972017-02-18 15:37:36 +010093
94RUeCKGABEWERT
95=============
96
97 Das Ergebnis der Manipulation bzw. einer der definierten
98 Fehlercodes.
99
100
101BEMERKUNGEN
102===========
103
104 - Set() sollte nicht zum regulaeren Manipulieren des Inhalts einer
105 Property verwendet werden, da sowohl F_SET_METHOD als auch libinterne
106 _set_'name'()-Methoden umgangen werden und das Ergebnis fuer so
107 veraenderte Properties undefiniert ist.
108 - eine gesetzte F_SET/F_QUERY_METHOD hat bei SetProp/QueryProp Vorrang
109 vor einer _set/_query_method
110 -> _set/_query wird nach erfolgreichem Ruf von F_XXX_METHOD ignoriert
111 - F_SET/F_QUERY_METHOD sollte normalerweise Vorzug vor einer
112 _set_/_query_* gegeben werden.
113
114 SetMethods/QueryMethods:
115 - falls ihr Query/SetMethods an oeffentlichen Properties setzen
116 wollt, prueft bitte vorher, ob dort nicht schon eine (fremde) gesetzt
117 ist und brecht ggf. euer Set() ab, um nicht die Arbeit anderer
118 Mitmagier zu sabotieren (z.B. P_HANDS)
119 - Properties sollten mit Query- oder SetMethoden nur so lange wie
120 noetig belegt werden
121 -> manche Properties sollte man als Wert setzen, _auch wenn_ die
122 Spieler sie zuruecksetzen koennten (zB P_MSGIN/P_MSGOUT)
123 - auf keinen Fall den Wert speichern, ueberschreiben, rueckschreiben,
124 das fuehrt fast immer zu Problemen.
125 - Set/QueryMethoden sollten nicht als Trigger/Listener fuer ein
126 Ereignis (z.B. P_DIE_MSG fuer das Ereignis "Tod des Spielers")
127 missbraucht werden
128 -> es gibt sichere und saubere Moeglichkeiten (NotifyPlayerDeath),
129 und wenn nicht, wendet euch an den EM eures Vertrauens
130 - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static'
131 sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer
132 geht nur 'static' (in diesem Fall empfohlen).
133
134
135BEISPIELE
136=========
137
138 ### Aendern von Eigenschaften einer Property ###
139 // Setzen des SAVE-Flags (bei save_object() mitzuspeichern)
140 Set(P_XYZ, SAVE, F_MODE_AS);
141
142 // Loeschen des SAVE-Flags
143 Set(P_XYZ, SAVE, F_MODE_AD);
144
Zesstraf54f03a2021-12-29 19:55:08 +0100145 // Negieren (Umschalten) des bisherigen SAVE-Flags
Zesstra953f9972017-02-18 15:37:36 +0100146 Set(P_XYZ, SAVE, F_MODE);
147 // Hinweis: das Setzen des Flags funktioniert mittels F_MODE nur dann,
148 // wenn sichergestellt ist, dass es vorher nicht gesetzt war. Die
149 // sichere Variante ist daher, F_MODE_AS zu verwenden.
150
151 // Sperren des SetProp/SET_METHOD-Zugriffs:
152 Set(P_XYZ, NOSETMETHOD, F_MODE_AS);
153
154 // Vorlaeufiger Zugriffsschutz fuer eine Property:
155 Set(P_XYZ, PROTECTED, F_MODE_AS);
156
157 // Permanenter Zugriffsschutz fuer eine Property:
158 Set(P_XYZ, SECURED, F_MODE_AS);
159
160 ### Setzen einer SetMethod/QueryMethod ###
161 // Setzen einer internen SetMethod
162 mixed foo(mixed val);
163 ...
164 Set(P_XYZ, #'foo, F_SET_METHOD);
165 ...
166
167 // Setzen einer QueryMethod bei einem anderen Objekt
168 mixed bar();
169 ...
170 other->Set(P_XYZ, #'bar, F_QUERY_METHOD);
171 ...
172
Zesstraf54f03a2021-12-29 19:55:08 +0100173 // Setzen/Nutzen eines Mappers (F_SET_MAPPER) zum Skalieren
174 int scale(int val) {return val * 100;}
175 Set(P_XYZ, #'scale, F_SET_MAPPER);
176 int unscale(int val) {return val / 100;}
177 Set(P_XYZ, #'unscale, F_QUERY_METHOD);
178
Zesstra953f9972017-02-18 15:37:36 +0100179 // Der Vollstaendigkeit halber sei das Aendern einer Property unter
180 // Umgehung von Set-Methoden angegeben. Es ist aber aus o.g. Gruenden
181 // zu empfehlen, diese Variante nicht zu verwenden.
182 Set(P_XYZ, "bla", F_VALUE);
183
184
185SIEHE AUCH
186==========
187
188 Aehnliches: SetProp(L), QueryProp(L), Query(L)
189 Generell: SetProperties(L), QueryProperties(L)
190 Konzept: properties, /std/thing/properties.c
191 Sonstiges: P_AUTOLOADOBJ
192
1936. Jan 2008 Arathorn