use std::net::{SocketAddr, UdpSocket}; use std::time::{SystemTime, UNIX_EPOCH}; use bevy::prelude::*; use bevy_replicon::prelude::RepliconChannels; use bevy_replicon_renet2::netcode::{NativeSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig}; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer}; use bevy_replicon_renet2::RenetChannelsExt; pub struct ServerPlugin { pub bind: SocketAddr, pub max_clients: usize, } impl Plugin for ServerPlugin { fn build(&self, app: &mut App) { let bind = self.bind.clone(); let max_clients = self.max_clients.clone(); app .add_systems(FixedPreUpdate, bevy_replicon::server::increment_tick) // !!important!! do not remove or move .add_systems(Startup, move |mut commands: Commands, channels: Res| { let server = RenetServer::new(ConnectionConfig::from_channels( channels.server_configs(), channels.client_configs() )); let server_config = ServerSetupConfig { current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(), max_clients: max_clients, protocol_id: 0, authentication: ServerAuthentication::Unsecure, socket_addresses: vec![vec![bind]] }; let socket = UdpSocket::bind(bind).unwrap(); let transport = NetcodeServerTransport::new(server_config, NativeSocket::new(socket).unwrap()).unwrap(); commands.insert_resource(server); commands.insert_resource(transport); info!("websocket server listening"); }); } }