~starkingdoms/starkingdoms

61e04aa75aeca08197ed5cdd8e71ba79378b887f — core a month ago 06663f6
feat(netcode-rewrite): miscellaneous fixes
M crates/unified/src/client/crafting/ui.rs => crates/unified/src/client/crafting/ui.rs +5 -5
@@ 1,6 1,6 @@
use std::collections::HashMap;

use bevy::{input_focus::{AutoFocus, InputFocus}, ui::RelativeCursorPosition};
use bevy::{input_focus::AutoFocus, ui::RelativeCursorPosition};

use crate::{attachment::PartInShip, client::colors, config::recipe::RecipesConfig, ecs::{CanCraft, CraftPartRequest, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent, VariableStorage}, prelude::*};



@@ 70,7 70,7 @@ fn setup_ui(
    variable_storage: Option<&VariableStorage>,
) {
    let parent_pos = camera.1.world_to_viewport(camera.2, parent_transform.translation).unwrap();
    let entity = commands.spawn((
    let _entity = commands.spawn((
        UiTargetCamera(camera.0),
        Node {
            position_type: PositionType::Absolute,


@@ 303,7 303,7 @@ fn drill_button(
    mut text_query: Query<&mut Text>,
    drills: Query<&Drill>,
) {
    for (interaction, mut previous_interaction, mut color, drill_button, mut button, children) in &mut interaction_query {
    for (interaction, mut previous_interaction, mut color, drill_button, _button, children) in &mut interaction_query {
        match *interaction {
            Interaction::Pressed => {
                *color = colors::SURFACE_1.into();


@@ 391,10 391,10 @@ fn close_button(
        (&Interaction, &mut PreviousInteraction, &mut BackgroundColor, &CloseButton, &mut Button),
        Changed<Interaction>,
    >,
    mouse: Res<ButtonInput<MouseButton>>,
    _mouse: Res<ButtonInput<MouseButton>>,
) {
    for (interaction, mut previous_interaction, mut color,
        close_button, mut button) in &mut interaction_query
        close_button, _button) in &mut interaction_query
    {
        match *interaction {
            Interaction::Pressed => {

M crates/unified/src/client/input/mod.rs => crates/unified/src/client/input/mod.rs +1 -1
@@ 46,7 46,7 @@ pub fn input_plugin(app: &mut App) {
#[derive(Resource, Default)]
pub struct CursorWorldCoordinates(pub Option<Vec2>);

fn update_cursor_position(
pub fn update_cursor_position(
    q_windows: Query<&Window, With<PrimaryWindow>>,
    q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
    mut coords: ResMut<CursorWorldCoordinates>,

M crates/unified/src/client/parts.rs => crates/unified/src/client/parts.rs +4 -7
@@ 7,14 7,12 @@ use crate::client::colors::GREEN;
use crate::ecs::{DragRequestEvent, Part, MAIN_LAYER};
use crate::client::input::CursorWorldCoordinates;
use bevy::color::palettes::css::{ORANGE, PURPLE, RED, YELLOW};
use bevy::ui::update;
use crate::client::ship::attachment::AttachmentDebugRes;
use crate::prelude::*;

pub fn parts_plugin(app: &mut App) {
    app.insert_resource(DragResource(None));
    app.insert_resource(SnapResource(None, None));
    app.add_systems(PreUpdate, update_drag_ghosts);
    app.add_systems(
        Update,
        (


@@ 22,6 20,7 @@ pub fn parts_plugin(app: &mut App) {
            handle_updated_parts,
            update_part_sprites,
            handle_updated_temperature,
            update_drag_ghosts.after(crate::client::input::update_cursor_position),
        ),
    );
    app.add_observer(on_part_release);


@@ 196,7 195,7 @@ fn on_part_release(
    drag.0 = None;
}

const F: f32 = 2.0; // frequency (Hz)
const F: f32 = 6.0; // frequency (Hz)
// 0.0 is undamped, 0.0-1.0 is underdamped, 1.0 is critical, and >1.0 is over
const ZETA: f32 = 0.7; // damping
const R: f32 = -0.6; // initial response speed


@@ 267,7 266,6 @@ fn update_drag_ghosts(
    joints: Query<(&Transform, &JointOf, Entity), Without<Peer>>,
    parts: Query<(&GlobalTransform, Option<&Me>, Option<&PartInShip>), With<Part>>,
    linvel: Query<&LinearVelocity, With<Me>>,
    dt: Res<Time<Fixed>>,
    me: Single<Entity, With<Me>>,
    debug: Res<AttachmentDebugRes>,
    mut rsnap: ResMut<SnapResource>,


@@ 427,9 425,8 @@ fn update_drag_ghosts(
    ghost_info.last_target_pos = best_target.translation;

    let partvel = linvel.single().unwrap();
    let t_dt = dt.delta_secs();
    ghost.translation.x += partvel.x as f32 * t_dt;
    ghost.translation.y += partvel.y as f32 * t_dt;
    ghost.translation.x += partvel.x as f32 * time.delta_secs();
    ghost.translation.y += partvel.y as f32 * time.delta_secs();

    rsnap.0 = snap;
    rsnap.1 = best_self_snap;

M crates/unified/src/client/starguide/orbit.rs => crates/unified/src/client/starguide/orbit.rs +1 -1
@@ 28,7 28,7 @@ fn update_orbits(
    for (mass, planet, transform, velocity) in planets {
        if planet.name == "Sun" { continue }

        let (other_mass, _, other_transform, other_velocity) = planets.iter().find(|f_planet| f_planet.1.name == planet.orbit.clone().unwrap().orbiting).unwrap();
        let (other_mass, _, other_transform, _other_velocity) = planets.iter().find(|f_planet| f_planet.1.name == planet.orbit.clone().unwrap().orbiting).unwrap();
        let a = other_transform.translation - transform.translation;
        let hill_sphere = a.length()*(mass.0/(3.0*(other_mass.0+mass.0))).powf(1.0/3.0);


M crates/unified/src/main.rs => crates/unified/src/main.rs +0 -5
@@ 84,10 84,5 @@ fn main() -> AppExit {
        .finish()
        .init();

    ctrlc::set_handler(|| {
        info!("caught ^C, ciao!");
        std::process::exit(0);
    }).unwrap();

    run(cli)
}

M crates/unified/src/server/craft.rs => crates/unified/src/server/craft.rs +3 -3
@@ 11,14 11,14 @@ fn receive_crafting_request(
    part_query: Query<(&Transform, &LinearVelocity, &Part, &PartInShip)>,
    player_query: Query<(Entity, &Transform, &LinearVelocity, &Part), With<Player>>,
    parts_query: Query<&Parts>,
    mut single_storage_query: Query<(&mut SingleStorage)>,
    mut variable_storage_query: Query<(&mut VariableStorage)>,
    mut single_storage_query: Query<&mut SingleStorage >,
    mut variable_storage_query: Query<&mut VariableStorage >,
    mut commands: Commands,
    asset_server: Res<AssetServer>,
) {
    'request: for request in craft_part_request.read() {
        // TODO: make crafting take time
        let (transform, vel, part, parts_list) = if let Ok((transform, vel, part, part_in_ship)) = part_query.get(request.crafting_part) {
        let (transform, vel, _part, parts_list) = if let Ok((transform, vel, part, part_in_ship)) = part_query.get(request.crafting_part) {
            // this is a normal part
            let Ok(parts_list) = parts_query.get(part_in_ship.0) else {
                warn!("Couldn't find parts list in part in ship");

M crates/unified/src/server/gravity.rs => crates/unified/src/server/gravity.rs +0 -1
@@ 1,4 1,3 @@
use bevy::math::FloatPow;
use crate::config::planet::Planet;
use crate::ecs::Part;
use crate::prelude::*;

M crates/unified/src/server/heat/conduction.rs => crates/unified/src/server/heat/conduction.rs +1 -1
@@ 5,7 5,7 @@ pub fn heat_conduction_plugin(app: &mut App) {
}

fn propagate_heat(
    peers: Query<&Peer>
    _peers: Query<&Peer>
) {

}

M crates/unified/src/server/heat/radiation.rs => crates/unified/src/server/heat/radiation.rs +1 -1
@@ 1,4 1,4 @@
use crate::{attachment::PartInShip, ecs::{Part, Player, Radiator, Temperature}, prelude::*};
use crate::{ecs::{Part, Radiator, Temperature}, prelude::*};

const STEFAN_BOLTZMANN: f64 = 5.670374419E-8;
const T_ENV: f64 = 4.0; // units: Kelvin

M crates/unified/src/server/mod.rs => crates/unified/src/server/mod.rs +0 -3
@@ 15,9 15,6 @@ use crate::server::damping::damping_plugin;
use crate::server::drill::drill_plugin;
use crate::server::earth_parts::spawn_parts_plugin;
use crate::server::gravity::newtonian_gravity_plugin;
use crate::server::heat::conduction::heat_conduction_plugin;
use crate::server::heat::cooling::heat_cooling_plugin;
use crate::server::heat::radiation::heat_radiation_plugin;
use crate::server::part::part_management_plugin;
use crate::server::planets::planets_plugin;
use crate::server::player::player_management_plugin;

M crates/unified/src/server/orbit/mod.rs => crates/unified/src/server/orbit/mod.rs +4 -8
@@ 1,14 1,10 @@
use std::collections::HashMap;
use std::f64::consts::PI;
use avian2d::dynamics::solver::solver_body::SolverBodyInertia;
use avian2d::math::{Scalar, TAU};
use avian2d::math::TAU;
use avian2d::prelude::{LinearVelocity, Mass};
use bevy::log::debug;
use bevy::math::ops::atan2;
use bevy::prelude::{Component, Plugin, Transform};
use bevy::prelude::{Plugin, Transform};
use bevy::time::Time;
use serde::{Deserialize, Serialize};
use crate::config::planet::{Planet, PlanetSpring, PlanetSpringJoint};
use crate::config::planet::{Planet, PlanetSpring};
use crate::prelude::{App, Query, Res, Update, Without};
use crate::world_config::WorldConfigResource;



@@ 30,7 26,7 @@ fn update_orbits(
        return;
    };
    let parent_velocities = planets.iter().map(|u| (u.0.name.clone(), u.2.clone())).collect::<HashMap<String, LinearVelocity>>();
    for (planet, _, mut vel) in planets.iter_mut() {
    for (planet, _, _vel) in planets.iter_mut() {
        let Some(orbit_data) = &planet.orbit else { continue; };
        // find parent
        let Some(parent) = planets_2.iter().find(|u| u.0.name == orbit_data.orbiting) else { continue; };

M crates/unified/src/server/planets.rs => crates/unified/src/server/planets.rs +1 -1
@@ 122,7 122,7 @@ pub fn update_planets(
                            .iter_mut()
                            .find(|(_, p, _, _)| p.name == planet.name);

                        if let Some((existing, mut e_planet, mut e_transform, mut e_mass)) =
                        if let Some((existing, mut e_planet, _e_transform, mut e_mass)) =
                            existing_planet
                        {
                            commands

M crates/unified/src/server/player/join.rs => crates/unified/src/server/player/join.rs +0 -1
@@ 1,4 1,3 @@
use crate::attachment::PartInShip;
use crate::config::planet::Planet;
use crate::config::world::GlobalWorldConfig;
use crate::ecs::{Me, Player, PlayerStorage};

M crates/unified/src/server_plugins.rs => crates/unified/src/server_plugins.rs +0 -6
@@ 7,12 7,6 @@ pub struct ServerPluginGroup;
impl PluginGroup for ServerPluginGroup {
    fn build(self) -> PluginGroupBuilder {
        PluginGroupBuilder::start::<Self>()
            .add_group(
                PhysicsPlugins::default()
                    .with_length_unit(100.0)
                    .build()
                    .disable::<IslandPlugin>()
            )
            .add(crate::server::ServerPlugin)
    }
}

M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +10 -0
@@ 14,6 14,16 @@ pub struct SharedPluginGroup;
impl PluginGroup for SharedPluginGroup {
    fn build(self) -> PluginGroupBuilder {
        PluginGroupBuilder::start::<Self>()
            .add(|app: &mut App| {
                app.insert_resource(Time::from_hz(20.0));
            })
            .add_group(
                PhysicsPlugins::default()
                    .with_length_unit(100.0)
                    .set(PhysicsInterpolationPlugin::interpolate_all())
                    .build()
                    .disable::<IslandPlugin>()
            )
            .add(physics_setup_plugin)
            .add(register_everything)
            .add(world_config_plugin)

M crates/unified/src/world_config.rs => crates/unified/src/world_config.rs +0 -1
@@ 1,6 1,5 @@
use crate::config::world::GlobalWorldConfig;
use bevy::asset::Handle;
use crate::config::planet::PlanetSpringJoint;
use crate::prelude::*;

pub fn world_config_plugin(app: &mut App) {