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