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