blob: ffca76ab2769ebaa5a2eb44135c89ed20e269f59 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001Set()
2=====
3
4FUNKTION
5--------
6::
7
8 public varargs mixed Set(string name, mixed Value, int Type, int extern);
9
10DEFINIERT IN
11------------
12::
13
14 /std/thing/properties.c
15 /sys/thing/properties.h (Prototyp)
16
17ARGUMENTE
18---------
19::
20
21 name - Property, die manipuliert werden soll
22 Value - der zu setzende/aendernde Wert
23 Type - die Eigenschaft der Property, die manipuliert werden soll
24 extern - Interne Verwendung:
25 Wurde Set ueber SetProp von aussen gerufen.
26
27BESCHREIBUNG
28------------
29::
30
31 Eine der inneren Eigenschaften der Property 'name' wird veraendert.
32 'Type' ist dabei einer der in /sys/thing/properties.h definierten
33 F_XXX - Werte:
34
35 F_VALUE (==0, default)
36 Setzt den Inhalt der Property auf 'Value'. Aehnlich "SetProp",
37 umgeht jedoch eine etwaige F_SET_METHOD oder _set_'name'()-Methode.
38 F_MODE
39 F_MODE_AS
40 F_MODE_AD
41 Aendert eines der internen Flags der Property. F_MODE negiert den
42 vorherigen Wert vom Flag 'Value', F_MODE_AS setzt und F_MODE_AD
43 loescht ihn.
44 Verfuegbare interne Flags:
45
46 SAVE
47
48 Property wird bei save_object() gespeichert
49
50 PROTECTED
51
52 Flag setzbar durch: beliebiges Objekt
53 Flag loeschbar durch: this_object(), ROOT, EM+
54 Inhalt der Property veraendern sowie Set- und Query-Methoden
55 setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+
56 WARNUNG: Dieses Flag nicht leichtfertig bei Spielern setzen!
57
58 SECURED
59
60 Flag setzbar durch: this_object(), ROOT, EM+
61 Flag loeschbar durch: Niemanden!
62 Inhalt der Property veraendern sowie Set- und Query-Methoden
63 setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+
64
65 NOSETMETHOD
66
67 Property nicht mehr ueber SetProp() aenderbar
68 (damit entfallen auch SET_METHOD, _set_'name')
69 F_SET_METHOD
70 Aendert den Eintrag fuer eine SetMethod - eine Closure, die anstatt
71 des Setzens der Property beim Aufruf von SetProp mit 'Value'
72 aufgerufen wird.
73 F_QUERY_METHOD
74 Aendert den Eintrag fuer eine QueryMethod - eine Closure, die anstatt
75 des Lesens der Property beim Aufruf von QueryProp aufgerufen wird.
76
77RUeCKGABEWERT
78-------------
79::
80
81 Das Ergebnis der Manipulation bzw. einer der definierten
82 Fehlercodes.
83
84BEMERKUNGEN
85-----------
86::
87
88 - Set() sollte nicht zum regulaeren Manipulieren des Inhalts einer
89 Property verwendet werden, da sowohl F_SET_METHOD als auch libinterne
90 _set_'name'()-Methoden umgangen werden und das Ergebnis fuer so
91 veraenderte Properties undefiniert ist.
92 - eine gesetzte F_SET/F_QUERY_METHOD hat bei SetProp/QueryProp Vorrang
93 vor einer _set/_query_method
94 -> _set/_query wird nach erfolgreichem Ruf von F_XXX_METHOD ignoriert
95 - F_SET/F_QUERY_METHOD sollte normalerweise Vorzug vor einer
96 _set_/_query_* gegeben werden.
97
98 SetMethods/QueryMethods:
99 - falls ihr Query/SetMethods an oeffentlichen Properties setzen
100 wollt, prueft bitte vorher, ob dort nicht schon eine (fremde) gesetzt
101 ist und brecht ggf. euer Set() ab, um nicht die Arbeit anderer
102 Mitmagier zu sabotieren (z.B. P_HANDS)
103 - Properties sollten mit Query- oder SetMethoden nur so lange wie
104 noetig belegt werden
105 -> manche Properties sollte man als Wert setzen, _auch wenn_ die
106 Spieler sie zuruecksetzen koennten (zB P_MSGIN/P_MSGOUT)
107 - auf keinen Fall den Wert speichern, ueberschreiben, rueckschreiben,
108 das fuehrt fast immer zu Problemen.
109 - Set/QueryMethoden sollten nicht als Trigger/Listener fuer ein
110 Ereignis (z.B. P_DIE_MSG fuer das Ereignis "Tod des Spielers")
111 missbraucht werden
112 -> es gibt sichere und saubere Moeglichkeiten (NotifyPlayerDeath),
113 und wenn nicht, wendet euch an den EM eures Vertrauens
114 - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static'
115 sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer
116 geht nur 'static' (in diesem Fall empfohlen).
117
118BEISPIELE
119---------
120::
121
122 ### Aendern von Eigenschaften einer Property ###
123 // Setzen des SAVE-Flags (bei save_object() mitzuspeichern)
124 Set(P_XYZ, SAVE, F_MODE_AS);
125
126 // Loeschen des SAVE-Flags
127 Set(P_XYZ, SAVE, F_MODE_AD);
128
129
130
131 // Negieren des bisherigen SAVE-Flags
132 Set(P_XYZ, SAVE, F_MODE);
133 // Hinweis: das Setzen des Flags funktioniert mittels F_MODE nur dann,
134 // wenn sichergestellt ist, dass es vorher nicht gesetzt war. Die
135 // sichere Variante ist daher, F_MODE_AS zu verwenden.
136
137 // Sperren des SetProp/SET_METHOD-Zugriffs:
138 Set(P_XYZ, NOSETMETHOD, F_MODE_AS);
139
140 // Vorlaeufiger Zugriffsschutz fuer eine Property:
141 Set(P_XYZ, PROTECTED, F_MODE_AS);
142
143 // Permanenter Zugriffsschutz fuer eine Property:
144 Set(P_XYZ, SECURED, F_MODE_AS);
145
146 ### Setzen einer SetMethod/QueryMethod ###
147 // Setzen einer internen SetMethod
148 mixed foo(mixed val);
149 ...
150 Set(P_XYZ, #'foo, F_SET_METHOD);
151 ...
152
153 // Setzen einer QueryMethod bei einem anderen Objekt
154 mixed bar();
155 ...
156 other->Set(P_XYZ, #'bar, F_QUERY_METHOD);
157 ...
158
159 // Der Vollstaendigkeit halber sei das Aendern einer Property unter
160 // Umgehung von Set-Methoden angegeben. Es ist aber aus o.g. Gruenden
161 // zu empfehlen, diese Variante nicht zu verwenden.
162 Set(P_XYZ, "bla", F_VALUE);
163
164SIEHE AUCH
165----------
166::
167
168 Aehnliches: SetProp(L), QueryProp(L), Query(L)
169 Generell: SetProperties(L), QueryProperties(L)
170 Konzept: properties, /std/thing/properties.c
171 Sonstiges: P_AUTOLOADOBJ
172
17306. Jan 2008 Arathorn
174