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::::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, mut render_update: EventWriter, 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>, settings: Res, task_pool: Res>, ) { net.listen(([0, 0, 0, 0], 9000).into(), &task_pool.0, &settings) .unwrap(); }