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 | |
| 11 | mapping vaults = ([]); |
| 12 | |
| 13 | protected void create() |
| 14 | { |
| 15 | // TODO: Speichern in MEMORY |
| 16 | } |
| 17 | |
| 18 | // Einlagern von Vaults durch Spieler |
| 19 | public 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. |
| 30 | public 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. |
| 47 | public 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) |
| 68 | public 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 | |
| 91 | public 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 | |