~starkingdoms/starkingdoms

15ab2b2b82b7ed38334ad257d087535f221f8cf0 — core 5 months ago fc59c04
chore(fmt): format
M crates/unified/src/client/colors.rs => crates/unified/src/client/colors.rs +2 -1
@@ 1,7 1,8 @@
macro_rules! color {
    ($n:ident,rgb($r:expr, $g:expr, $b:expr)) => {
        #[allow(dead_code)]
        pub const $n: ::bevy::prelude::Color = ::bevy::prelude::Color::srgb($r as f32 / 256.0, $g as f32 / 256.0, $b as f32 / 256.0);
        pub const $n: ::bevy::prelude::Color =
            ::bevy::prelude::Color::srgb($r as f32 / 256.0, $g as f32 / 256.0, $b as f32 / 256.0);
    };
}


M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +7 -6
@@ 1,25 1,25 @@
mod colors;
mod incoming_parts;
mod incoming_planets;
mod key_input;
mod starfield;
mod net;
mod starfield;
mod ui;
mod colors;

use aeronet_websocket::client::WebSocketClient;
use crate::client::incoming_parts::incoming_parts_plugin;
use crate::client::incoming_planets::incoming_planets_plugin;
use crate::client::key_input::key_input_plugin;
use crate::client::starfield::starfield_plugin;
use crate::client::ui::ui_plugin;
use crate::ecs::{CursorWorldCoordinates, MainCamera, Player};
use aeronet_websocket::client::WebSocketClient;
use bevy::core_pipeline::fxaa::Fxaa;
use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_replicon::shared::server_entity_map::ServerEntityMap;
use crate::client::ui::ui_plugin;

pub struct ClientPlugin {
    pub server: String
    pub server: String,
}
impl Plugin for ClientPlugin {
    fn build(&self, app: &mut App) {


@@ 28,7 28,8 @@ impl Plugin for ClientPlugin {
            .add_systems(Startup, move |mut commands: Commands| {
                let config = net::websocket_config();

                commands.spawn(Name::new("default-session"))
                commands
                    .spawn(Name::new("default-session"))
                    .queue(WebSocketClient::connect(config, server.clone()));
            })
            .add_observer(net::on_connecting)

M crates/unified/src/client/net.rs => crates/unified/src/client/net.rs +9 -5
@@ 1,9 1,13 @@
use aeronet::io::{Session, SessionEndpoint};
use aeronet::io::connection::Disconnected;
use aeronet::io::{Session, SessionEndpoint};
use aeronet_replicon::client::AeronetRepliconClient;
use bevy::prelude::*;

pub fn on_connecting(trigger: Trigger<OnAdd, SessionEndpoint>, names: Query<&Name>, mut commands: Commands) {
pub fn on_connecting(
    trigger: Trigger<OnAdd, SessionEndpoint>,
    names: Query<&Name>,
    mut commands: Commands,
) {
    let entity = trigger.target();
    let name = names.get(entity).unwrap();
    info!("{name} is connecting");


@@ 22,10 26,10 @@ pub fn on_disconnected(trigger: Trigger<Disconnected>, names: Query<&Name>) {
    match &*trigger {
        Disconnected::ByUser(reason) => {
            info!(?name, ?reason, "session disconnected by user");
        },
        }
        Disconnected::ByPeer(reason) => {
            info!(?name, ?reason, "session disconnected by peer");
        },
        }
        Disconnected::ByError(err) => {
            warn!(?name, "session disconnected due to error: {err:?}");
        }


@@ 39,4 43,4 @@ pub fn websocket_config() -> aeronet_websocket::client::ClientConfig {
#[cfg(not(target_family = "wasm"))]
pub fn websocket_config() -> aeronet_websocket::client::ClientConfig {
    aeronet_websocket::client::ClientConfig::builder().with_no_cert_validation()
}
\ No newline at end of file
}

M crates/unified/src/client/ui.rs => crates/unified/src/client/ui.rs +2 -5
@@ 3,13 3,10 @@ use bevy::prelude::*;
use crate::client::colors;

pub fn ui_plugin(app: &mut App) {
    app
        .add_systems(Startup, setup_ui);
    app.add_systems(Startup, setup_ui);
}

fn setup_ui(
    mut commands: Commands,
) {
fn setup_ui(mut commands: Commands) {
    commands.spawn((
        Node {
            width: Val::Percent(100.0),

M crates/unified/src/client_plugins.rs => crates/unified/src/client_plugins.rs +2 -2
@@ 1,13 1,13 @@
use crate::client::ClientPlugin;
use aeronet_replicon::client::AeronetRepliconClientPlugin;
use aeronet_websocket::client::WebSocketClientPlugin;
use crate::client::ClientPlugin;
use bevy::DefaultPlugins;
use bevy::app::{PluginGroup, PluginGroupBuilder};
use bevy::log::LogPlugin;
use bevy_replicon::RepliconPlugins;

pub struct ClientPluginGroup {
    pub server: String
    pub server: String,
}
impl PluginGroup for ClientPluginGroup {
    fn build(self) -> PluginGroupBuilder {

M crates/unified/src/lib.rs => crates/unified/src/lib.rs +5 -4
@@ 1,8 1,9 @@
#![warn(clippy::pedantic)] // Be annoying, and disable specific irritating lints if needed
#![deny(clippy::allow_attributes_without_reason, clippy::assertions_on_result_states)]
#![deny(
    clippy::allow_attributes_without_reason,
    clippy::assertions_on_result_states
)]
#![warn(clippy::if_then_some_else_none)]


#![allow(clippy::type_complexity, reason = "Bevy makes this a nightmare")]
#![allow(clippy::needless_pass_by_value, reason = "Bevy makes this a nightmare")]
#![allow(clippy::cast_precision_loss, reason = "We cast ints to floats a lot")]


@@ 22,4 23,4 @@ pub mod ecs;
pub mod server;
#[cfg(all(not(target_arch = "wasm32"), feature = "native"))]
pub mod server_plugins;
pub mod shared_plugins;
\ No newline at end of file
pub mod shared_plugins;

M crates/unified/src/main.rs => crates/unified/src/main.rs +4 -5
@@ 1,11 1,10 @@

use bevy::log::{Level, tracing_subscriber};
use bevy::prelude::*;
use clap::Parser;
use starkingdoms::client_plugins::ClientPluginGroup;
#[cfg(not(target_arch = "wasm32"))]
use starkingdoms::server_plugins::ServerPluginGroup;
use starkingdoms::shared_plugins::SharedPluginGroup;
use bevy::log::{Level, tracing_subscriber};
use bevy::prelude::*;
use clap::Parser;
use std::net::SocketAddr;
use std::process::exit;
use tracing_subscriber::EnvFilter;


@@ 37,7 36,7 @@ fn main() -> AppExit {
        .with_env_filter(
            EnvFilter::builder()
                .with_default_directive(Level::INFO.into())
                .from_env_lossy()
                .from_env_lossy(),
        )
        .finish()
        .init();

M crates/unified/src/server/gravity.rs => crates/unified/src/server/gravity.rs +1 -8
@@ 10,14 10,7 @@ pub fn newtonian_gravity_plugin(app: &mut App) {
}

fn update_gravity(
    mut part_query: Query<
        (
            &Transform,
            &ReadMassProperties,
            &mut ExternalForce,
        ),
        With<Part>,
    >,
    mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalForce), With<Part>>,
    planet_query: Query<(&Transform, &ReadMassProperties), With<Planet>>,
    world_config: Res<WorldConfigResource>,
) {

M crates/unified/src/server/mod.rs => crates/unified/src/server/mod.rs +32 -21
@@ 3,18 3,18 @@ pub mod planets;
pub mod player;
mod world_config;

use std::net::SocketAddr;
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 aeronet::io::Session;
use aeronet::io::connection::{Disconnected, LocalAddr};
use aeronet::io::server::Server;
use aeronet::io::Session;
use aeronet_replicon::server::AeronetRepliconServer;
use aeronet_websocket::server::WebSocketServer;
use bevy::prelude::*;
use bevy_replicon::prelude::Replicated;
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 std::net::SocketAddr;

pub struct ServerPlugin {
    pub bind: SocketAddr,


@@ 26,9 26,10 @@ impl Plugin for ServerPlugin {

        app.add_systems(FixedPreUpdate, bevy_replicon::server::increment_tick) // !!important!! do not remove or move
            .add_systems(Startup, move |mut commands: Commands| {
                let server = commands.spawn(Name::new("ws-server"))
                let server = commands
                    .spawn(Name::new("ws-server"))
                    .insert(AeronetRepliconServer)
                    .insert(Transform::from_xyz(0.0,0.0,0.0))
                    .insert(Transform::from_xyz(0.0, 0.0, 0.0))
                    .queue(WebSocketServer::open(config.clone()))
                    .id();



@@ 53,14 54,13 @@ impl ServerPlugin {

#[derive(Component)]
pub struct ConnectedGameEntity {
    pub network_entity: Entity
    pub network_entity: Entity,
}
#[derive(Component)]
pub struct ConnectedNetworkEntity {
    pub game_entity: Entity
    pub game_entity: Entity,
}


fn on_opened(trigger: Trigger<OnAdd, Server>, servers: Query<&LocalAddr>) {
    let server = trigger.target();
    let local_addr = servers.get(server).unwrap();


@@ 79,18 79,25 @@ fn on_connected(

    // spawn the player

    let player = commands.spawn(ConnectedGameEntity {
        network_entity: client
    }).id();
    let player = commands
        .spawn(ConnectedGameEntity {
            network_entity: client,
        })
        .id();

    commands.entity(client).insert((
        Replicated,
        ConnectedNetworkEntity {
            game_entity: player
            game_entity: player,
        },
    ));
}
fn on_disconnected(trigger: Trigger<Disconnected>, clients: Query<&ChildOf>, player_entity: Query<&ConnectedNetworkEntity>, mut commands: Commands) {
fn on_disconnected(
    trigger: Trigger<Disconnected>,
    clients: Query<&ChildOf>,
    player_entity: Query<&ConnectedNetworkEntity>,
    mut commands: Commands,
) {
    let client = trigger.target();
    let Ok(&ChildOf(server)) = clients.get(client) else {
        return;


@@ 98,15 105,19 @@ fn on_disconnected(trigger: Trigger<Disconnected>, clients: Query<&ChildOf>, pla
    match &*trigger {
        Disconnected::ByUser(reason) => {
            info!(?client, ?server, ?reason, "client disconnected by user");
        },
        }
        Disconnected::ByPeer(reason) => {
            info!(?client, ?server, ?reason, "client disconnected by peer");
        },
        }
        Disconnected::ByError(err) => {
            warn!(?client, ?server, "client disconnected with error: {err:?}");
        }
    }
    let Ok(other_entity) = player_entity.get(client) else { return };
    let Ok(mut commands) = commands.get_entity(other_entity.game_entity) else { return };
    let Ok(other_entity) = player_entity.get(client) else {
        return;
    };
    let Ok(mut commands) = commands.get_entity(other_entity.game_entity) else {
        return;
    };
    commands.despawn();
}
\ No newline at end of file
}

M crates/unified/src/server/player.rs => crates/unified/src/server/player.rs +6 -2
@@ 3,12 3,12 @@ use std::f32::consts::PI;
use crate::config::planet::Planet;
use crate::ecs::{Part, PartBundle, Player, PlayerThrust, ThrustEvent};
use crate::server::world_config::WorldConfigResource;
use crate::server::{ConnectedGameEntity, ConnectedNetworkEntity};
use bevy::prelude::*;
use bevy_rapier2d::prelude::{
    AdditionalMassProperties, Collider, ExternalForce, ExternalImpulse, MassProperties,
};
use bevy_replicon::prelude::{FromClient, Replicated};
use crate::server::{ConnectedGameEntity, ConnectedNetworkEntity};

pub fn player_management_plugin(app: &mut App) {
    app.add_systems(PreUpdate, reset_movement)


@@ 85,7 85,11 @@ fn player_thrust(
    mut thrust_event: EventReader<FromClient<ThrustEvent>>,
    world_config: Res<WorldConfigResource>,
) {
    for FromClient { client_entity, event } in thrust_event.read() {
    for FromClient {
        client_entity,
        event,
    } in thrust_event.read()
    {
        let ConnectedNetworkEntity { game_entity } = clients.get(*client_entity).unwrap();

        let Ok((_, _, mut thrust)) = players.get_mut(*game_entity) else {

M crates/unified/src/server_plugins.rs => crates/unified/src/server_plugins.rs +2 -2
@@ 1,5 1,7 @@
use crate::config::planet::PlanetConfigCollection;
use crate::config::world::GlobalWorldConfig;
use aeronet_replicon::server::AeronetRepliconServerPlugin;
use aeronet_websocket::server::WebSocketServerPlugin;
use bevy::app::{PluginGroup, PluginGroupBuilder, ScheduleRunnerPlugin, TaskPoolPlugin};
use bevy::asset::AssetPlugin;
use bevy::diagnostic::FrameCountPlugin;


@@ 8,8 10,6 @@ use bevy_common_assets::toml::TomlAssetPlugin;
use bevy_replicon::RepliconPlugins;
use std::net::SocketAddr;
use std::time::Duration;
use aeronet_replicon::server::AeronetRepliconServerPlugin;
use aeronet_websocket::server::WebSocketServerPlugin;

pub struct ServerPluginGroup {
    pub bind: SocketAddr,

M crates/unified/src/wasm_entrypoint.rs => crates/unified/src/wasm_entrypoint.rs +3 -3
@@ 1,9 1,9 @@
use crate::client_plugins::ClientPluginGroup;
use crate::shared_plugins::SharedPluginGroup;
use aeronet_websocket::client::WebSocketClient;
use bevy::app::{App, Startup};
use url::Url;
use wasm_bindgen::prelude::*;
use crate::client_plugins::ClientPluginGroup;
use crate::shared_plugins::SharedPluginGroup;

#[wasm_bindgen]
pub fn play(server: &str) -> Result<(), JsValue> {


@@ 21,4 21,4 @@ pub fn play(server: &str) -> Result<(), JsValue> {
    bevy::prelude::info!("goodbye!");

    Ok(())
}
\ No newline at end of file
}