Start Info Community Spielen
 
 

Morgengrauner Dokumentation

Dateipfad: /home/mud/mudlib/doc//lfun/Set

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


zurück zur Übersicht

YOUTUBE | FACEBOOK | TWITTER | DISCORD | FEEDBACK | IMPRESSUM | DATENSCHUTZ 1992–2023 © MorgenGrauen.