P_AUTOLOADOBJ
=============

NAME
----
::

    P_AUTOLOADOBJ                 "autoloadobj"

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

    /sys/player/base.h

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

     Hiermit kann prinzipiell angegeben werden ob ein Objekt ueber das
     Ausloggen eines Spielers (Reboot/ende) behalten werden soll.

     Als Inhalt der Property koennen permanente Eigenschaften des Objektes
     angegeben werden.
     Beim Einloggen wird das Objekt neu erzeugt und P_AUTOLOADOBJ auf die
     gespeicherten Werte gesetzt. Die Werte muessen allerdings selbst
     verwaltet werden.

     Bitte geht nicht davon aus, dass es waehrend des Setzens/Abfragens dieser
     Prop einen this_player() oder ein this_interactive() geben muss.
     Speziell ist this_interactive() nicht == /secure/login!
     Ebenfalls muss das Objekt beim Setzen/Abfragen nicht in einem Spieler
     sein.

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

     Autoloadobjekte werden beim Ausloggen nicht fallengelassen!

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

     ## Variante 1: simples Objekt, bleibt einfach nur erhalten,
     ##             Variablen werden nicht gesichert ##
     void create() {
      ...
      SetProp(P_AUTOLOADOBJ,1);
      ...
     }


     ## Variante 2: Speicherung mehrerer Variablen ueber
     ##             P_AUTOLOADOBJ (elegante Verwaltung)

     // ein paar #defines fuer die Plaetze in der Speichervariablen
     #define MY_AL_SHORT    0
     #define MY_AL_ATTRM    1
     #define MY_AL_OWNER    2
     #define MY_AL_DESTRUCT 3

     // die Variablen, die erhalten bleiben sollen
     static object owner;
     static int destruct_time;

     // diese hier wird gerufen, wenn der Spieler gespeichert wird,
     // wir packen also alle aktuellen Variablen in eine und geben die
     // zum Speichern heraus ... wir nehmen hier ein Array (statt
     // zB eines Mappings), weil das am wenigsten Platz braucht
     static mixed* _query_autoloadobj() {
      mixed *ret;
      ret=allocate(4);
      ret[MY_AL_SHORT] = QueryProp(P_SHORT);      // SHORT merken
      ret[MY_AL_ATTRM] = QueryProp(P_M_ATTR_MOD); // einen Modifikator merken
      ret[MY_AL_OWNER] = getuid(owner);           // ah, ein Besitzer!
      ret[MY_AL_DESTRUCT]=destruct_time-time();   // und eine Lebensdauer!

      return ret;

      /*
      // normalerweise wuerde man das einfach so schreiben:
      return (({QueryProp(P_SHORT),
                QueryProp(P_M_ATTR_MOD),
                getuid(owner),
                destruct_time-time()}));
      */
     }

     // diese hier wird gerufen, wenn das Objekt neu im Spieler
     // erzeugt wurde (Login), also packen wir das Speicherarray wieder
     // aus und in alle entsprechenden Variablen
     static mixed* _set_autoloadobj(mixed *new) {
      // wenn das Format nicht mit dem oben uebereinstimmt ist was
      // schiefgelaufen
      if(pointerp(new) && !owner && sizeof(new)>4 &&
         (owner=find_player(new[MY_AL_OWNER]))) {
       // los, zuweisen!

       SetProp(P_SHORT,      new[MY_AL_SHORT]);
       SetProp(P_M_ATTR_MOD, new[MY_AL_ATTRM]);
       destruct_time=        time()+new[MY_AL_DESTRUCT];

       call_out(#'remove,new[3]);
      } else call_out(#'remove,0);

      return new;
     }


     ## Variante 3: und das gleiche mit Set/Querymethoden ##
     // Prototypen fuer Set und Query-Methoden -> man Set
     static mixed *my_query_autoloadobj();
     static mixed *my_set_autoloadobj(mixed *new);

     void create() {
      // Binden der Methoden
      Set(P_AUTOLOADOBJ, #'my_query_autoloadobj, F_QUERY_METHOD);
      Set(P_AUTOLOADOBJ, #'my_set_autoloadobj, F_SET_METHOD);

      // die werden nur von mir veraendert!
      Set(P_AUTOLOADOBJ, PROTECTED, F_MODE_AS);
      ...
     }

     static mixed *my_query_autoloadobj () {
       // s.o.
     }

     static mixed *my_set_autoloadobj (mixed *new) {
       // s.o.
     }

SIEHE AUCH
----------
::

     P_AUTOLOAD, SetProp

24.Aug.2006 Gloinson@MG

