M server/src/main.rs => server/src/main.rs +12 -1
@@ 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,
}
}
M server/src/packet.rs => server/src/packet.rs +1 -1
@@ 117,6 117,6 @@ pub enum Packet {
eligible: bool,
},
SaveData {
- payload: Vec<u8>,
+ payload: String,
},
}
M starkingdoms-client/src/components/Chatbox.svelte => starkingdoms-client/src/components/Chatbox.svelte +18 -0
@@ 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,
M starkingdoms-client/src/globals.ts => starkingdoms-client/src/globals.ts +3 -0
@@ 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 {
M starkingdoms-client/src/hub.ts => starkingdoms-client/src/hub.ts +29 -1
@@ 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 = <SaveEligibilityPacket>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 = <SaveDataPacket>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}`);
}
M starkingdoms-client/src/protocol.ts => starkingdoms-client/src/protocol.ts +1 -1
@@ 88,7 88,7 @@ export interface SaveEligibilityPacket {
eligible: boolean;
}
export interface SaveDataPacket {
- payload: Buffer;
+ payload: string;
}
export enum PacketType {