blob: 32b433d8a89cca69333a9c1d0b49bf9cd99ae6f0 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001NAME:
2 P_AUTOLOADOBJ "autoloadobj"
3
4DEFINIERT IN:
5 /sys/player/base.h
6
7BESCHREIBUNG:
8 Hiermit kann prinzipiell angegeben werden ob ein Objekt ueber das
9 Ausloggen eines Spielers (Reboot/ende) behalten werden soll.
10
11 Als Inhalt der Property koennen permanente Eigenschaften des Objektes
12 angegeben werden.
13 Beim Einloggen wird das Objekt neu erzeugt und P_AUTOLOADOBJ auf die
14 gespeicherten Werte gesetzt. Die Werte muessen allerdings selbst
15 verwaltet werden.
16
17 Bitte geht nicht davon aus, dass es waehrend des Setzens/Abfragens dieser
18 Prop einen this_player() oder ein this_interactive() geben muss.
19 Speziell ist this_interactive() nicht == /secure/login!
20 Ebenfalls muss das Objekt beim Setzen/Abfragen nicht in einem Spieler
21 sein.
22
23BEMERKUNGEN:
24 Autoloadobjekte werden beim Ausloggen nicht fallengelassen!
25
26BEISPIELE:
27 ## Variante 1: simples Objekt, bleibt einfach nur erhalten,
28 ## Variablen werden nicht gesichert ##
29 void create() {
30 ...
31 SetProp(P_AUTOLOADOBJ,1);
32 ...
33 }
34
35
36 ## Variante 2: Speicherung mehrerer Variablen ueber
37 ## P_AUTOLOADOBJ (elegante Verwaltung)
38
39 // ein paar #defines fuer die Plaetze in der Speichervariablen
40 #define MY_AL_SHORT 0
41 #define MY_AL_ATTRM 1
42 #define MY_AL_OWNER 2
43 #define MY_AL_DESTRUCT 3
44
45 // die Variablen, die erhalten bleiben sollen
46 static object owner;
47 static int destruct_time;
48
49 // diese hier wird gerufen, wenn der Spieler gespeichert wird,
50 // wir packen also alle aktuellen Variablen in eine und geben die
51 // zum Speichern heraus ... wir nehmen hier ein Array (statt
52 // zB eines Mappings), weil das am wenigsten Platz braucht
53 static mixed* _query_autoloadobj() {
54 mixed *ret;
55 ret=allocate(4);
56 ret[MY_AL_SHORT] = QueryProp(P_SHORT); // SHORT merken
57 ret[MY_AL_ATTRM] = QueryProp(P_M_ATTR_MOD); // einen Modifikator merken
58 ret[MY_AL_OWNER] = getuid(owner); // ah, ein Besitzer!
59 ret[MY_AL_DESTRUCT]=destruct_time-time(); // und eine Lebensdauer!
60
61 return ret;
62
63 /*
64 // normalerweise wuerde man das einfach so schreiben:
65 return (({QueryProp(P_SHORT),
66 QueryProp(P_M_ATTR_MOD),
67 getuid(owner),
68 destruct_time-time()}));
69 */
70 }
71
72 // diese hier wird gerufen, wenn das Objekt neu im Spieler
73 // erzeugt wurde (Login), also packen wir das Speicherarray wieder
74 // aus und in alle entsprechenden Variablen
75 static mixed* _set_autoloadobj(mixed *new) {
76 // wenn das Format nicht mit dem oben uebereinstimmt ist was
77 // schiefgelaufen
78 if(pointerp(new) && !owner && sizeof(new)>4 &&
79 (owner=find_player(new[MY_AL_OWNER]))) {
80 // los, zuweisen!
81
82 SetProp(P_SHORT, new[MY_AL_SHORT]);
83 SetProp(P_M_ATTR_MOD, new[MY_AL_ATTRM]);
84 destruct_time= time()+new[MY_AL_DESTRUCT];
85
86 call_out(#'remove,new[3]);
87 } else call_out(#'remove,0);
88
89 return new;
90 }
91
92
93 ## Variante 3: und das gleiche mit Set/Querymethoden ##
94 // Prototypen fuer Set und Query-Methoden -> man Set
95 static mixed *my_query_autoloadobj();
96 static mixed *my_set_autoloadobj(mixed *new);
97
98 void create() {
99 // Binden der Methoden
100 Set(P_AUTOLOADOBJ, #'my_query_autoloadobj, F_QUERY_METHOD);
101 Set(P_AUTOLOADOBJ, #'my_set_autoloadobj, F_SET_METHOD);
102
103 // die werden nur von mir veraendert!
104 Set(P_AUTOLOADOBJ, PROTECTED, F_MODE_AS);
105 ...
106 }
107
108 static mixed *my_query_autoloadobj () {
109 // s.o.
110 }
111
112 static mixed *my_set_autoloadobj (mixed *new) {
113 // s.o.
114 }
115
116SIEHE AUCH:
117 P_AUTOLOAD, SetProp
118
11924.Aug.2006 Gloinson@MG