This commit is contained in:
Matthieu Jolimaitre 2024-11-15 04:57:59 +01:00
commit f978b8af17
21 changed files with 4015 additions and 0 deletions

55
src/lib_server/net.rs Normal file
View file

@ -0,0 +1,55 @@
use bevy::{
prelude::*,
tasks::{TaskPool, TaskPoolBuilder},
};
use bevy_eventwork::{
tcp::{NetworkSettings, TcpProvider},
EventworkPlugin, EventworkRuntime, Network, NetworkEvent,
};
use crate::lib_server::player::{remove_player, spawn_player};
use super::{display::RenderUpdate, player::Player};
pub struct NetPlugin;
impl Plugin for NetPlugin {
fn build(&self, app: &mut App) {
app.add_plugins(EventworkPlugin::<TcpProvider, TaskPool>::default())
.insert_resource(EventworkRuntime(TaskPoolBuilder::new().num_threads(2).build()))
.insert_resource(NetworkSettings::default())
.add_systems(Update, handle_net_event)
.add_systems(Startup, do_listen);
}
}
fn handle_net_event(
mut cmd: Commands,
mut events: EventReader<NetworkEvent>,
mut render_update: EventWriter<RenderUpdate>,
players: Query<(Entity, &Player)>,
) {
for event in events.read() {
match event {
NetworkEvent::Connected(conn_id) => {
println!("New connection, {conn_id:?}.");
spawn_player(&mut cmd, *conn_id, IVec2::ZERO);
render_update.send(RenderUpdate(IVec2::ZERO));
}
NetworkEvent::Disconnected(conn_id) => {
println!("Lost connection, {conn_id:?}.");
remove_player(&mut cmd, *conn_id, &players);
}
NetworkEvent::Error(network_error) => println!("Network failure '{network_error}'."),
}
}
}
fn do_listen(
mut net: ResMut<Network<TcpProvider>>,
settings: Res<NetworkSettings>,
task_pool: Res<EventworkRuntime<TaskPool>>,
) {
net.listen(([0, 0, 0, 0], 9000).into(), &task_pool.0, &settings)
.unwrap();
}