use std::net::SocketAddr;
use bevy::prelude::*;
use bevy_rapier2d::prelude::Velocity;
use starkingdoms_common::{pack_savefile, packet::Packet, unpack_savefile, SaveData};
use crate::{
module::component::{Attach, CanAttach, LooseAttach, PartFlags, PartType},
planet::PlanetType,
ws::{PacketMessageConvert, WsEvent},
AppKeys,
};
use super::component::Player;
pub fn request_save(
attached_query: &Query<
(
Entity,
&PartType,
&mut Transform,
&mut Attach,
&Velocity,
Option<&CanAttach>,
Option<&LooseAttach>,
&mut PartFlags,
),
(Without<PlanetType>, Without<Player>),
>,
old_save: Option<String>,
app_keys: AppKeys,
attach: Attach,
event_queue: &mut Vec<WsEvent>,
from: &SocketAddr,
) {
let unused_modules = if let Some(ref old_save) = old_save {
if let Ok(old_savedata) = unpack_savefile(&app_keys.app_key, old_save.to_string()) {
old_savedata.unused_modules
} else {
Vec::new()
}
} else {
Vec::new()
};
let save = SaveData {
children: crate::module::save::construct_save_data(attach.clone(), attached_query),
unused_modules,
};
let save_string = pack_savefile(&app_keys.app_key, save);
let packet = Packet::SaveData {
payload: save_string,
};
event_queue.push(WsEvent::Send {
to: *from,
message: packet.into_message(),
});
}