~starkingdoms/starkingdoms

8ec2ca862f877587160380a225943baea747fce2 — core 5 months ago f40e332
chore: code cleanup
M crates/unified/src/attachment.rs => crates/unified/src/attachment.rs +9 -11
@@ 1,18 1,16 @@
use bevy::asset::processor::ErasedProcessor;
use bevy::ecs::entity::MapEntities;
use bevy::prelude::*;
use serde::{Deserialize, Serialize};
use std::ops::Deref;

#[derive(Component, Serialize, Deserialize)]
/// The primary component for a ship structure
pub struct Ship;

#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship_target(relationship = PartInShip, linked_spawn)]
pub struct Parts(#[entities] Vec<Entity>);

#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship(relationship_target = Parts)]
pub struct PartInShip(#[entities] Entity);



@@ 22,29 20,29 @@ pub struct Joint {
    pub id: JointId,
    pub transform: Transform,
}
#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
pub struct Peer(#[entities] Entity);

#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship(relationship_target = Joints)]
pub struct JointOf(#[entities] pub Entity);
#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship_target(relationship = JointOf)]
pub struct Joints(#[entities] Vec<Entity>);
#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship(relationship_target = JointSnaps)]
pub struct JointSnapOf(#[entities] pub Entity);
#[derive(Component, Serialize, Deserialize)]
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship_target(relationship = JointSnapOf)]
pub struct JointSnaps(#[entities] Vec<Entity>);

#[derive(Serialize, Deserialize)]
pub struct JointId(pub String);
impl JointId {
    pub fn from_part_and_joint_id(part: String, joint: String) -> Self {
    #[must_use] pub fn from_part_and_joint_id(part: String, joint: String) -> Self {
        Self(format!("{part}:{joint}"))
    }
}

#[derive(Serialize, Deserialize, Component)]
#[derive(Serialize, Deserialize, Component, MapEntities)]
pub struct JointSnapFor(#[entities] pub Entity);

M crates/unified/src/client/key_input.rs => crates/unified/src/client/key_input.rs +4 -6
@@ 1,13 1,11 @@
use crate::attachment::{Joint, JointSnapFor};
use crate::ecs::{Part, ThrustEvent};
use crate::ecs::ThrustEvent;
use bevy::color::palettes::css::{FUCHSIA, GREEN};
use bevy::dev_tools::picking_debug::DebugPickingMode;
use bevy::gizmos::AppGizmoBuilder;
use bevy::log::{debug, info};
use bevy::math::Vec3Swizzles;
use bevy::prelude::{
    ChildOf, GizmoConfigGroup, Gizmos, GlobalTransform, IntoScheduleConfigs, Query, Reflect,
    ResMut, Resource, Transform, With,
    Gizmos, GlobalTransform, Query,
    ResMut, Resource, With,
};
use bevy::{
    app::{App, Update},


@@ 73,7 71,7 @@ fn draw_attachment_debug(
    joints: Query<&GlobalTransform, With<Joint>>,
    snaps: Query<&GlobalTransform, With<JointSnapFor>>,
    mut gizmos: Gizmos,
    mut state: ResMut<AttachmentDebugRes>,
    state: ResMut<AttachmentDebugRes>,
) {
    if !state.0 {
        return;

M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +0 -3
@@ 23,8 23,6 @@ use bevy::core_pipeline::tonemapping::DebandDither;
use bevy::dev_tools::picking_debug::DebugPickingMode;
use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_egui::EguiPlugin;
use bevy_replicon::shared::server_entity_map::ServerEntityMap;
use planet::incoming_planets::incoming_planets_plugin;

pub struct ClientPlugin {


@@ 65,7 63,6 @@ pub struct Me;
fn find_me(
    mut commands: Commands,
    q_clients: Query<(Entity, &Player, &Part), Added<Player>>,
    entity_map: Res<ServerEntityMap>,
    asset_server: Res<AssetServer>,
) {
    for (entity, player, part) in q_clients.iter() {

M crates/unified/src/client/particles/mod.rs => crates/unified/src/client/particles/mod.rs +1 -1
@@ 3,5 3,5 @@ use bevy::app::{App, Plugin};
pub struct ParticlePlugin;

impl Plugin for ParticlePlugin {
    fn build(&self, app: &mut App) {}
    fn build(&self, _app: &mut App) {}
}

M crates/unified/src/client/parts.rs => crates/unified/src/client/parts.rs +3 -4
@@ 3,7 3,6 @@ use crate::ecs::{CursorWorldCoordinates, DragRequestEvent, Part};
use bevy::prelude::*;
use bevy_rapier2d::dynamics::MassProperties;
use bevy_rapier2d::prelude::{AdditionalMassProperties, ReadMassProperties, RigidBody};
use std::fmt::Debug;

pub fn parts_plugin(app: &mut App) {
    app.insert_resource(DragResource(None));


@@ 70,8 69,8 @@ fn on_part_click(
) {
    if ev.button != PointerButton::Primary {
        return;
    };
    let Ok(sprite) = sprites.get(ev.target()) else {
    }
    let Ok(_) = sprites.get(ev.target()) else {
        return;
    };
    drag.0 = Some(ev.target());


@@ 85,7 84,7 @@ fn on_part_release(
) {
    if ev.button != PointerButton::Primary {
        return;
    };
    }

    if let Some(e) = drag.0
        && let Some(c) = cursor.0

M crates/unified/src/client/planet/incoming_planets.rs => crates/unified/src/client/planet/incoming_planets.rs +0 -4
@@ 10,8 10,6 @@ fn handle_incoming_planets(
    mut commands: Commands,
    new_planets: Query<(Entity, &Planet), Added<Planet>>,
    asset_server: Res<AssetServer>,
    meshes: ResMut<Assets<Mesh>>,
    materials: ResMut<Assets<ColorMaterial>>,
) {
    for (new_entity, new_planet) in new_planets.iter() {
        let mut sprite = Sprite::from_image(asset_server.load(&new_planet.sprite));


@@ 34,8 32,6 @@ fn handle_updated_planets(
    mut commands: Commands,
    updated_planets: Query<(Entity, &Planet), Changed<Planet>>,
    asset_server: Res<AssetServer>,
    meshes: ResMut<Assets<Mesh>>,
    materials: ResMut<Assets<ColorMaterial>>,
) {
    for (updated_entity, updated_planet) in updated_planets.iter() {
        let mut sprite = Sprite::from_image(asset_server.load(&updated_planet.sprite));

M crates/unified/src/client/planet/indicators.rs => crates/unified/src/client/planet/indicators.rs +2 -2
@@ 10,7 10,7 @@ pub fn indicators_plugin(app: &mut App) {
}

#[derive(Component)]
struct PlanetIndicator(String);
struct PlanetIndicator;
#[derive(Component)]
struct HasIndicator(Entity);



@@ 32,7 32,7 @@ fn add_indicators(
        let indicator = commands
            .spawn((
                ChildOf(me),
                PlanetIndicator(planet_data.name.clone()),
                PlanetIndicator,
                sprite,
                Transform::from_xyz(0.0, 0.0, 0.0),
            ))

M crates/unified/src/client_plugins.rs => crates/unified/src/client_plugins.rs +0 -1
@@ 6,7 6,6 @@ use bevy::app::{PluginGroup, PluginGroupBuilder};
use bevy::dev_tools::picking_debug::DebugPickingPlugin;
use bevy::log::LogPlugin;
use bevy::prelude::MeshPickingPlugin;
use bevy::sprite::prelude::SpritePickingPlugin;
use bevy_rapier2d::prelude::RapierDebugRenderPlugin;
use bevy_replicon::RepliconPlugins;


M crates/unified/src/config/part.rs => crates/unified/src/config/part.rs +1 -1
@@ 1,6 1,6 @@
use bevy::asset::Asset;
use bevy::math::{Quat, Vec3};
use bevy::prelude::{Component, Transform, TypePath};
use bevy::prelude::{Transform, TypePath};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, TypePath, Serialize, Clone, Debug, PartialEq, Asset)]

M crates/unified/src/main.rs => crates/unified/src/main.rs +1 -1
@@ 1,4 1,4 @@
use bevy::log::{Level, tracing_subscriber};
use bevy::log::tracing_subscriber;
use bevy::prelude::*;
use clap::Parser;
use starkingdoms::client_plugins::ClientPluginGroup;

M crates/unified/src/particle_editor/mod.rs => crates/unified/src/particle_editor/mod.rs +14 -17
@@ 6,7 6,6 @@ use bevy::prelude::*;
use bevy_egui::{EguiContexts, EguiPlugin, EguiPrimaryContextPass, egui};
use bevy_rapier2d::plugin::{NoUserData, RapierPhysicsPlugin};
use ordered_float::OrderedFloat;
use ron::ser::PrettyConfig;
use std::collections::BTreeMap;

mod ecs;


@@ 32,7 31,7 @@ pub fn particle_editor_plugin(app: &mut App) {
        scale_curve: LifetimeCurve::new(&[(0.0f32, 5.0), (2.0, 0.0)])
            .0
            .iter()
            .map(|u| (u.0.clone(), u.1.clone()))
            .map(|u| (*u.0, *u.1))
            .collect::<Vec<_>>(),
        color_curve: vec![(OrderedFloat(0.0f32), [255, 0, 0, 255])],
    });


@@ 167,8 166,7 @@ fn editor_ui(
                    let new_v = (
                        OrderedFloat(editor_resource.add_scale_t),
                        editor_resource.add_scale_v,
                    )
                        .clone();
                    );
                    editor_resource.scale_curve.push(new_v);
                }
                ui.end_row();


@@ 216,8 214,7 @@ fn editor_ui(
                    let new_v = (
                        OrderedFloat(editor_resource.add_color_t),
                        editor_resource.add_color_v,
                    )
                        .clone();
                    );
                    editor_resource.color_curve.push(new_v);
                }
                ui.end_row();


@@ 228,10 225,10 @@ fn editor_ui(
                        (
                            *u,
                            Color::Srgba(Srgba::new(
                                v[0] as f32 / 256.0,
                                v[1] as f32 / 256.0,
                                v[2] as f32 / 256.0,
                                v[3] as f32 / 256.0,
                                f32::from(v[0]) / 256.0,
                                f32::from(v[1]) / 256.0,
                                f32::from(v[2]) / 256.0,
                                f32::from(v[3]) / 256.0,
                            )),
                        )
                    })));


@@ 250,10 247,10 @@ fn editor_ui(
                            (
                                *u,
                                Color::Srgba(Srgba::new(
                                    v[0] as f32 / 256.0,
                                    v[1] as f32 / 256.0,
                                    v[2] as f32 / 256.0,
                                    v[3] as f32 / 256.0,
                                    f32::from(v[0]) / 256.0,
                                    f32::from(v[1]) / 256.0,
                                    f32::from(v[2]) / 256.0,
                                    f32::from(v[3]) / 256.0,
                                )),
                            )
                        })));


@@ 269,14 266,14 @@ fn editor_ui(
                                .scale
                                .0
                                .iter()
                                .map(|u| (u.0.clone(), u.1.clone()))
                                .map(|u| (*u.0, *u.1))
                                .collect::<Vec<_>>();
                            editor_resource.color_curve = effect
                                .color
                                .0
                                .iter()
                                .map(|u| {
                                    (u.0.clone(), {
                                    (*u.0, {
                                        let mut r = [0u8; 4];
                                        let srgba: Srgba = (*u.1).into();
                                        r[0] = (srgba.red * 256.0).floor() as u8;


@@ 291,7 288,7 @@ fn editor_ui(
                        Err(e) => {
                            editor_resource.status = e.to_string();
                        }
                    };
                    }
                }
            });
            ui.text_edit_multiline(&mut editor_resource.ser_field);

M crates/unified/src/particles.rs => crates/unified/src/particles.rs +5 -5
@@ 1,7 1,7 @@
use bevy::color::{Color, LinearRgba};
use bevy::math::Vec2;
use bevy::prelude::Component;
use ordered_float::{FloatCore, OrderedFloat};
use ordered_float::OrderedFloat;
use rand::Rng;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;


@@ 42,13 42,13 @@ impl<P: Lerp + Copy> LifetimeCurve<P> {
        P: 'a,
    {
        Self(BTreeMap::from_iter(
            points.into_iter().map(|u| (OrderedFloat(u.0), u.1.clone())),
            points.into_iter().map(|u| (OrderedFloat(u.0), u.1)),
        ))
    }

    /// Sample for the value at T. Returns None if the curve has no points, or if T is outside
    /// the domain of the points specified.
    pub fn sample(&self, at: f32) -> Option<P> {
    #[must_use] pub fn sample(&self, at: f32) -> Option<P> {
        if self.0.is_empty() {
            return None;
        }


@@ 82,7 82,7 @@ impl<P: Lerp + Copy> LifetimeCurve<P> {

    /// Given an input time value, use the ends of the spline's time to clamp
    /// the input value.
    pub fn clamp_time(&self, time: f32) -> Option<f32> {
    #[must_use] pub fn clamp_time(&self, time: f32) -> Option<f32> {
        let Some(first) = self.0.iter().nth(0) else {
            return None;
        };


@@ 128,7 128,7 @@ pub struct RandUsize {
}
impl RandUsize {
    pub fn sample(&self, rng: &mut impl Rng) -> usize {
        let lower_bound = self.value.checked_sub(self.randomness).unwrap_or(0);
        let lower_bound = self.value.saturating_sub(self.randomness);
        rng.random_range(lower_bound..self.value + self.randomness)
    }
}

M crates/unified/src/server/earth_parts.rs => crates/unified/src/server/earth_parts.rs +1 -6
@@ 1,15 1,10 @@
use crate::config::planet::Planet;
use crate::ecs::{Part, PartBundle};
use crate::server::part::SpawnPartRequest;
use crate::server::world_config::WorldConfigResource;
use bevy::app::App;
use bevy::math::Vec2;
use bevy::prelude::*;
use bevy::prelude::{Commands, Query, Res, Transform};
use bevy::time::Time;
use bevy_rapier2d::dynamics::{AdditionalMassProperties, MassProperties};
use bevy_rapier2d::geometry::Collider;
use bevy_replicon::prelude::Replicated;

#[derive(Resource, Default)]
struct PartTimerRes {


@@ 21,7 16,7 @@ pub fn spawn_parts_plugin(app: &mut App) {
        .add_systems(Update, spawn_parts_on_earth);
}

pub fn spawn_parts_on_earth(
fn spawn_parts_on_earth(
    mut commands: Commands,
    world_config: Res<WorldConfigResource>,
    planets: Query<(&Transform, &Planet)>,

M crates/unified/src/server/gravity.rs => crates/unified/src/server/gravity.rs +1 -1
@@ 10,7 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/part.rs => crates/unified/src/server/part.rs +1 -1
@@ 2,7 2,7 @@ use crate::config::world::PartConfig;
use bevy::prelude::Component;
use bevy::prelude::*;

pub fn part_management_plugin(app: &mut App) {}
pub fn part_management_plugin(_app: &mut App) {}

#[derive(Component)]
pub struct SpawnPartRequest(pub Handle<PartConfig>);

M crates/unified/src/server/player.rs => crates/unified/src/server/player.rs +3 -7
@@ 2,16 2,14 @@ use std::f32::consts::PI;

use crate::config::planet::Planet;
use crate::ecs::{
    DragRequestEvent, Part, PartBundle, Particles, Player, PlayerThrust, ThrustEvent,
    DragRequestEvent, Part, Player, PlayerThrust, ThrustEvent,
};
use crate::server::part::SpawnPartRequest;
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 bevy_rapier2d::prelude::ExternalForce;
use bevy_replicon::prelude::FromClient;

pub fn player_management_plugin(app: &mut App) {
    app.add_systems(Update, (handle_new_players, player_thrust, dragging));


@@ 34,8 32,6 @@ fn handle_new_players(
    world_config: Res<WorldConfigResource>,
    planets: Query<(&Transform, &Planet)>,
    asset_server: Res<AssetServer>,
    gt: Query<&GlobalTransform>,
    child_of: Query<&ChildOf>,
) {
    let Some(wc) = &world_config.config else {
        return;

M crates/unified/src/server_plugins.rs => crates/unified/src/server_plugins.rs +1 -4
@@ 4,15 4,12 @@ use crate::config::world::GlobalWorldConfig;
use aeronet_replicon::server::AeronetRepliconServerPlugin;
use aeronet_websocket::server::WebSocketServerPlugin;
use bevy::app::{
    App, PluginGroup, PluginGroupBuilder, ScheduleRunnerPlugin, Startup, TaskPoolPlugin,
    PluginGroup, PluginGroupBuilder, ScheduleRunnerPlugin, TaskPoolPlugin,
};
use bevy::asset::AssetPlugin;
use bevy::diagnostic::FrameCountPlugin;
use bevy::math::Vec2;
use bevy::prelude::Query;
use bevy::time::TimePlugin;
use bevy_common_assets::toml::TomlAssetPlugin;
use bevy_rapier2d::plugin::{NoUserData, RapierConfiguration, RapierPhysicsPlugin};
use bevy_replicon::RepliconPlugins;
use std::net::SocketAddr;
use std::time::Duration;