## 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.
}