MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 2 | P_AUTOLOADOBJ |
| 3 | ************* |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 4 | |
| 5 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 6 | NAME |
| 7 | ==== |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 8 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 9 | P_AUTOLOADOBJ "autoloadobj" |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 10 | |
| 11 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 12 | DEFINIERT IN |
| 13 | ============ |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 14 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 15 | /sys/player/base.h |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 16 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 17 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 18 | BESCHREIBUNG |
| 19 | ============ |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 20 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 21 | Hiermit kann prinzipiell angegeben werden ob ein Objekt ueber das |
| 22 | Ausloggen eines Spielers (Reboot/ende) behalten werden soll. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 23 | |
Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 24 | 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 | |
| 37 | BEMERKUNGEN |
| 38 | =========== |
| 39 | |
| 40 | Autoloadobjekte werden beim Ausloggen nicht fallengelassen! |
| 41 | |
| 42 | |
| 43 | BEISPIELE |
| 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 | |
| 136 | SIEHE AUCH |
| 137 | ========== |
| 138 | |
| 139 | P_AUTOLOAD, SetProp |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 140 | |
| 141 | 24.Aug.2006 Gloinson@MG |