pub mod planets; pub mod player; mod world_config; mod gravity; use std::net::{SocketAddr, UdpSocket}; use std::time::{SystemTime, UNIX_EPOCH}; use bevy::prelude::*; use bevy_rapier2d::prelude::{Collider, Restitution, RigidBody, Velocity}; use bevy_replicon::prelude::{FromClient, Replicated, RepliconChannels}; use bevy_replicon_renet2::netcode::{NetcodeServerTransport, ServerAuthentication, ServerSetupConfig, BoxedSocket}; #[cfg(not(target_arch = "wasm32"))] use bevy_replicon_renet2::netcode::{NativeSocket, WebSocketAcceptor, WebSocketServerConfig, WebSocketServer}; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer}; use bevy_replicon_renet2::RenetChannelsExt; use crate::ecs::{Ball, Ground, SendBallHere}; 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; 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.clone(); let bind_native = self.bind_native.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() )); #[cfg(not(target_arch = "wasm32"))] { 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_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); } }