Set() ===== FUNKTION -------- :: public varargs mixed Set(string name, mixed Value, int Type, int extern); DEFINIERT IN ------------ :: /std/thing/properties.c /sys/thing/properties.h (Prototyp) ARGUMENTE --------- :: name - Property, die manipuliert werden soll Value - der zu setzende/aendernde Wert Type - die Eigenschaft der Property, die manipuliert werden soll extern - Interne Verwendung: Wurde Set ueber SetProp von aussen gerufen. BESCHREIBUNG ------------ :: Eine der inneren Eigenschaften der Property 'name' wird veraendert. 'Type' ist dabei einer der in /sys/thing/properties.h definierten F_XXX - Werte: F_VALUE (==0, default) Setzt den Inhalt der Property auf 'Value'. Aehnlich "SetProp", umgeht jedoch eine etwaige F_SET_METHOD oder _set_'name'()-Methode. F_MODE F_MODE_AS F_MODE_AD Aendert eines der internen Flags der Property. F_MODE negiert den vorherigen Wert vom Flag 'Value', F_MODE_AS setzt und F_MODE_AD loescht ihn. Verfuegbare interne Flags: SAVE Property wird bei save_object() gespeichert PROTECTED Flag setzbar durch: beliebiges Objekt Flag loeschbar durch: this_object(), ROOT, EM+ Inhalt der Property veraendern sowie Set- und Query-Methoden setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+ WARNUNG: Dieses Flag nicht leichtfertig bei Spielern setzen! SECURED Flag setzbar durch: this_object(), ROOT, EM+ Flag loeschbar durch: Niemanden! Inhalt der Property veraendern sowie Set- und Query-Methoden setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+ NOSETMETHOD Property nicht mehr ueber SetProp() aenderbar (damit entfallen auch SET_METHOD, _set_'name') F_SET_METHOD Aendert den Eintrag fuer eine SetMethod - eine Closure, die anstatt des Setzens der Property beim Aufruf von SetProp mit 'Value' aufgerufen wird. F_QUERY_METHOD Aendert den Eintrag fuer eine QueryMethod - eine Closure, die anstatt des Lesens der Property beim Aufruf von QueryProp aufgerufen wird. RUeCKGABEWERT ------------- :: Das Ergebnis der Manipulation bzw. einer der definierten Fehlercodes. BEMERKUNGEN ----------- :: - Set() sollte nicht zum regulaeren Manipulieren des Inhalts einer Property verwendet werden, da sowohl F_SET_METHOD als auch libinterne _set_'name'()-Methoden umgangen werden und das Ergebnis fuer so veraenderte Properties undefiniert ist. - eine gesetzte F_SET/F_QUERY_METHOD hat bei SetProp/QueryProp Vorrang vor einer _set/_query_method -> _set/_query wird nach erfolgreichem Ruf von F_XXX_METHOD ignoriert - F_SET/F_QUERY_METHOD sollte normalerweise Vorzug vor einer _set_/_query_* gegeben werden. SetMethods/QueryMethods: - falls ihr Query/SetMethods an oeffentlichen Properties setzen wollt, prueft bitte vorher, ob dort nicht schon eine (fremde) gesetzt ist und brecht ggf. euer Set() ab, um nicht die Arbeit anderer Mitmagier zu sabotieren (z.B. P_HANDS) - Properties sollten mit Query- oder SetMethoden nur so lange wie noetig belegt werden -> manche Properties sollte man als Wert setzen, _auch wenn_ die Spieler sie zuruecksetzen koennten (zB P_MSGIN/P_MSGOUT) - auf keinen Fall den Wert speichern, ueberschreiben, rueckschreiben, das fuehrt fast immer zu Problemen. - Set/QueryMethoden sollten nicht als Trigger/Listener fuer ein Ereignis (z.B. P_DIE_MSG fuer das Ereignis "Tod des Spielers") missbraucht werden -> es gibt sichere und saubere Moeglichkeiten (NotifyPlayerDeath), und wenn nicht, wendet euch an den EM eures Vertrauens - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static' sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer geht nur 'static' (in diesem Fall empfohlen). BEISPIELE --------- :: ### Aendern von Eigenschaften einer Property ### // Setzen des SAVE-Flags (bei save_object() mitzuspeichern) Set(P_XYZ, SAVE, F_MODE_AS); // Loeschen des SAVE-Flags Set(P_XYZ, SAVE, F_MODE_AD); // Negieren des bisherigen SAVE-Flags Set(P_XYZ, SAVE, F_MODE); // Hinweis: das Setzen des Flags funktioniert mittels F_MODE nur dann, // wenn sichergestellt ist, dass es vorher nicht gesetzt war. Die // sichere Variante ist daher, F_MODE_AS zu verwenden. // Sperren des SetProp/SET_METHOD-Zugriffs: Set(P_XYZ, NOSETMETHOD, F_MODE_AS); // Vorlaeufiger Zugriffsschutz fuer eine Property: Set(P_XYZ, PROTECTED, F_MODE_AS); // Permanenter Zugriffsschutz fuer eine Property: Set(P_XYZ, SECURED, F_MODE_AS); ### Setzen einer SetMethod/QueryMethod ### // Setzen einer internen SetMethod mixed foo(mixed val); ... Set(P_XYZ, #'foo, F_SET_METHOD); ... // Setzen einer QueryMethod bei einem anderen Objekt mixed bar(); ... other->Set(P_XYZ, #'bar, F_QUERY_METHOD); ... // Der Vollstaendigkeit halber sei das Aendern einer Property unter // Umgehung von Set-Methoden angegeben. Es ist aber aus o.g. Gruenden // zu empfehlen, diese Variante nicht zu verwenden. Set(P_XYZ, "bla", F_VALUE); SIEHE AUCH ---------- :: Aehnliches: SetProp(L), QueryProp(L), Query(L) Generell: SetProperties(L), QueryProperties(L) Konzept: properties, /std/thing/properties.c Sonstiges: P_AUTOLOADOBJ 06. Jan 2008 Arathorn