~starkingdoms/starkingdoms

8dd63f01e9d8b239be1e3fb5f5c52d39b012371a — ghostly_zsh 8 months ago 1736564
planets appear on the client again, also new SpawnPlanet packet
M crates/client/src/components.rs => crates/client/src/components.rs +8 -0
@@ 25,6 25,14 @@ pub struct OtherPlayerBundle {
    pub username: PlayerUsername,
}

#[derive(Bundle)]
pub struct PlanetBundle {
    pub transform: Transform,
    pub texture: Texture,
    pub server_id: ServerId,
    pub planet: Planet,
}

#[derive(ScheduleLabel, Hash, Clone, Debug, Eq, PartialEq)]
pub enum Schedule {
    Startup,

M crates/client/src/lib.rs => crates/client/src/lib.rs +3 -0
@@ 10,6 10,7 @@ use crate::systems::create_hearty;
use bevy_ecs::schedule::Schedule;
use bevy_ecs::{event::Events, world::World};
use components::{Camera, Chat, RecvPacket, SendPacket};
use networking::handlers::{handle_planet_positions, handle_spawn_planet};
use platform::assets::Assets;
use platform::websocket::Ws;
use rendering::assets::AssetLoader;


@@ 79,6 80,8 @@ pub fn start() {
    update_schedule.add_systems(handle_spawn_player);
    update_schedule.add_systems(handle_spawn_part);
    update_schedule.add_systems(handle_part_positions);
    update_schedule.add_systems(handle_spawn_planet);
    update_schedule.add_systems(handle_planet_positions);
    update_schedule.add_systems(handle_energy_update);
    update_schedule.add_systems(handle_crafting_ui);
    update_schedule.add_systems(handle_message);

M crates/client/src/networking/handlers.rs => crates/client/src/networking/handlers.rs +32 -9
@@ 1,17 1,15 @@
use crate::components::{
    Camera, Chat, Menu, OtherPlayerBundle, Part, PartBundle, Player, PlayerResources,
    PlayerUsername, ServerId, Texture, Transform,
    Camera, Chat, Menu, OtherPlayerBundle, Part, PartBundle, Planet, PlanetBundle, Player, PlayerResources, PlayerUsername, ServerId, Texture, Transform
};
use crate::networking::texture_name;
use bevy_ecs::prelude::*;
use nalgebra::{Rotation2, Scale3, Translation3};
use starkingdoms_common::packet::{
    DespawnPartPacket, EnergyUpdatePacket, LoginResponsePacket, MessagePacket,
    OpenCraftingUiPacket, PartPositionsPacket, PlayerLeavePacket, PlayerListPacket,
    SpawnPartPacket, SpawnPlayerPacket,
    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<LoginResponsePacket>,
    player: Query<Entity, With<Player>>,


@@ 96,7 94,7 @@ pub fn handle_spawn_part(mut reader: EventReader<SpawnPartPacket>, mut commands:
                scale: Scale3::new(25.0, 25.0, 1.0),
            },
            texture: Texture {
                name: texture_name(part.part_type, part.flags.attached),
                name: part_texture_name(part.part_type, part.flags.attached),
            },
            server_id: ServerId(*server_id),
            part: Part(part.flags.attached),


@@ 119,10 117,10 @@ pub fn handle_part_positions(
                    transform.rotation = Rotation2::new(part.transform.rot);

                    if part.flags.attached && !bevy_part.0 {
                        texture.name = texture_name(part.part_type, part.flags.attached);
                        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 = texture_name(part.part_type, part.flags.attached);
                        texture.name = part_texture_name(part.part_type, part.flags.attached);
                        bevy_part.0 = false;
                    }
                }


@@ 139,6 137,31 @@ pub fn handle_part_positions(
    }
}

pub fn handle_spawn_planet(
    mut reader: EventReader<SpawnPlanetPacket>,
    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<PlanetPositionsPacket>
) {
    for PlanetPositionsPacket { planets } in reader.read() {
        // TODO: do something
    }
}

pub fn handle_energy_update(
    mut reader: EventReader<EnergyUpdatePacket>,
    mut player_res: ResMut<PlayerResources>,

M crates/client/src/networking/mod.rs => crates/client/src/networking/mod.rs +31 -2
@@ 5,12 5,12 @@ use starkingdoms_common::packet::Packet::{
    DespawnPart, EnergyUpdate, LoginResponse, Message, OpenCraftingUi, PartPositions,
    PlanetPositions, PlayerLeave, PlayerList, SpawnPart, SpawnPlayer,
};
use starkingdoms_common::PartType;
use starkingdoms_common::{PartType, PlanetType};

pub mod handlers;
pub mod websocket;

fn texture_name(part_type: PartType, attached: bool) -> String {
fn part_texture_name(part_type: PartType, attached: bool) -> String {
    use PartType::*;
    if attached {
        match part_type {


@@ 35,6 35,34 @@ fn texture_name(part_type: PartType, attached: bool) -> String {
    }
}

fn planet_texture_name(planet_type: PlanetType) -> String {
    match planet_type {
        /*PlanetType::Sun => "sun.svg",
        PlanetType::Mercury => "mercury.svg",
        PlanetType::Venus => "venus.svg",
        PlanetType::Earth => "earth.svg",
        PlanetType::Moon => "moon.svg",
        PlanetType::Mars => "mars.svg",
        PlanetType::Jupiter => "jupiter.svg",
        PlanetType::Saturn => "saturn.svg",
        PlanetType::Uranus => "uranus.svg",
        PlanetType::Neptune => "neptune.svg",
        PlanetType::Pluto => "pluto.svg",*/
        PlanetType::Sun => "sun.svg",
        PlanetType::Mercury => "moon.svg",
        PlanetType::Venus => "venus.svg",
        PlanetType::Earth => "earth.svg",
        PlanetType::Moon => "moon.svg",
        PlanetType::Mars => "mars.svg",
        PlanetType::Jupiter => "jupiter.svg",
        PlanetType::Saturn => "sun.svg",
        PlanetType::Uranus => "venus.svg",
        PlanetType::Neptune => "mars.svg",
        PlanetType::Pluto => "earth.svg",
    }
    .to_string()
}

pub fn send_event<T: Event>(e: T, world: &mut World) {
    let mut events = world.resource_mut::<Events<T>>();
    events.send(e);


@@ 52,6 80,7 @@ pub fn send_packet_event(packet: Packet, world: &mut World) {
        SpawnPlayer(e) => send_event(e, world),
        PlayerList(e) => send_event(e, world),
        PlanetPositions(e) => send_event(e, world),
        Packet::SpawnPlanet(e) => send_event(e, world),
        PartPositions(e) => send_event(e, world),
        SpawnPart(e) => send_event(e, world),
        DespawnPart(e) => send_event(e, world),

M crates/client/src/rendering/mod.rs => crates/client/src/rendering/mod.rs +4 -3
@@ 6,6 6,7 @@ use bevy_ecs::entity::Entity;
use bevy_ecs::event::Events;
use bevy_ecs::query::With;
use bevy_ecs::world::World;
use glow::HasContext;
#[cfg(not(target_arch = "wasm32"))]
use glutin::surface::{GlSurface, Surface, SwapInterval, WindowSurface};
#[cfg(not(target_arch = "wasm32"))]


@@ 275,13 276,13 @@ impl ApplicationHandler for App {
                let mut camera = self.world.get_resource_mut::<Camera>().unwrap();
                camera.width = size.width;
                camera.height = size.height;
                /*

                unsafe {
                    self.gl
                        .as_ref()
                        .unwrap()
                        .viewport(0, 0, size.width as i32, size.height as i32);
                }*/
                }
            }
            WindowEvent::MouseWheel { delta, .. } => {
                let mut camera = self.world.get_resource_mut::<Camera>().unwrap();


@@ 403,7 404,7 @@ impl ApplicationHandler for App {
        };
        let Some(window) = &self.window else { return };

        let ws = self
        let mut ws = self
            .world
            .get_resource_mut::<Ws>()
            .expect("Failed to get Ws resource");

M crates/common/src/packet.rs => crates/common/src/packet.rs +10 -1
@@ 39,7 39,6 @@ macro_rules! proto_transform {
pub struct Planet {
    pub planet_type: PlanetType,
    pub transform: ProtoTransform,
    pub radius: f32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Part {


@@ 144,6 143,14 @@ pub struct PlanetPositionsPacket {

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))]
pub struct SpawnPlanetPacket {
    pub id: u32,
    pub planet: Planet,
    pub radius: f32,
}

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))]
pub struct PartPositionsPacket {
    pub parts: Vec<(u32, Part)>,
}


@@ 216,6 223,7 @@ pub enum Packet {
    SpawnPlayer(SpawnPlayerPacket),
    PlayerList(PlayerListPacket),
    PlanetPositions(PlanetPositionsPacket),
    SpawnPlanet(SpawnPlanetPacket),
    PartPositions(PartPositionsPacket),
    SpawnPart(SpawnPartPacket),
    DespawnPart(DespawnPartPacket),


@@ 238,6 246,7 @@ pub fn register_packet_events(world: &mut bevy_ecs::prelude::World) {
    bevy_ecs::event::EventRegistry::register_event::<LoginResponsePacket>(world);
    bevy_ecs::event::EventRegistry::register_event::<PlayerListPacket>(world);
    bevy_ecs::event::EventRegistry::register_event::<PlanetPositionsPacket>(world);
    bevy_ecs::event::EventRegistry::register_event::<SpawnPlanetPacket>(world);
    bevy_ecs::event::EventRegistry::register_event::<PartPositionsPacket>(world);
    bevy_ecs::event::EventRegistry::register_event::<SpawnPartPacket>(world);
    bevy_ecs::event::EventRegistry::register_event::<DespawnPartPacket>(world);

M crates/server/src/player/client_login.rs => crates/server/src/player/client_login.rs +11 -13
@@ 18,8 18,7 @@ use jwt::VerifyWithKey;
use rand::Rng;
use sha2::Sha256;
use starkingdoms_common::packet::{
    LoginResponsePacket, MessagePacket, PlanetPositionsPacket, PlayerListPacket, SpawnPartPacket,
    SpawnPlayerPacket,
    LoginResponsePacket, MessagePacket, PlanetPositionsPacket, PlayerListPacket, SpawnPartPacket, SpawnPlanetPacket, SpawnPlayerPacket
};
use starkingdoms_common::{
    packet::{MessageType, Packet, Part, Planet, ProtoPartFlags},


@@ 249,25 248,24 @@ pub fn packet_stream(
        message: packet.into_message(),
    });
    // tell this player the planets
    let mut planets = Vec::new();
    //let mut planets = Vec::new();
    for (entity, planet_type, transform) in planet_query.iter() {
        let translation = transform.translation;
        planets.push((
            entity.index(),
            Planet {
        let packet = Packet::SpawnPlanet(SpawnPlanetPacket {
            id: entity.index(),
            planet: Planet {
                planet_type: planet_type.0,
                transform: proto_transform!(Transform::from_translation(
                    translation * CLIENT_SCALE
                )),
                radius: planet!(*planet_type).size * CLIENT_SCALE,
            },
        ));
            radius: planet!(*planet_type).size * CLIENT_SCALE,
        });
        event_queue.push(WsEvent::Send {
            to: *from,
            message: packet.into_message(),
        });
    }
    let packet = Packet::PlanetPositions(PlanetPositionsPacket { planets });
    event_queue.push(WsEvent::Send {
        to: *from,
        message: packet.into_message(),
    });

    // tell the player already existing users
    let mut players = Vec::new();

M crates/server/src/player/packet.rs => crates/server/src/player/packet.rs +0 -1
@@ 71,7 71,6 @@ pub fn on_position_change(
                transform: proto_transform!(Transform::from_translation(
                    transform.translation * CLIENT_SCALE
                )),
                radius: planet!(*planet_type).size * CLIENT_SCALE,
            },
        ));
    }