distributed_physics_test/src/net/plugin.rs
Michael Bradley c10f6cfb82
All checks were successful
CI / Formatting (push) Successful in 1m6s
Rework networking interface
Add Bevy event queues for inbound and outbound packets, and use Bevy change detection for consumer new Peer handling.
2025-07-05 15:01:33 -04:00

75 lines
2.2 KiB
Rust

use std::net::SocketAddr;
use bevy::prelude::*;
use uuid::Uuid;
use super::{
io::{
Config, InboundPacket, OutboundPacket, handle_network_input, handle_network_output,
heartbeat, timeouts,
},
peer::{Peer, PeerChangeEvent, PeerMap, handle_peer_change},
queues::{NetworkReceive, NetworkSend},
socket::bind_socket,
};
#[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash)]
pub enum NetworkState {
#[default]
SinglePlayer,
MultiPlayer,
}
pub struct NetIOPlugin {
listen: u16,
peer: Option<SocketAddr>,
}
impl NetIOPlugin {
pub fn new(listen: u16, peer: Option<SocketAddr>) -> Self {
Self { listen, peer }
}
}
impl Plugin for NetIOPlugin {
fn build(&self, app: &mut App) {
app.init_state::<NetworkState>()
.add_systems(
FixedPreUpdate,
(handle_network_input, handle_peer_change)
.chain()
.run_if(in_state(NetworkState::MultiPlayer)),
)
.add_systems(
FixedUpdate,
(heartbeat, timeouts).run_if(in_state(NetworkState::MultiPlayer)),
)
.add_systems(
FixedPostUpdate,
handle_network_output.run_if(in_state(NetworkState::MultiPlayer)),
)
.insert_resource(Config::new())
.add_event::<PeerChangeEvent>()
.add_event::<InboundPacket>()
.add_event::<OutboundPacket>();
match bind_socket(self.listen) {
Ok((send, receive)) => {
app.insert_state(NetworkState::MultiPlayer)
.insert_resource(NetworkSend::new(send))
.insert_resource(NetworkReceive::new(receive));
let mut peer_map = PeerMap::default();
if let Some(socket) = self.peer {
let entity = app.world_mut().spawn(Peer::new(socket, Uuid::nil()));
peer_map.insert(Uuid::nil(), entity.id());
}
app.insert_resource(peer_map);
}
Err(err) => {
warn!("Failed to set up networking: {err}");
}
};
}
}