use crate::components::{ Camera, Chat, Menu, OtherPlayerBundle, Part, PartBundle, Planet, PlanetBundle, Player, PlayerResources, PlayerUsername, ServerId, Texture, Transform }; use bevy_ecs::prelude::*; use nalgebra::{Rotation2, Scale3, Translation3}; use starkingdoms_common::packet::{ DespawnPartPacket, EnergyUpdatePacket, LoginResponsePacket, MessagePacket, OpenCraftingUiPacket, PartPositionsPacket, PlanetPositionsPacket, PlayerLeavePacket, PlayerListPacket, SpawnPartPacket, SpawnPlanetPacket, SpawnPlayerPacket }; use starkingdoms_common::PartType; use super::{part_texture_name, planet_texture_name}; pub fn handle_login_response( mut reader: EventReader, player: Query>, mut commands: Commands, ) { for packet in reader.read() { let player = player.single(); commands.entity(player).insert(ServerId(packet.id)); } } pub fn handle_message(mut reader: EventReader, mut chat: ResMut) { for message in reader.read() { chat.messages .push(format!("{}: {}", message.actor, message.content)); } } pub fn handle_existing_players_list( mut reader: EventReader, mut commands: Commands, ) { for packet in reader.read() { for (server_id, username) in &packet.players { commands.spawn(OtherPlayerBundle { part: PartBundle { transform: Transform { translation: Translation3::new(0.0, 0.0, 0.0), rotation: Rotation2::new(0.0), scale: Scale3::new(25.0, 25.0, 1.0), }, texture: Texture { name: "hearty.svg".to_string(), }, server_id: ServerId(*server_id), part: Part(false), }, username: PlayerUsername { username: username.clone(), }, }); } } } pub fn handle_spawn_player(mut reader: EventReader, mut commands: Commands) { for SpawnPlayerPacket { id: server_id, username, } in reader.read() { commands.spawn(OtherPlayerBundle { part: PartBundle { transform: Transform { translation: Translation3::new(0.0, 0.0, 0.0), rotation: Rotation2::new(0.0), scale: Scale3::new(25.0, 25.0, 1.0), }, texture: Texture { name: "hearty.svg".to_string(), }, server_id: ServerId(*server_id), part: Part(false), }, username: PlayerUsername { username: username.clone(), }, }); } } pub fn handle_spawn_part(mut reader: EventReader, mut commands: Commands) { for SpawnPartPacket { id: server_id, part, } in reader.read() { commands.spawn(PartBundle { transform: Transform { translation: Translation3::new(part.transform.x, part.transform.y, 0.0), rotation: Rotation2::new(part.transform.rot), scale: Scale3::new(25.0, 25.0, 1.0), }, texture: Texture { name: part_texture_name(part.part_type, part.flags.attached), }, server_id: ServerId(*server_id), part: Part(part.flags.attached), }); } } pub fn handle_part_positions( mut reader: EventReader, mut parts_query: Query<(Entity, &ServerId, &mut Transform, &mut Texture, &mut Part)>, player: Query<&ServerId, With>, mut camera: ResMut, ) { for PartPositionsPacket { parts } in reader.read() { for (this_id, part) in parts { for (_, server_id, mut transform, mut texture, mut bevy_part) in &mut parts_query { if *this_id == server_id.0 { transform.translation.x = part.transform.x; transform.translation.y = part.transform.y; transform.rotation = Rotation2::new(part.transform.rot); if part.flags.attached && !bevy_part.0 { texture.name = part_texture_name(part.part_type, part.flags.attached); bevy_part.0 = true; } else if !part.flags.attached && bevy_part.0 { texture.name = part_texture_name(part.part_type, part.flags.attached); bevy_part.0 = false; } } if part.part_type == PartType::Hearty { let player_id = player.single(); if player_id.0 == server_id.0 { camera.x = -part.transform.x; camera.y = -part.transform.y; } } } } } } pub fn handle_spawn_planet( mut reader: EventReader, mut commands: Commands, ) { for SpawnPlanetPacket { id, planet, radius } in reader.read() { commands.spawn(PlanetBundle { transform: Transform { translation: Translation3::new(planet.transform.x, planet.transform.y, 0.0), rotation: Rotation2::new(0.0), scale: Scale3::new(*radius, *radius, 1.0), }, texture: Texture { name: planet_texture_name(planet.planet_type) }, server_id: ServerId(*id), planet: Planet, }); } } pub fn handle_planet_positions( mut reader: EventReader ) { for PlanetPositionsPacket { planets } in reader.read() { // TODO: do something } } pub fn handle_energy_update( mut reader: EventReader, mut player_res: ResMut, ) { for EnergyUpdatePacket { amount, max } in reader.read() { player_res.fuel_amount = *amount; player_res.fuel_max = *max; } } pub fn handle_crafting_ui( mut reader: EventReader, entities: Query<(Entity, &ServerId)>, mut commands: Commands, ) { for OpenCraftingUiPacket { id } in reader.read() { for (entity, server_id) in &entities { if server_id.0 == *id { commands.entity(entity).insert(Menu); } } } } pub fn handle_player_leave( mut reader: EventReader, mut part_query: Query<(Entity, &ServerId), With>, mut commands: Commands, ) { for PlayerLeavePacket { id } in reader.read() { for (entity, server_id) in &mut part_query { if server_id.0 == *id { commands.entity(entity).despawn(); } } } } pub fn handle_despawn_part( mut reader: EventReader, mut part_query: Query<(Entity, &ServerId), With>, mut commands: Commands, ) { for DespawnPartPacket { id } in reader.read() { for (entity, server_id) in &mut part_query { if server_id.0 == *id { commands.entity(entity).despawn(); } } } }