55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
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();
|
|
}
|