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
