use aeronet::io::{Session, SessionEndpoint}; use aeronet::io::connection::{DisconnectReason, Disconnected}; use aeronet_replicon::client::AeronetRepliconClient; use aeronet_transport::{Transport, TransportConfig}; use aeronet_websocket::client::{ClientConfig, WebSocketClient}; use crate::client::crafting::ui::crafting_ui_plugin; use crate::client::key_input::key_input_plugin; use crate::client::parts::parts_plugin; use crate::client::planet::indicators::indicators_plugin; use crate::client::starfield::starfield_plugin; use crate::client::starguide::orbit::starguide_orbit_plugin; use crate::client::ui::ui_plugin; use crate::client::zoom::zoom_plugin; use crate::client::starguide::init::starguide_init_plugin; use crate::client::starguide::input::starguide_input_plugin; use starguide::components::StarguideGizmos; use bevy::dev_tools::picking_debug::DebugPickingMode; use crate::prelude::*; use planet::incoming_planets::incoming_planets_plugin; use crate::client::components::Me; use crate::client::ship::attachment::client_attachment_plugin; use crate::shared::ecs::GameplayState; use crate::shared::gravity::update_gravity; use crate::shared::net::Hi; use crate::shared::orbit::OrbitPlugin; pub mod colors; pub mod key_input; pub mod parts; pub mod planet; pub mod starfield; pub mod ui; pub mod zoom; pub mod ship; pub mod rendering; pub mod input; pub mod starguide; pub mod crafting; pub mod components; pub mod plugins; pub struct ClientPlugin { pub server: Option } impl Plugin for ClientPlugin { fn build(&self, app: &mut App) { app .init_gizmo_group::() .add_plugins(rendering::render_plugin) .add_plugins(OrbitPlugin) .add_systems(FixedUpdate, update_gravity.before(PhysicsSystems::Prepare)) .add_plugins(input::input_plugin) .add_plugins(ship::thrusters::client_thrusters_plugin) .add_plugins((incoming_planets_plugin, indicators_plugin)) .add_plugins(parts_plugin) .add_plugins(key_input_plugin) .add_plugins(starfield_plugin) .add_plugins(ui_plugin) .add_plugins(zoom_plugin) .add_plugins(client_attachment_plugin) .add_plugins(starguide_init_plugin) .add_plugins(starguide_input_plugin) .add_plugins(starguide_orbit_plugin) .add_plugins(crafting_ui_plugin) .add_systems(Update, find_me) .insert_state(GameplayState::Main) .insert_resource(DebugPickingMode::Disabled); let server = self.server.clone(); app.add_systems(PostStartup, move |mut commands: Commands| { #[cfg(target_arch = "wasm32")] let config = ClientConfig {}; #[cfg(not(target_arch = "wasm32"))] let config = ClientConfig::builder().with_no_cert_validation(); let Some(server) = server.as_ref() else { return }; commands.spawn((Name::new("default-session"), TransportConfig { max_memory_usage: 536_870_912, ..default() }, AeronetRepliconClient)) .queue( WebSocketClient::connect(config, server.clone())); }); if self.server.is_some() { app.add_observer(on_connecting); app.add_observer(on_connected); app.add_observer(on_disconnected); } } } pub fn on_connecting( trigger: On, names: Query<&Name>, mut commands: Commands, ) { let entity = trigger.event_target(); let name = names.get(entity).unwrap(); info!("{name} is connecting"); } pub fn on_connected(trigger: On, names: Query<&Name>) { let entity = trigger.event_target(); let name = names.get(entity).unwrap(); info!("{name} is connected"); } pub fn on_disconnected(trigger: On, names: Query<&Name>) { let session = trigger.event_target(); let name = names.get(session).unwrap(); match &trigger.reason { DisconnectReason::ByUser(reason) => { info!(?name, ?reason, "session disconnected by user"); } DisconnectReason::ByPeer(reason) => { info!(?name, ?reason, "session disconnected by peer"); } DisconnectReason::ByError(err) => { warn!(?name, "session disconnected due to error: {err:?}"); } } } pub fn find_me(mut msgs: MessageReader, mut commands: Commands) { for msg in msgs.read() { let we_are = msg.you_are; info!(?we_are, "joined successfully"); commands.entity(we_are).insert(Me); } }