blob: d6540277093f8f125306a7492477ca6fbf8a61f5 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
2Set()
3*****
4
5
6FUNKTION
7========
8
9 public varargs mixed Set(string name, mixed Value, int Type, int extern);
10
11
12DEFINIERT IN
13============
14
15 /std/thing/properties.c
16 /sys/thing/properties.h (Prototyp)
17
18
19ARGUMENTE
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
25 extern - Interne Verwendung:
26 Wurde Set ueber SetProp von aussen gerufen.
27
28
29BESCHREIBUNG
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')
70 F_SET_METHOD
71 Aendert den Eintrag fuer eine SetMethod - eine Closure, die anstatt
72 des Setzens der Property beim Aufruf von SetProp mit 'Value'
73 aufgerufen wird.
74 F_QUERY_METHOD
75 Aendert den Eintrag fuer eine QueryMethod - eine Closure, die anstatt
76 des Lesens der Property beim Aufruf von QueryProp aufgerufen wird.
77
78
79RUeCKGABEWERT
80=============
81
82 Das Ergebnis der Manipulation bzw. einer der definierten
83 Fehlercodes.
84
85
86BEMERKUNGEN
87===========
88
89 - Set() sollte nicht zum regulaeren Manipulieren des Inhalts einer
90 Property verwendet werden, da sowohl F_SET_METHOD als auch libinterne
91 _set_'name'()-Methoden umgangen werden und das Ergebnis fuer so
92 veraenderte Properties undefiniert ist.
93 - eine gesetzte F_SET/F_QUERY_METHOD hat bei SetProp/QueryProp Vorrang
94 vor einer _set/_query_method
95 -> _set/_query wird nach erfolgreichem Ruf von F_XXX_METHOD ignoriert
96 - F_SET/F_QUERY_METHOD sollte normalerweise Vorzug vor einer
97 _set_/_query_* gegeben werden.
98
99 SetMethods/QueryMethods:
100 - falls ihr Query/SetMethods an oeffentlichen Properties setzen
101 wollt, prueft bitte vorher, ob dort nicht schon eine (fremde) gesetzt
102 ist und brecht ggf. euer Set() ab, um nicht die Arbeit anderer
103 Mitmagier zu sabotieren (z.B. P_HANDS)
104 - Properties sollten mit Query- oder SetMethoden nur so lange wie
105 noetig belegt werden
106 -> manche Properties sollte man als Wert setzen, _auch wenn_ die
107 Spieler sie zuruecksetzen koennten (zB P_MSGIN/P_MSGOUT)
108 - auf keinen Fall den Wert speichern, ueberschreiben, rueckschreiben,
109 das fuehrt fast immer zu Problemen.
110 - Set/QueryMethoden sollten nicht als Trigger/Listener fuer ein
111 Ereignis (z.B. P_DIE_MSG fuer das Ereignis "Tod des Spielers")
112 missbraucht werden
113 -> es gibt sichere und saubere Moeglichkeiten (NotifyPlayerDeath),
114 und wenn nicht, wendet euch an den EM eures Vertrauens
115 - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static'
116 sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer
117 geht nur 'static' (in diesem Fall empfohlen).
118
119
120BEISPIELE
121=========
122
123 ### Aendern von Eigenschaften einer Property ###
124 // Setzen des SAVE-Flags (bei save_object() mitzuspeichern)
125 Set(P_XYZ, SAVE, F_MODE_AS);
126
127 // Loeschen des SAVE-Flags
128 Set(P_XYZ, SAVE, F_MODE_AD);
129
130
131
132 // Negieren des bisherigen SAVE-Flags
133 Set(P_XYZ, SAVE, F_MODE);
134 // Hinweis: das Setzen des Flags funktioniert mittels F_MODE nur dann,
135 // wenn sichergestellt ist, dass es vorher nicht gesetzt war. Die
136 // sichere Variante ist daher, F_MODE_AS zu verwenden.
137
138 // Sperren des SetProp/SET_METHOD-Zugriffs:
139 Set(P_XYZ, NOSETMETHOD, F_MODE_AS);
140
141 // Vorlaeufiger Zugriffsschutz fuer eine Property:
142 Set(P_XYZ, PROTECTED, F_MODE_AS);
143
144 // Permanenter Zugriffsschutz fuer eine Property:
145 Set(P_XYZ, SECURED, F_MODE_AS);
146
147 ### Setzen einer SetMethod/QueryMethod ###
148 // Setzen einer internen SetMethod
149 mixed foo(mixed val);
150 ...
151 Set(P_XYZ, #'foo, F_SET_METHOD);
152 ...
153
154 // Setzen einer QueryMethod bei einem anderen Objekt
155 mixed bar();
156 ...
157 other->Set(P_XYZ, #'bar, F_QUERY_METHOD);
158 ...
159
160 // Der Vollstaendigkeit halber sei das Aendern einer Property unter
161 // Umgehung von Set-Methoden angegeben. Es ist aber aus o.g. Gruenden
162 // zu empfehlen, diese Variante nicht zu verwenden.
163 Set(P_XYZ, "bla", F_VALUE);
164
165
166SIEHE AUCH
167==========
168
169 Aehnliches: SetProp(L), QueryProp(L), Query(L)
170 Generell: SetProperties(L), QueryProperties(L)
171 Konzept: properties, /std/thing/properties.c
172 Sonstiges: P_AUTOLOADOBJ
173
1746. Jan 2008 Arathorn