From 6c990924a2b5a92d03587cf758d89fea8092a297 Mon Sep 17 00:00:00 2001 From: core Date: Sat, 6 Jan 2024 20:40:31 -0500 Subject: [PATCH] saving infrastructure --- server/src/main.rs | 13 +++++++- server/src/packet.rs | 2 +- .../src/components/Chatbox.svelte | 18 +++++++++++ starkingdoms-client/src/globals.ts | 3 ++ starkingdoms-client/src/hub.ts | 30 ++++++++++++++++++- starkingdoms-client/src/protocol.ts | 2 +- 6 files changed, 64 insertions(+), 4 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index fb41d0addb9f691eb007a9108f3d542f2ebaefdb..afe87fbb8e9f7d1ca579c0469b4db59caee91ede 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -26,7 +26,7 @@ use component::Input; use component::*; use packet::*; use rand::Rng; -use starkingdoms_common::unpack_savefile; +use starkingdoms_common::{pack_savefile, unpack_savefile, SaveData}; use std::f32::consts::PI; pub mod component; @@ -865,6 +865,17 @@ fn on_message( } } } + Packet::RequestSave {} => { + // HEY! GHOSTLY! PLEASE FILL THIS STRUCT WITH DATA! + // THANKS! + let save = SaveData {}; + let save_string = pack_savefile(&app_keys.app_key, save); + let packet = Packet::SaveData { + payload: save_string, + }; + let buf = serde_json::to_vec(&packet).unwrap(); + event_queue.push(ServerEvent::Broadcast(MessageType::Text, buf)); + } _ => continue, } } diff --git a/server/src/packet.rs b/server/src/packet.rs index cc30c3906be6c27053d89f62a2e388f292814443..534fe15880a685950d742def2f3af59c8dfebda3 100644 --- a/server/src/packet.rs +++ b/server/src/packet.rs @@ -117,6 +117,6 @@ pub enum Packet { eligible: bool, }, SaveData { - payload: Vec, + payload: String, }, } diff --git a/starkingdoms-client/src/components/Chatbox.svelte b/starkingdoms-client/src/components/Chatbox.svelte index 2c43a28bf4f30b1b31bded91305ea510098ac44e..84cd1aac5ba517266aa664a8f5bff933b4b9fc35 100644 --- a/starkingdoms-client/src/components/Chatbox.svelte +++ b/starkingdoms-client/src/components/Chatbox.svelte @@ -48,6 +48,24 @@ sendPacket(global.client!, chat_packet); addMessage("direct-message", `you -> ${target}: ${message}`); + } else if (value.startsWith(".save")) { + value = ""; + addMessage( + "server-message", + "[Save][1/3] Requesting save from the server...", + ); + if (!global.saveEligible) { + addMessage( + "server-error", + "[Save] Not eligible to save, please get closer to a planet", + ); + return; + } + let req_packet: Packet = { + t: PacketType.RequestSave, + c: {}, + }; + sendPacket(global.client!, req_packet); } else { let chat_packet: Packet = { t: PacketType.SendMessage, diff --git a/starkingdoms-client/src/globals.ts b/starkingdoms-client/src/globals.ts index 59fcbf0da99ad3b87226cc32960f4135cfda741b..78308ea57cbcff0a67579e2d47cc8341ff44ac75 100644 --- a/starkingdoms-client/src/globals.ts +++ b/starkingdoms-client/src/globals.ts @@ -19,6 +19,8 @@ export interface GlobalData { right: boolean; rendering: GlobalRendering | null; + + saveEligible: boolean; } export interface GlobalRendering { @@ -45,6 +47,7 @@ export const global: GlobalData = { left: false, right: false, rendering: null, + saveEligible: true, }; export function player(): Part | undefined { diff --git a/starkingdoms-client/src/hub.ts b/starkingdoms-client/src/hub.ts index ff0a254fc0d5d6d548e0a56bedeee0b7e0718963..a5adbcd3c37ce0556bfb7503387ee08b66579dbf 100644 --- a/starkingdoms-client/src/hub.ts +++ b/starkingdoms-client/src/hub.ts @@ -7,6 +7,8 @@ import type { PlanetPositionsPacket, PlayerLeavePacket, PlayerListPacket, + SaveDataPacket, + SaveEligibilityPacket, SpawnPartPacket, SpawnPlayerPacket, } from "./protocol.ts"; @@ -56,7 +58,7 @@ export async function hub_connect( t: PacketType.ClientLogin, c: { username, - save: null, + save: window.localStorage.getItem("save"), }, }; sendPacket(client, packet); @@ -258,6 +260,32 @@ export async function hub_connect( } else { chatbox.addMessage("server-error", `${p.content}`); } + } else if (packet.t == PacketType.SaveEligibility) { + let p = packet.c; + chatbox.addMessage( + "server-message", + p.eligible + ? "Eligible to save. Run the .save command to save your progress!" + : "No longer eligible to save.", + ); + global.saveEligible = p.eligible; + } else if (packet.t == PacketType.SaveData) { + let p = packet.c; + // request save + // receive save data from server + // upload save file to storage + // done + chatbox.addMessage( + "server-message", + "[Save][2/3] Received save data from server!", + ); + logger(`save file received save=${p.payload}`); + chatbox.addMessage( + "server-message", + "[Save][3/3] Uploading save file to storage...", + ); + window.localStorage.setItem("save", p.payload); + chatbox.addMessage("server-message", "[Save] Game saved successfully!"); } else { logger(`unrecognized packet type ${packet.t}`); } diff --git a/starkingdoms-client/src/protocol.ts b/starkingdoms-client/src/protocol.ts index c158df1c6a1ef0b257d9ff770cab9ad4c9dd035d..66a79b3d4d1630675f87bd6e1724537368ce872b 100644 --- a/starkingdoms-client/src/protocol.ts +++ b/starkingdoms-client/src/protocol.ts @@ -88,7 +88,7 @@ export interface SaveEligibilityPacket { eligible: boolean; } export interface SaveDataPacket { - payload: Buffer; + payload: string; } export enum PacketType {