~starkingdoms/starkingdoms

d396b7b9c26b16d84fd9092b55a57e30ea2a2572 — ghostlyzsh 2 years ago f1f940a
server sends SpawnPlayer packet
3 files changed, 81 insertions(+), 4 deletions(-)

M server/Cargo.toml
A server/src/macros.rs
M server/src/main.rs
M server/Cargo.toml => server/Cargo.toml +1 -1
@@ 8,4 8,4 @@ bevy = { version = "0.12", default-features = false }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
bevy_twite = { git = "https://gitlab.com/ghostlyzsh/twite.git" }
tracing-subscriber = "0.3"
\ No newline at end of file
tracing-subscriber = "0.3"

A server/src/macros.rs => server/src/macros.rs +18 -0
@@ 0,0 1,18 @@
#[macro_export]
macro_rules! err_or_cont {
    ($expr:expr) => {
        match $expr {
            Ok(n) => n,
            Err(_) => continue
        }
    };
}
#[macro_export]
macro_rules! some_or_cont {
    ($expr:expr) => {
        match $expr {
            Some(n) => n,
            None => continue
        }
    };
}

M server/src/main.rs => server/src/main.rs +62 -3
@@ 6,6 6,7 @@ use packet::*;

pub mod component;
pub mod packet;
pub mod macros;

fn main() {
    let subscriber = tracing_subscriber::FmtSubscriber::new();


@@ 20,7 21,8 @@ fn main() {
        .add_plugins(MinimalPlugins)
        .add_plugins(TwiteServerPlugin)
        .add_systems(Startup, spawn_planets)
        .add_systems(Update, on_connection)
        //.add_systems(Update, on_connection)
        .add_systems(Update, on_message)
        .add_systems(FixedUpdate, on_position_change)
        .run();



@@ 36,7 38,7 @@ fn spawn_planets(mut commands: Commands) {
    });
}

fn on_connection(
/*fn on_connection(
    mut commands: Commands,
    planet_query: Query<(Entity, &PlanetType, &Transform)>,
    mut reader: Local<ManualEventReader<ServerEvent>>,


@@ 68,13 70,70 @@ fn on_connection(

            let packet = Packet::PlanetPositions { planets };
            let buf = serde_json::to_vec(&packet).unwrap();

            packets.push(ServerEvent::Send(*addr, MessageType::Text, buf));
        }
    }
    for packet in packets {
        events.send(packet);
    }
}*/

fn on_message(
    mut commands: Commands,
    planet_query: Query<(Entity, &PlanetType, &Transform)>,
    mut packet_recv: Local<ManualEventReader<ServerEvent>>,
    mut packet_send: ResMut<Events<ServerEvent>>,
) {
    let mut packets = Vec::new();
    for ev in packet_recv.read(&packet_send) {
        if let ServerEvent::Recv(addr, MessageType::Text, data) = ev {
            let data = String::from_utf8_lossy(&data);
            let json: serde_json::Value = err_or_cont!(serde_json::from_str(&data));
            let packet_type = json["t"].clone();
            let data = json["c"].clone();
            let packet_type = some_or_cont!(packet_type.as_str());
            match packet_type {
                "ClientLogin" => {
                    // spawn player
                    let transform = Transform::from_xyz(0.0, 0.0, 0.0);
                    let id = commands
                        .spawn(PlayerBundle {
                            part: PartBundle {
                                part_type: PartType::Hearty,
                                transform: TransformBundle::from(transform),
                            },
                            addr: Player(*addr),
                        }).id().index();
                    // tell other clients that a player has spawned
                    let username = data["username"].clone();
                    let username = some_or_cont!(username.as_str());
                    let packet = Packet::SpawnPlayer {
                        id,
                        username: username.to_string(),
                        position: proto_transform!(transform),
                    };
                    let buf = serde_json::to_vec(&packet).unwrap();
                    packets.push(ServerEvent::Broadcast(MessageType::Text, buf));

                    // tell this player the planets
                    let mut planets = Vec::new();
                    for (entity, planet_type, transform) in planet_query.iter() {
                        planets.push((entity.index(), Planet {
                            planet_type: *planet_type,
                            transform: proto_transform!(transform)
                        }));
                    }
                    let packet = Packet::PlanetPositions { planets };
                    let buf = serde_json::to_vec(&packet).unwrap();
                    packets.push(ServerEvent::Send(*addr, MessageType::Text, buf));
                }
                _ => continue
            };
        }
    }
    for packet in packets {
        packet_send.send(packet);
    }
}

fn on_position_change(