fix first refresh

This commit is contained in:
Matthieu Jolimaitre 2024-11-19 02:23:22 +01:00
parent f978b8af17
commit b204118b82
6 changed files with 91 additions and 8 deletions

View file

@ -5,6 +5,10 @@ use serde::{Deserialize, Serialize};
pub mod server_msg { pub mod server_msg {
use super::*; use super::*;
#[derive(Debug, Serialize, Deserialize)]
pub struct ServerGreeting;
netify!(ServerGreeting);
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct MapUpdates(pub Vec<(IVec2, (char, char))>); pub struct MapUpdates(pub Vec<(IVec2, (char, char))>);
netify!(MapUpdates); netify!(MapUpdates);
@ -13,6 +17,10 @@ pub mod server_msg {
pub mod client_msg { pub mod client_msg {
use super::*; use super::*;
#[derive(Debug, Serialize, Deserialize)]
pub struct ClientGreeting;
netify!(ClientGreeting);
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct Move(pub IVec2); pub struct Move(pub IVec2);
netify!(Move); netify!(Move);

View file

@ -4,10 +4,12 @@ use bevy::{
}; };
use bevy_eventwork::{ use bevy_eventwork::{
tcp::{NetworkSettings, TcpProvider}, tcp::{NetworkSettings, TcpProvider},
ConnectionId, EventworkPlugin, EventworkRuntime, Network, NetworkEvent, AppNetworkMessage, ConnectionId, EventworkPlugin, EventworkRuntime, Network, NetworkEvent,
}; };
use termion::clear; use termion::clear;
use crate::common::client_msg::ClientGreeting;
pub struct NetPlugin; pub struct NetPlugin;
impl Plugin for NetPlugin { impl Plugin for NetPlugin {
@ -17,6 +19,7 @@ impl Plugin for NetPlugin {
.insert_resource(NetworkSettings::default()) .insert_resource(NetworkSettings::default())
.add_systems(Update, handle_net_event) .add_systems(Update, handle_net_event)
.init_resource::<Server>() .init_resource::<Server>()
.listen_for_message::<ClientGreeting, TcpProvider>()
.add_systems(Startup, do_connect); .add_systems(Startup, do_connect);
} }
} }
@ -24,12 +27,13 @@ impl Plugin for NetPlugin {
#[derive(Debug, Resource, Default)] #[derive(Debug, Resource, Default)]
pub struct Server(pub Option<ConnectionId>); pub struct Server(pub Option<ConnectionId>);
fn handle_net_event(mut events: EventReader<NetworkEvent>, mut server: ResMut<Server>) { fn handle_net_event(mut events: EventReader<NetworkEvent>, mut server: ResMut<Server>, net: Res<Network<TcpProvider>>) {
for event in events.read() { for event in events.read() {
match event { match event {
NetworkEvent::Connected(connection_id) => { NetworkEvent::Connected(connection_id) => {
println!("Connected '{connection_id:?}'."); println!("Connected '{connection_id:?}'.");
server.0 = Some(*connection_id); server.0 = Some(*connection_id);
net.send_message(*connection_id, ClientGreeting).ok();
} }
NetworkEvent::Disconnected(connection_id) => { NetworkEvent::Disconnected(connection_id) => {
print!("{}", clear::All); print!("{}", clear::All);

View file

@ -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<Loader>>, reg: ResMut<GeneratedRegistry>) {
for pos in &loaders {
chunks_surrounding(&pos.pos());
}
}
const CHUNK_WIDTH: i32 = 8;
fn chunks_surrounding(pos: &IVec2) -> Vec<IVec2> {
todo!()
}
fn snap(value: i32, increment: i32) -> i32 {
todo!()
}
#[test]
fn test_snap() {
// assert_eq!();
}
#[derive(Debug, Resource, Default)]
pub struct GeneratedRegistry(HashSet<IVec2>);
#[derive(Debug, Component)]
pub struct Loader;
#[derive(Debug, Component)]
pub struct Generated;
#[derive(Debug, Component)]
pub struct Chunk(IVec2);

View file

@ -1,5 +1,6 @@
pub mod counter; pub mod counter;
pub mod display; pub mod display;
pub mod generation;
pub mod map; pub mod map;
pub mod metrics; pub mod metrics;
pub mod net; pub mod net;

View file

@ -4,12 +4,15 @@ use bevy::{
}; };
use bevy_eventwork::{ use bevy_eventwork::{
tcp::{NetworkSettings, TcpProvider}, 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; pub struct NetPlugin;
@ -19,7 +22,9 @@ impl Plugin for NetPlugin {
.insert_resource(EventworkRuntime(TaskPoolBuilder::new().num_threads(2).build())) .insert_resource(EventworkRuntime(TaskPoolBuilder::new().num_threads(2).build()))
.insert_resource(NetworkSettings::default()) .insert_resource(NetworkSettings::default())
.add_systems(Update, handle_net_event) .add_systems(Update, handle_net_event)
.add_systems(Startup, do_listen); .add_systems(Startup, do_listen)
.listen_for_message::<ClientGreeting, TcpProvider>()
.add_systems(Update, respond_greet);
} }
} }
@ -45,6 +50,23 @@ fn handle_net_event(
} }
} }
fn respond_greet(
mut greetings: EventReader<NetworkData<ClientGreeting>>,
players: Query<(&Pos, &Player)>,
net: Res<Network<TcpProvider>>,
mut render_update: EventWriter<RenderUpdate>,
) {
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( fn do_listen(
mut net: ResMut<Network<TcpProvider>>, mut net: ResMut<Network<TcpProvider>>,
settings: Res<NetworkSettings>, settings: Res<NetworkSettings>,

View file

@ -5,7 +5,8 @@ use std::time::Duration;
use bevy::{app::ScheduleRunnerPlugin, prelude::*, time::TimePlugin}; use bevy::{app::ScheduleRunnerPlugin, prelude::*, time::TimePlugin};
use lib_server::{ 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; mod common;
@ -14,12 +15,13 @@ mod lib_server;
fn main() { fn main() {
App::new() App::new()
// Core. // Core.
.add_plugins(ScheduleRunnerPlugin::run_loop(Duration::from_millis(50))) .add_plugins(ScheduleRunnerPlugin::run_loop(Duration::from_millis(100)))
.add_plugins(TimePlugin) .add_plugins(TimePlugin)
// World. // World.
.add_plugins(PhysicsPlugin) .add_plugins(PhysicsPlugin)
.add_plugins(DisplayPlugin) .add_plugins(DisplayPlugin)
.add_plugins(NetPlugin) .add_plugins(NetPlugin)
.add_plugins(GenerationPlugin)
// Content. // Content.
.add_plugins(PlayerPlugin) .add_plugins(PlayerPlugin)
// Debug. // Debug.