blob: f6f058442232c9064c0f5ba4d0336c17008af9aa [file] [log] [blame]
Zesstra8b5320e2022-02-18 21:10:26 +01001// The Manager Kobold who supervises storage of the comm vaults for players
2//
3// no retrieval of messages by this object. Player objects retrieve their LWO
4// (Kobold-Vault) from here. The Vaults only release messages to their
5// corresponding player object
6
7#pragma strict_types,rtt_checks
8
9#include "/sys/player/comm.h"
10
Zesstra7459f252022-02-23 22:47:26 +010011/** vaults ist ein mapping, welches alle vaults enthaelt.
12 *
13 * Struktur: UID als Schluessel (string) und Vault (lwobject) als
14 * Wert.
15*/
16private nosave mapping vaults = ([]);
17
18#define MEMORY "/secure/memory"
19#ifndef DEBUG
20#define DEBUG(x) if (find_player("zesstra"))\
21 tell_object(find_player("zesstra"),\
22 "kobold: "+x+"\n")
23#endif
Zesstra8b5320e2022-02-18 21:10:26 +010024
25protected void create()
26{
Zesstra7459f252022-02-23 22:47:26 +010027 seteuid(getuid());
28 mixed tmp = ({mapping})MEMORY->Load("Kobold");
29 if (mappingp(tmp)) {
30 vaults = tmp;
31 DEBUG("Daten aus MEMORY geladen.\n");
32 }
33 else {
34 DEBUG("Keine Daten in MEMORY vorhanden - reinitialisiere.\n");
35 if (({int})MEMORY->Save("Kobold", vaults) != 1)
36 raise_error("Konnte Daten nicht im Memory ablegen.\n");
37 }
Zesstra8b5320e2022-02-18 21:10:26 +010038}
39
40// Einlagern von Vaults durch Spieler
41public int DepositVault(lwobject "/std/player/comm_vault" vault)
42{
43 if (query_once_interactive(previous_object())) {
44 vaults[getuid(previous_object())] = vault;
45 return 1;
46 }
47 return 0;
48}
49
50// Abrufen eines Pointers auf den Vault eines Spielers
51// Natuerlich *nur* durch den Spieler mit der richtigen UUID selber.
52public lwobject "/std/player/comm_vault" RetrieveVault()
53{
54 if (query_once_interactive(previous_object()))
55 {
56 lwobject "/std/player/comm_vault" vault = vaults[getuid(previous_object())];
57 // Und noch pruefen, ob auch die UUID uebereinstimmt - es soll kein
58 // neu angelegter Spieler das Vault von einem aelteren bekommen.
59 if (vault &&
60 ({string})vault.uuid() == getuuid(previous_object()))
61 return vault;
62 }
63 return 0;
64}
65
66// Pointer auf nen Vault vergessen.
Zesstra7459f252022-02-23 22:47:26 +010067// Im Erfolgsfall wird das Vault zurueckgeben, was wir nicht mehr speichern
Zesstra8b5320e2022-02-18 21:10:26 +010068// Aufruf *nur* durch den Spieler mit der richtigen UUID selber.
69public lwobject "/std/player/comm_vault" ForgetVault()
70{
71 if (query_once_interactive(previous_object()))
72 {
73 lwobject "/std/player/comm_vault" vault = vaults[getuid(previous_object())];
74 // Und noch pruefen, ob auch die UUID uebereinstimmt - es soll kein
75 // neu angelegter Spieler das Vault von einem aelteren bekommen.
Zesstra7459f252022-02-23 22:47:26 +010076 if (vault &&
77 ({string})vault.uuid() == getuuid(previous_object()))
Zesstra8b5320e2022-02-18 21:10:26 +010078 {
79 m_delete(vaults, getuid(previous_object()));
80 return vault;
81 }
82 }
83 return 0;
84}
85
86// Prueft, ob es ein Vault fuer Spieler gibt, deren UID mit <pluid> beginnen.
87// gibt im Erfolgsfall die vollstaendige UID zurueck.
88// 0, wenn keine gefunden
89// -1 wenn es mehrere in Frage kommende UIDs gibt.
90// (match_living()-inspiriert)
91public string|int find_player(string pluid)
92{
93 string uid;
94 if (pluid in vaults)
95 return pluid; // das war einfach...
96 else
97 {
98 // Wir muessen leider alle Vaults absuchen
99 foreach(string u : vaults) {
100 if (strstr(u, pluid) == 0)
101 {
102 // wenn pluid nicht eindeutig ist und mehrere UIDs in Frage
103 // kommen, wird -1 zurueckgeben.
104 if (!uid)
105 uid = u;
106 else
107 return -1;
108 }
109 }
110 }
111 return uid;
112}
113
114public varargs int DepositMsg(string pluid, string msg, int msg_type,
115 string msg_action, string msg_prefix,
116 object origin = previous_object())
117{
118 if (!query_once_interactive(previous_object()))
119 return MSG_FAILED;
120 lwobject "/std/player/comm_vault" vault = vaults[pluid];
121 if (!vault)
122 return MSG_FAILED;
123
124 return ({int})vault.store_msg(msg, msg_type, msg_action, msg_prefix, origin);
125}
126