Zesstra | 8b5320e | 2022-02-18 21:10:26 +0100 | [diff] [blame] | 1 | // 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 | |
Zesstra | 7459f25 | 2022-02-23 22:47:26 +0100 | [diff] [blame] | 11 | /** vaults ist ein mapping, welches alle vaults enthaelt. |
| 12 | * |
| 13 | * Struktur: UID als Schluessel (string) und Vault (lwobject) als |
| 14 | * Wert. |
| 15 | */ |
| 16 | private 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 |
Zesstra | 8b5320e | 2022-02-18 21:10:26 +0100 | [diff] [blame] | 24 | |
| 25 | protected void create() |
| 26 | { |
Zesstra | 7459f25 | 2022-02-23 22:47:26 +0100 | [diff] [blame] | 27 | 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 | } |
Zesstra | 8b5320e | 2022-02-18 21:10:26 +0100 | [diff] [blame] | 38 | } |
| 39 | |
| 40 | // Einlagern von Vaults durch Spieler |
| 41 | public 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. |
| 52 | public 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. |
Zesstra | 7459f25 | 2022-02-23 22:47:26 +0100 | [diff] [blame] | 67 | // Im Erfolgsfall wird das Vault zurueckgeben, was wir nicht mehr speichern |
Zesstra | 8b5320e | 2022-02-18 21:10:26 +0100 | [diff] [blame] | 68 | // Aufruf *nur* durch den Spieler mit der richtigen UUID selber. |
| 69 | public 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. |
Zesstra | 7459f25 | 2022-02-23 22:47:26 +0100 | [diff] [blame] | 76 | if (vault && |
| 77 | ({string})vault.uuid() == getuuid(previous_object())) |
Zesstra | 8b5320e | 2022-02-18 21:10:26 +0100 | [diff] [blame] | 78 | { |
| 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) |
| 91 | public 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 | |
| 114 | public 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 | |