| Set() |
| ***** |
| |
| |
| FUNKTION |
| ======== |
| |
| public mixed Set(string name, mixed Value, |
| int Type = F_VALUE, int drop_priv = extern_call()) |
| |
| |
| 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 |
| drop_priv - Interne Verwendung, wenn Aufrufer Privilegien abgibt, |
| z.B. objekt-interner Aufruf extern zaehlen soll. |
| |
| |
| 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 |
| |
| 8.9.2021, Zesstra |