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