Configure()
===========

Configure()

  public mixed Configure(mixed data)
-------------------------------------------------
::

DEFINIERT IN
------------
::

   Beliebigen Objekten

ARGUMENTE
---------
::

   <data>
     0 fuer Datenabfrage
     beliebige Daten, die ein Configure(0) vorher lieferte

BESCHREIBUNG
------------
::

   Viele Objekte werden fuer bestimmte Spieler konfiguriert und so
   personalisiert. Sie enthalten zusaetzlich zu den Daten, welche waehrend des
   create() gesetzt wurden, noch weitere spieler-individuelle Daten.
   Damit diese Objekte im Bedarfsfall neu erstellt werden koennen, sollte ein
   geeignetes Configure() definfiert werden, um diese Daten abzurufen und in
   einem neuen Clone (oder neugeladener Blueprint) wieder zu setzen.

   

   Existiert Configure() im Objekt, MUSS dieses bei einem Aufruf mit
   <data>==0 (d.h. Configure(0)) alle individuellen Daten zurueckliefern,
   die noetig sind, um den aktuellen Zustand des Objektes spaeter
   wiederherzustellen.
   Das Objekt darf nach dem Zurueckgeben dieser Daten diese NICHT mehr
   veraendern, d.h. es muss ggf. eine Kopie erstellt werden (copy, deep_copy)

   Genau diese Daten werden in einem neu geclonten Objekt durch den Aufruf
   von Configure(data) wieder gesetzt. Das Configure MUSS genau die Daten, die
   es im alten Objekt zurueckliefert, wieder akzeptieren.

RUeCKGABEWERT
-------------
::

   Wenn <data>==0:
     Alle individuellen Daten in einer beliebigen Form. Ein Mapping bietet
     sich jedoch an.
     Nicht erlaubt sind: Objekte und Closures.

   Wenn <data>!=0:
     1, wenn die Daten zur Konfiguration akzeptiert wurden.
     0, sonst.

BEMERKUNGEN
-----------
::

   Configure() ist nicht verpflichtet, erneut Daten zu akzeptieren, wenn es
   bereits einmal mit gueltigen Daten aufgerufen wurde.
   Das Zurueckschreiben der Daten kann auch nach Ablauf laengerer Zeit
   und/oder in einer anderen Uptime erfolgen.

BEISPIELE
---------
::

   Ein Objekt, welches ein anderes Objekt sicher ersetzt, d.h. die
   individuelle Konfiguration bleibt erhalten:
   mixed data;
   if (call_resolved(data,ob,"Configure",0) == 1) {
     string obname = load_name(ob);
     ob->remove();
     ob = clone_object(obname);
     if (data) {
       if (ob->Configure(data) == 1) {
         printf("Instanz von %s erfolgreich ersetzt, neues Objekt: %O\n",
             obname,ob);
       }
       else {
         raise_error(sprintf("Configure() in %O akzeptierte Daten nicht!\n",
             ob));
       }
     }
   }
   else {
     printf(break_string(
         "Das Objekt %O definiert keine Funktion Configure(). Es kann "
         "nicht sicher ersetzt werden, da unbekannt ist, ob es individuelle "
         "Daten enthaelt.",78));
   }

LETZTE AeNDERUNG
----------------
::

26.09.2011, Zesstra

