mod gravity; pub mod planets; pub mod player; mod world_config; use bevy::prelude::*; use bevy_replicon::prelude::RepliconChannels; use bevy_replicon_renet2::netcode::{ BoxedSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig, }; use std::net::{SocketAddr, UdpSocket}; use std::time::{SystemTime, UNIX_EPOCH}; #[cfg(not(target_arch = "wasm32"))] use bevy_replicon_renet2::netcode::{ NativeSocket, WebSocketAcceptor, WebSocketServer, WebSocketServerConfig, }; use crate::server::gravity::newtonian_gravity_plugin; use crate::server::planets::planets_plugin; use crate::server::player::player_management_plugin; use crate::server::world_config::world_config_plugin; use bevy_replicon_renet2::RenetChannelsExt; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer}; pub struct ServerPlugin { pub bind_ws: SocketAddr, pub bind_native: SocketAddr, pub max_clients: usize, } impl Plugin for ServerPlugin { fn build(&self, app: &mut App) { let bind_ws = self.bind_ws; let bind_native = self.bind_native; let max_clients = self.max_clients; 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(), )); #[cfg(not(target_arch = "wasm32"))] { let server_config = ServerSetupConfig { current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(), max_clients, protocol_id: 0, authentication: ServerAuthentication::Unsecure, socket_addresses: vec![vec![bind_native], vec![bind_ws]], }; let rt = tokio::runtime::Runtime::new().unwrap(); let ws_config = WebSocketServerConfig { acceptor: WebSocketAcceptor::Plain { has_tls_proxy: true, }, listen: bind_ws, max_clients, }; let ws_server = WebSocketServer::new(ws_config, rt.handle().clone()).unwrap(); let native_socket = NativeSocket::new(UdpSocket::bind(bind_native).unwrap()).unwrap(); let transport = NetcodeServerTransport::new_with_sockets( server_config, vec![BoxedSocket::new(native_socket), BoxedSocket::new(ws_server)], ) .unwrap(); commands.insert_resource(server); commands.insert_resource(transport); info!("websocket/native server listening"); } }, ) .add_plugins(planets_plugin) .add_plugins(world_config_plugin) .add_plugins(newtonian_gravity_plugin) .add_plugins(player_management_plugin); } }