fix first refresh
This commit is contained in:
parent
f978b8af17
commit
b204118b82
6 changed files with 91 additions and 8 deletions
|
@ -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);
|
||||
|
|
|
@ -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::<Server>()
|
||||
.listen_for_message::<ClientGreeting, TcpProvider>()
|
||||
.add_systems(Startup, do_connect);
|
||||
}
|
||||
}
|
||||
|
@ -24,12 +27,13 @@ impl Plugin for NetPlugin {
|
|||
#[derive(Debug, Resource, Default)]
|
||||
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() {
|
||||
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);
|
||||
|
|
46
src/lib_server/generation.rs
Normal file
46
src/lib_server/generation.rs
Normal 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);
|
|
@ -1,5 +1,6 @@
|
|||
pub mod counter;
|
||||
pub mod display;
|
||||
pub mod generation;
|
||||
pub mod map;
|
||||
pub mod metrics;
|
||||
pub mod net;
|
||||
|
|
|
@ -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::<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(
|
||||
mut net: ResMut<Network<TcpProvider>>,
|
||||
settings: Res<NetworkSettings>,
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue