From b204118b828e6ce5cee4db00e0f7dea8584cd12a Mon Sep 17 00:00:00 2001 From: Matthieu Jolimaitre Date: Tue, 19 Nov 2024 02:23:22 +0100 Subject: [PATCH] fix first refresh --- src/common.rs | 8 +++++++ src/lib_client/net.rs | 8 +++++-- src/lib_server/generation.rs | 46 ++++++++++++++++++++++++++++++++++++ src/lib_server/mod.rs | 1 + src/lib_server/net.rs | 30 +++++++++++++++++++---- src/server.rs | 6 +++-- 6 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 src/lib_server/generation.rs diff --git a/src/common.rs b/src/common.rs index 2ad0ee5..fadecbf 100644 --- a/src/common.rs +++ b/src/common.rs @@ -5,6 +5,10 @@ use serde::{Deserialize, Serialize}; pub mod server_msg { use super::*; + #[derive(Debug, Serialize, Deserialize)] + pub struct ServerGreeting; + netify!(ServerGreeting); + #[derive(Debug, Serialize, Deserialize)] pub struct MapUpdates(pub Vec<(IVec2, (char, char))>); netify!(MapUpdates); @@ -13,6 +17,10 @@ pub mod server_msg { pub mod client_msg { use super::*; + #[derive(Debug, Serialize, Deserialize)] + pub struct ClientGreeting; + netify!(ClientGreeting); + #[derive(Debug, Serialize, Deserialize)] pub struct Move(pub IVec2); netify!(Move); diff --git a/src/lib_client/net.rs b/src/lib_client/net.rs index ee9f8d3..e3d5d1e 100644 --- a/src/lib_client/net.rs +++ b/src/lib_client/net.rs @@ -4,10 +4,12 @@ use bevy::{ }; use bevy_eventwork::{ tcp::{NetworkSettings, TcpProvider}, - ConnectionId, EventworkPlugin, EventworkRuntime, Network, NetworkEvent, + AppNetworkMessage, ConnectionId, EventworkPlugin, EventworkRuntime, Network, NetworkEvent, }; use termion::clear; +use crate::common::client_msg::ClientGreeting; + pub struct NetPlugin; impl Plugin for NetPlugin { @@ -17,6 +19,7 @@ impl Plugin for NetPlugin { .insert_resource(NetworkSettings::default()) .add_systems(Update, handle_net_event) .init_resource::() + .listen_for_message::() .add_systems(Startup, do_connect); } } @@ -24,12 +27,13 @@ impl Plugin for NetPlugin { #[derive(Debug, Resource, Default)] pub struct Server(pub Option); -fn handle_net_event(mut events: EventReader, mut server: ResMut) { +fn handle_net_event(mut events: EventReader, mut server: ResMut, net: Res>) { for event in events.read() { match event { NetworkEvent::Connected(connection_id) => { println!("Connected '{connection_id:?}'."); server.0 = Some(*connection_id); + net.send_message(*connection_id, ClientGreeting).ok(); } NetworkEvent::Disconnected(connection_id) => { print!("{}", clear::All); diff --git a/src/lib_server/generation.rs b/src/lib_server/generation.rs new file mode 100644 index 0000000..d423fc4 --- /dev/null +++ b/src/lib_server/generation.rs @@ -0,0 +1,46 @@ +use bevy::{prelude::*, utils::HashSet}; + +use super::physics::Pos; + +pub struct GenerationPlugin; + +impl Plugin for GenerationPlugin { + fn build(&self, app: &mut bevy::prelude::App) { + app.insert_resource(GeneratedRegistry::default()) + // .add_systems(schedule, systems) + ; + } +} + +fn chunk_loading(cmd: &mut Commands, loaders: Query<&Pos, With>, reg: ResMut) { + for pos in &loaders { + chunks_surrounding(&pos.pos()); + } +} + +const CHUNK_WIDTH: i32 = 8; + +fn chunks_surrounding(pos: &IVec2) -> Vec { + todo!() +} + +fn snap(value: i32, increment: i32) -> i32 { + todo!() +} + +#[test] +fn test_snap() { + // assert_eq!(); +} + +#[derive(Debug, Resource, Default)] +pub struct GeneratedRegistry(HashSet); + +#[derive(Debug, Component)] +pub struct Loader; + +#[derive(Debug, Component)] +pub struct Generated; + +#[derive(Debug, Component)] +pub struct Chunk(IVec2); diff --git a/src/lib_server/mod.rs b/src/lib_server/mod.rs index a59d3b2..180bb25 100644 --- a/src/lib_server/mod.rs +++ b/src/lib_server/mod.rs @@ -1,5 +1,6 @@ pub mod counter; pub mod display; +pub mod generation; pub mod map; pub mod metrics; pub mod net; diff --git a/src/lib_server/net.rs b/src/lib_server/net.rs index c0e056c..832b43a 100644 --- a/src/lib_server/net.rs +++ b/src/lib_server/net.rs @@ -4,12 +4,15 @@ use bevy::{ }; use bevy_eventwork::{ tcp::{NetworkSettings, TcpProvider}, - EventworkPlugin, EventworkRuntime, Network, NetworkEvent, + AppNetworkMessage, EventworkPlugin, EventworkRuntime, Network, NetworkData, NetworkEvent, }; -use crate::lib_server::player::{remove_player, spawn_player}; +use crate::{ + common::{client_msg::ClientGreeting, server_msg::ServerGreeting}, + lib_server::player::{remove_player, spawn_player}, +}; -use super::{display::RenderUpdate, player::Player}; +use super::{display::RenderUpdate, physics::Pos, player::Player}; pub struct NetPlugin; @@ -19,7 +22,9 @@ impl Plugin for NetPlugin { .insert_resource(EventworkRuntime(TaskPoolBuilder::new().num_threads(2).build())) .insert_resource(NetworkSettings::default()) .add_systems(Update, handle_net_event) - .add_systems(Startup, do_listen); + .add_systems(Startup, do_listen) + .listen_for_message::() + .add_systems(Update, respond_greet); } } @@ -45,6 +50,23 @@ fn handle_net_event( } } +fn respond_greet( + mut greetings: EventReader>, + players: Query<(&Pos, &Player)>, + net: Res>, + mut render_update: EventWriter, +) { + for greet in greetings.read() { + let source = *greet.source(); + net.send_message(source, ServerGreeting).ok(); + for (pos, player) in &players { + if player.0 == source { + render_update.send(RenderUpdate(pos.pos())); + } + } + } +} + fn do_listen( mut net: ResMut>, settings: Res, diff --git a/src/server.rs b/src/server.rs index 3a56b64..1864637 100644 --- a/src/server.rs +++ b/src/server.rs @@ -5,7 +5,8 @@ use std::time::Duration; use bevy::{app::ScheduleRunnerPlugin, prelude::*, time::TimePlugin}; use lib_server::{ - display::DisplayPlugin, map, metrics::MetricsPlugin, net::NetPlugin, physics::PhysicsPlugin, player::PlayerPlugin, + display::DisplayPlugin, generation::GenerationPlugin, map, metrics::MetricsPlugin, net::NetPlugin, + physics::PhysicsPlugin, player::PlayerPlugin, }; mod common; @@ -14,12 +15,13 @@ mod lib_server; fn main() { App::new() // Core. - .add_plugins(ScheduleRunnerPlugin::run_loop(Duration::from_millis(50))) + .add_plugins(ScheduleRunnerPlugin::run_loop(Duration::from_millis(100))) .add_plugins(TimePlugin) // World. .add_plugins(PhysicsPlugin) .add_plugins(DisplayPlugin) .add_plugins(NetPlugin) + .add_plugins(GenerationPlugin) // Content. .add_plugins(PlayerPlugin) // Debug.