blob: df20c4afb89906265fd8206adc7de980c5e955d6 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001Set()
2=====
3
4FUNKTION
5--------
6::
7
Zesstra5c0c4092021-09-08 23:27:54 +02008 public mixed Set(string name, mixed Value,
9 int Type = F_VALUE, int drop_priv = extern_call())
Zesstra18626972017-01-31 10:38:27 +010010
11DEFINIERT IN
12------------
13::
14
15 /std/thing/properties.c
16 /sys/thing/properties.h (Prototyp)
17
18ARGUMENTE
19---------
20::
21
22 name - Property, die manipuliert werden soll
23 Value - der zu setzende/aendernde Wert
24 Type - die Eigenschaft der Property, die manipuliert werden soll
Zesstra5c0c4092021-09-08 23:27:54 +020025 drop_priv - Interne Verwendung, wenn Aufrufer Privilegien abgibt,
26 z.B. objekt-interner Aufruf extern zaehlen soll.
Zesstra18626972017-01-31 10:38:27 +010027
28BESCHREIBUNG
29------------
30::
31
32 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:
35
36 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:
46
47 SAVE
48
49 Property wird bei save_object() gespeichert
50
51 PROTECTED
52
53 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')
Zesstrab0a147e2025-07-30 20:50:32 +020070
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
Zesstra18626972017-01-31 10:38:27 +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'
Zesstrab0a147e2025-07-30 20:50:32 +020080 aufgerufen wird. Die Closure sollte den neuen Wert der Property
81 zurueckliefern. Die Propertyverwaltung aendert hierbei F_VALUE aber
82 nicht, dies muss die Closure tun.
83
84 F_SET_MAPPER
85 Setzt wie F_SET_METHOD eine Set-Methode (Closure), welche aber den Wert
86 der Property beim Aufruf nicht selber (durch Aufruf von Set()) setzt,
87 sondern den Wert zurueckgeben muss, der gesetzt werden soll.
88 Setzt eine F_SET_METHOD und das Flag SETMAPPED
89 Bsp. #'copy um vor dem Speichern eine Kopie zu erstellen
90
Zesstra18626972017-01-31 10:38:27 +010091 F_QUERY_METHOD
92 Aendert den Eintrag fuer eine QueryMethod - eine Closure, die anstatt
93 des Lesens der Property beim Aufruf von QueryProp aufgerufen wird.
Zesstrab0a147e2025-07-30 20:50:32 +020094 Diese bekommt den gespeicherten Wert der Property uebergeben und muss
95 den an den Aufrufer von QueryProp() zurueckzugebenden Wert
96 zurueckgeben.
97 Bsp: #'copy, um eine Kopie des gespeicherten Wertes zurueckzugeben
98
Zesstra18626972017-01-31 10:38:27 +010099
100RUeCKGABEWERT
101-------------
102::
103
104 Das Ergebnis der Manipulation bzw. einer der definierten
105 Fehlercodes.
106
107BEMERKUNGEN
108-----------
109::
110
111 - Set() sollte nicht zum regulaeren Manipulieren des Inhalts einer
112 Property verwendet werden, da sowohl F_SET_METHOD als auch libinterne
113 _set_'name'()-Methoden umgangen werden und das Ergebnis fuer so
114 veraenderte Properties undefiniert ist.
115 - eine gesetzte F_SET/F_QUERY_METHOD hat bei SetProp/QueryProp Vorrang
116 vor einer _set/_query_method
117 -> _set/_query wird nach erfolgreichem Ruf von F_XXX_METHOD ignoriert
118 - F_SET/F_QUERY_METHOD sollte normalerweise Vorzug vor einer
119 _set_/_query_* gegeben werden.
120
121 SetMethods/QueryMethods:
122 - falls ihr Query/SetMethods an oeffentlichen Properties setzen
123 wollt, prueft bitte vorher, ob dort nicht schon eine (fremde) gesetzt
124 ist und brecht ggf. euer Set() ab, um nicht die Arbeit anderer
125 Mitmagier zu sabotieren (z.B. P_HANDS)
126 - Properties sollten mit Query- oder SetMethoden nur so lange wie
127 noetig belegt werden
128 -> manche Properties sollte man als Wert setzen, _auch wenn_ die
129 Spieler sie zuruecksetzen koennten (zB P_MSGIN/P_MSGOUT)
130 - auf keinen Fall den Wert speichern, ueberschreiben, rueckschreiben,
131 das fuehrt fast immer zu Problemen.
132 - Set/QueryMethoden sollten nicht als Trigger/Listener fuer ein
133 Ereignis (z.B. P_DIE_MSG fuer das Ereignis "Tod des Spielers")
134 missbraucht werden
135 -> es gibt sichere und saubere Moeglichkeiten (NotifyPlayerDeath),
136 und wenn nicht, wendet euch an den EM eures Vertrauens
137 - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static'
138 sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer
139 geht nur 'static' (in diesem Fall empfohlen).
140
141BEISPIELE
142---------
143::
144
145 ### Aendern von Eigenschaften einer Property ###
146 // Setzen des SAVE-Flags (bei save_object() mitzuspeichern)
147 Set(P_XYZ, SAVE, F_MODE_AS);
148
149 // Loeschen des SAVE-Flags
150 Set(P_XYZ, SAVE, F_MODE_AD);
151
Zesstrab0a147e2025-07-30 20:50:32 +0200152 // Negieren (Umschalten) des bisherigen SAVE-Flags
Zesstra18626972017-01-31 10:38:27 +0100153 Set(P_XYZ, SAVE, F_MODE);
154 // Hinweis: das Setzen des Flags funktioniert mittels F_MODE nur dann,
155 // wenn sichergestellt ist, dass es vorher nicht gesetzt war. Die
156 // sichere Variante ist daher, F_MODE_AS zu verwenden.
157
158 // Sperren des SetProp/SET_METHOD-Zugriffs:
159 Set(P_XYZ, NOSETMETHOD, F_MODE_AS);
160
161 // Vorlaeufiger Zugriffsschutz fuer eine Property:
162 Set(P_XYZ, PROTECTED, F_MODE_AS);
163
164 // Permanenter Zugriffsschutz fuer eine Property:
165 Set(P_XYZ, SECURED, F_MODE_AS);
166
167 ### Setzen einer SetMethod/QueryMethod ###
168 // Setzen einer internen SetMethod
169 mixed foo(mixed val);
170 ...
171 Set(P_XYZ, #'foo, F_SET_METHOD);
172 ...
173
Zesstrab0a147e2025-07-30 20:50:32 +0200174 // Setzen einer Mapperfunktion , welche alle Werte mit 100 multipliziert
175 int scale(int val) {return val * 100;}
176 Set(P_XYZ, #'scale, F_SET_MAPPER);
177
Zesstra18626972017-01-31 10:38:27 +0100178 // Setzen einer QueryMethod bei einem anderen Objekt
Zesstrab0a147e2025-07-30 20:50:32 +0200179 mixed bar(mixed f_value);
Zesstra18626972017-01-31 10:38:27 +0100180 ...
181 other->Set(P_XYZ, #'bar, F_QUERY_METHOD);
182 ...
Zesstrab0a147e2025-07-30 20:50:32 +0200183 // Query-Methode, die beim Abruf eine Kopie des Werts erstellt
184 Set(P_XYZ, #'copy, F_QUERY_METHOD);
Zesstra18626972017-01-31 10:38:27 +0100185
186 // Der Vollstaendigkeit halber sei das Aendern einer Property unter
187 // Umgehung von Set-Methoden angegeben. Es ist aber aus o.g. Gruenden
188 // zu empfehlen, diese Variante nicht zu verwenden.
189 Set(P_XYZ, "bla", F_VALUE);
190
191SIEHE AUCH
192----------
193::
194
195 Aehnliches: SetProp(L), QueryProp(L), Query(L)
196 Generell: SetProperties(L), QueryProperties(L)
197 Konzept: properties, /std/thing/properties.c
198 Sonstiges: P_AUTOLOADOBJ
199
Zesstra5c0c4092021-09-08 23:27:54 +02002008.9.2021, Zesstra
Zesstra18626972017-01-31 10:38:27 +0100201