blob: 37f7c947556340ce6ff539f594648d6442cb0adb [file] [log] [blame]
Zesstrac7419e22020-01-05 20:56:28 +01001// Dieses Ding kann ein Spieler-Savefile laden, um dort Daten via
2// Query/QueryProp abzufragen. Sollte das Spielerobjekt existieren, wird
3// stattdessen dort gefragt.
4
5// Das Objekt hier bekommt aufgrund des Speicherortes (/secure/) die UID ROOT
6// und darf folglich alles lesen.
7
8// Spielerladen duerfen aber nur Objekte, welche die gleiche UID wie dieses
9// Objekt (damit also in diesem Fall ROOT) haben.
10// Daten abfragen darf nur das Objekt, welches den Spieler auch geladen hat.
11// Damit ist sichergestellt, dass nur ROOT-Objekt ueber *dieses* Objekt (was
12// ja ueberall lesen kann) Daten abfragen koennen.
13
14#pragma no_shadow
15#pragma strong_types,save_types,rtt_checks
16
17#include <config.h>
18#include <wizlevels.h>
19
20inherit "/std/thing/properties";
21
22object|string pl;
23object user;
24
25protected void create()
26{
27 ::create();
28 seteuid(getuid());
29 set_next_reset(300);
30}
31
32public int ReleasePlayer()
33{
34 pl = 0;
35 user = 0;
36 return 1;
37}
38
39public int LoadPlayer(string name)
40{
41 // Es duerfen nur Objekte mit der gleichen UID wie wir diesen Clone
42 // benutzen! Ansonsten koennten z.B. nicht-ROOT-Objekte einen von einem
43 // ROOT-Objekt erzeugten Clone hiervon nutzen und alles lesen...
44 if (!previous_object()
45 || getuid(previous_object()) != getuid(this_object()))
46 return 0;
47 if (query_wiz_level(getuid(previous_object())) < WIZARD_LVL)
48 return 0;
49
Zesstrad800f422020-01-21 21:16:27 +010050 if (!master()->find_userinfo(name))
Zesstrac7419e22020-01-05 20:56:28 +010051 return 0;
Zesstrad800f422020-01-21 21:16:27 +010052
Zesstrac7419e22020-01-05 20:56:28 +010053 // Wenn es das Spielerobjekt gibt, ist alles gut, dann fragen wir einfach
54 // das.
55 pl = find_player(name) || find_netdead(name);
56 if (!pl)
57 {
58 // wenn nicht: Savefile einlesen.
59 restore_object(SAVEPATH + name[0..0] + "/" + name);
60 pl = name;
61 }
62 user = previous_object();
63 set_next_reset(300);
64 return 1;
65}
66
67public varargs mixed Query( string name, int Type )
68{
69 if (!user || user != previous_object())
70 return 0;
71
72 if (objectp(pl))
73 return pl->Query(name,Type);
74 else if (stringp(pl))
75 return ::Query(name, Type);
76 return 0;
77}
78
79public varargs mixed QueryProp( string name )
80{
81 if (!user || user != previous_object())
82 return 0;
83
84 if (objectp(pl))
85 return pl->QueryProp(name);
86 else if (stringp(pl))
87 return ::QueryProp(name);
88 return 0;
89}
90
91
92// kein Schreibzugriff
93public varargs mixed Set( string name, mixed Value, int Type, int extern )
94{
95 return 0;
96}
97
98public void reset()
99{
100 if (clonep(this_object()))
101 destruct(this_object());
102}
103
104public int clean_up(int ref)
105{
106 if (clonep(this_object())
107 || ref <= 1 )
108 {
109 destruct(this_object());
110 }
111 return 1;
112}
113