blob: b1be5aa361d082d2dfc4148a9d2d9bd84ec4d2ad [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
11mapping vaults = ([]);
12
13protected void create()
14{
15 // TODO: Speichern in MEMORY
16}
17
18// Einlagern von Vaults durch Spieler
19public int DepositVault(lwobject "/std/player/comm_vault" vault)
20{
21 if (query_once_interactive(previous_object())) {
22 vaults[getuid(previous_object())] = vault;
23 return 1;
24 }
25 return 0;
26}
27
28// Abrufen eines Pointers auf den Vault eines Spielers
29// Natuerlich *nur* durch den Spieler mit der richtigen UUID selber.
30public lwobject "/std/player/comm_vault" RetrieveVault()
31{
32 if (query_once_interactive(previous_object()))
33 {
34 lwobject "/std/player/comm_vault" vault = vaults[getuid(previous_object())];
35 // Und noch pruefen, ob auch die UUID uebereinstimmt - es soll kein
36 // neu angelegter Spieler das Vault von einem aelteren bekommen.
37 if (vault &&
38 ({string})vault.uuid() == getuuid(previous_object()))
39 return vault;
40 }
41 return 0;
42}
43
44// Pointer auf nen Vault vergessen.
45// Im Erfolgsfall wird das Vault zurueckgeben.
46// Aufruf *nur* durch den Spieler mit der richtigen UUID selber.
47public lwobject "/std/player/comm_vault" ForgetVault()
48{
49 if (query_once_interactive(previous_object()))
50 {
51 lwobject "/std/player/comm_vault" vault = vaults[getuid(previous_object())];
52 // Und noch pruefen, ob auch die UUID uebereinstimmt - es soll kein
53 // neu angelegter Spieler das Vault von einem aelteren bekommen.
54 if (({string})vault.uuid() == getuuid(previous_object()))
55 {
56 m_delete(vaults, getuid(previous_object()));
57 return vault;
58 }
59 }
60 return 0;
61}
62
63// Prueft, ob es ein Vault fuer Spieler gibt, deren UID mit <pluid> beginnen.
64// gibt im Erfolgsfall die vollstaendige UID zurueck.
65// 0, wenn keine gefunden
66// -1 wenn es mehrere in Frage kommende UIDs gibt.
67// (match_living()-inspiriert)
68public string|int find_player(string pluid)
69{
70 string uid;
71 if (pluid in vaults)
72 return pluid; // das war einfach...
73 else
74 {
75 // Wir muessen leider alle Vaults absuchen
76 foreach(string u : vaults) {
77 if (strstr(u, pluid) == 0)
78 {
79 // wenn pluid nicht eindeutig ist und mehrere UIDs in Frage
80 // kommen, wird -1 zurueckgeben.
81 if (!uid)
82 uid = u;
83 else
84 return -1;
85 }
86 }
87 }
88 return uid;
89}
90
91public varargs int DepositMsg(string pluid, string msg, int msg_type,
92 string msg_action, string msg_prefix,
93 object origin = previous_object())
94{
95 if (!query_once_interactive(previous_object()))
96 return MSG_FAILED;
97 lwobject "/std/player/comm_vault" vault = vaults[pluid];
98 if (!vault)
99 return MSG_FAILED;
100
101 return ({int})vault.store_msg(msg, msg_type, msg_action, msg_prefix, origin);
102}
103