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<RepliconChannels>| {
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");
});
}
}