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
