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