| 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 |