~starkingdoms/starkingdoms

42f762da6cbfb717018fc435533ed423fe54b331 — core 5 months ago 4fb7a53
planets and hearty
M Cargo.lock => Cargo.lock +4 -2
@@ 1917,8 1917,9 @@ dependencies = [

[[package]]
name = "bevy_replicon"
version = "0.34.1"
source = "git+https://github.com/projectharmonia/bevy_replicon?branch=fix-uninit-drop#b17e5645fbf0378399fd7f33ac5a91cd205e6613"
version = "0.34.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a53c0883605628061944d818258c506c12ba316ea02d542fa7de300ef4df5c3d"
dependencies = [
 "bevy 0.16.1",
 "bitflags 2.9.1",


@@ 7858,6 7859,7 @@ dependencies = [
 "bevy_replicon_renet2",
 "clap",
 "log",
 "rand 0.9.1",
 "serde",
 "tracing-subscriber",
]

M Cargo.toml => Cargo.toml +1 -6
@@ 57,9 57,4 @@ lto = "thin"
[profile.wasm-release]
inherits = "release"
opt-level = "s"
strip = "debuginfo"


[patch.crates-io]
# TODO https://github.com/projectharmonia/bevy_replicon/pull/514
bevy_replicon = { git = "https://github.com/projectharmonia/bevy_replicon", branch = "fix-uninit-drop" }
\ No newline at end of file
strip = "debuginfo"
\ No newline at end of file

M crates/unified/Cargo.toml => crates/unified/Cargo.toml +3 -1
@@ 17,4 17,6 @@ clap = { version = "4", features = ["derive", "cargo"] }
tracing-subscriber = "0.3"
log = { version = "*", features = ["max_level_debug", "release_max_level_warn"] }

serde = { version = "1", features = ["derive"] }
\ No newline at end of file
serde = { version = "1", features = ["derive"] }

rand = "0.9"
\ No newline at end of file

M crates/unified/assets/config/planets.pc.toml => crates/unified/assets/config/planets.pc.toml +62 -6
@@ 1,20 1,76 @@
[[planets]]
name = "Sun"
sprite = "textures/sun.png"
radius = 400.0 # m
mass = 160_000_00.0 # kg
radius = 20_000.0 # m
mass = 16_000_000.0 # kg
default_transform = [0.0, 0.0, 0.0]

[[planets]]
name = "Mercury"
sprite = "textures/mercury_NEEDS_4_1_1.png"
radius = 6.666_7 # m
radius = 333.33 # m
mass = 246.669_133_339 # kg
default_transform = [2322.588, 0.0, 0.0]
default_transform = [116_129.4, 0.0, 0.0]

[[planets]]
name = "Venus"
sprite = "textures/venus.png"
radius = 18.998 # m
radius = 949.9 # m
mass = 8_166.826_315 # kg
default_transform = [4339.992, 0.0, 0.0]
\ No newline at end of file
default_transform = [216_999.6, 0.0, 0.0]

[[planets]]
name = "Earth"
sprite = "textures/earth.png"
radius = 1000.0 # m
mass = 10_000.0 # kg
default_transform = [300_000.0, 0.0, 0.0]

[[planets]]
name = "Moon"
sprite = "textures/moon.png"
radius = 272.7 # m
mass = 123.082_143_245 # kg
default_transform = [301_541.4, 0.0, 0.0]

[[planets]]
name = "Mars"
sprite = "textures/mars.png"
radius = 531.0 # m
mass = 1_070.519_602 # kg
default_transform = [457_100.0, 0.0, 0.0]

[[planets]]
name = "Jupiter"
sprite = "textures/jupiter.png"
radius = 10973.0 # m
mass = 2_554_342.750_93 # kg
default_transform = [1_561_140.0, 0.0, 0.0]

[[planets]]
name = "Saturn"
sprite = "textures/saturn.png"
radius = 9_140.2 # m
mass = 889_991.421_487 # kg
default_transform = [2_874_780.0, 0.0, 0.0]

[[planets]]
name = "Uranus"
sprite = "textures/uranus.png"
radius = 4007.0 # m
mass = 171_547.175867 # kg
default_transform = [5_757_350.0, 0.0, 0.0]

[[planets]]
name = "Neptune"
sprite = "textures/neptune.png"
radius = 3_883.0 # m
mass = 171_546.175_867 # kg
default_transform = [9_021_000.0, 0.0, 0.0]

[[planets]]
name = "Pluto"
sprite = "textures/pluto.png"
radius = 186.8 # m
mass = 22.075_947_755_1 # kg
default_transform = [11_844_600.0, 0.0, 0.0]
\ No newline at end of file

M crates/unified/assets/config/world.wc.toml => crates/unified/assets/config/world.wc.toml +4 -4
@@ 1,7 1,7 @@
[world]
gravity = 0.015
gravity = 2

[part]
default_height = 25
default_width = 25
default_mass = 50
\ No newline at end of file
default_height = 50
default_width = 50
default_mass = 100
\ No newline at end of file

M crates/unified/src/client/incoming_parts.rs => crates/unified/src/client/incoming_parts.rs +11 -2
@@ 1,4 1,5 @@
use bevy::prelude::*;
use bevy_rapier2d::dynamics::MassProperties;
use bevy_rapier2d::prelude::{AdditionalMassProperties, ReadMassProperties, RigidBody};
use crate::config::planet::Planet;
use crate::ecs::Part;


@@ 14,7 15,11 @@ fn handle_incoming_parts(mut commands: Commands, mut new_parts: Query<(Entity, &

        commands.entity(new_entity)
            .insert(sprite)
            .insert(AdditionalMassProperties::Mass(new_part.mass))
            .insert(AdditionalMassProperties::MassProperties(MassProperties {
                local_center_of_mass: Vec2::ZERO,
                mass: new_part.mass,
                principal_inertia: 7.5,
            }))
            .insert(ReadMassProperties::default())
            .insert(RigidBody::Dynamic);
        info!(?new_part, "prepared new part");


@@ 29,7 34,11 @@ fn handle_updated_parts(mut commands: Commands, mut updated_parts: Query<(Entity
            .remove::<Sprite>()
            .remove::<AdditionalMassProperties>()
            .insert(sprite)
            .insert(AdditionalMassProperties::Mass(updated_part.mass));
            .insert(AdditionalMassProperties::MassProperties(MassProperties {
                local_center_of_mass: Vec2::ZERO,
                mass: updated_part.mass,
                principal_inertia: 7.5,
            }));
        info!(?updated_part, "updated part");
    }
}
\ No newline at end of file

M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +25 -2
@@ 6,13 6,14 @@ use std::time::SystemTime;
use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_rapier2d::prelude::RigidBody;
use bevy_replicon::prelude::RepliconChannels;
use bevy_replicon::prelude::{ConnectedClient, RepliconChannels};
use bevy_replicon::shared::server_entity_map::ServerEntityMap;
use bevy_replicon_renet2::netcode::{ClientAuthentication, NetcodeClientTransport, NativeSocket};
use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetClient};
use bevy_replicon_renet2::RenetChannelsExt;
use crate::client::incoming_parts::incoming_parts_plugin;
use crate::client::incoming_planets::incoming_planets_plugin;
use crate::ecs::{Ball, CursorWorldCoordinates, Ground, MainCamera, SendBallHere};
use crate::ecs::{Ball, CursorWorldCoordinates, Ground, MainCamera, Player, SendBallHere};

pub struct ClientPlugin {
    pub server: SocketAddr


@@ 46,16 47,38 @@ impl Plugin for ClientPlugin {
            })
            .add_systems(Startup, setup_graphics)
            .add_systems(Update, update_cursor_position)
            .add_systems(Update, follow_camera)
            .add_systems(Update, find_me)
            .add_plugins(incoming_planets_plugin)
            .add_plugins(incoming_parts_plugin);
    }
}

#[derive(Component)]
pub struct Me;


fn find_me(mut commands: Commands, q_clients: Query<(Entity, &Player), Added<Player>>, entity_map: Res<ServerEntityMap>) {
    for (entity, player) in q_clients.iter() {
        let this_id_clientside = entity_map.to_client().get(&player.client).unwrap();
        if *this_id_clientside == entity {
            commands.entity(entity).insert(Me);
        }
    }
}


fn setup_graphics(mut commands: Commands) {
    commands.spawn(Camera2d::default())
        .insert(MainCamera);
}

fn follow_camera(mut camera: Query<&mut Transform, (With<MainCamera>, Without<Me>)>, mut player: Query<&Transform, With<Me>>) {
    let mut camera = camera.single_mut().unwrap();
    let Ok(player) = player.single() else { return; };
    camera.translation = player.translation;
}

fn update_cursor_position(
    q_windows: Query<&Window, With<PrimaryWindow>>,
    q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,

M crates/unified/src/ecs.rs => crates/unified/src/ecs.rs +6 -1
@@ 1,5 1,5 @@
use bevy::math::Vec2;
use bevy::prelude::{Bundle, Component, Event, Resource, Transform};
use bevy::prelude::{Bundle, Component, Entity, Event, Resource, Transform};
use bevy_rapier2d::dynamics::AdditionalMassProperties;
use bevy_replicon::prelude::Replicated;
use bevy_rapier2d::dynamics::RigidBody;


@@ 33,4 33,9 @@ pub struct PartBundle {
    pub transform: Transform,
    pub collider: Collider,
    pub additional_mass_properties: AdditionalMassProperties,
}

#[derive(Component, Serialize, Deserialize, Debug)]
pub struct Player {
    pub client: Entity
}
\ No newline at end of file

M crates/unified/src/server/player.rs => crates/unified/src/server/player.rs +23 -8
@@ 1,16 1,26 @@
use bevy::prelude::*;
use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider, ReadMassProperties, RigidBody};
use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider, MassProperties, ReadMassProperties, RigidBody};
use bevy_replicon::prelude::{ConnectedClient, Replicated};
use crate::ecs::{Part, PartBundle};
use crate::config::planet::Planet;
use crate::ecs::{Part, PartBundle, Player};
use crate::server::world_config::WorldConfigResource;

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

fn handle_new_players(mut commands: Commands, q_new_clients: Query<Entity, Added<ConnectedClient>>, world_config: Res<WorldConfigResource>) {
fn handle_new_players(mut commands: Commands, q_new_clients: Query<Entity, Added<ConnectedClient>>, world_config: Res<WorldConfigResource>, planets: Query<(&Transform, &Planet)>) {
    let Some(wc) = &world_config.config else { return; };
    for joined_player in &q_new_clients {
        // find earth
        let (earth_pos, earth_planet) = planets.iter().find(|p| p.1.name == "Earth").expect("earth is missing? (check that the planet is named 'Earth')");
        let angle = rand::random::<f32>() * std::f32::consts::TAU;
        let offset = earth_planet.radius + 150.0;
        let mut new_transform = Transform::from_xyz(angle.cos() * offset, angle.sin() * offset, 0.0);
        new_transform.rotate_z(angle);
        new_transform.translation += earth_pos.translation;


        commands.entity(joined_player)
            .insert(PartBundle {
                part: Part {


@@ 19,12 29,17 @@ fn handle_new_players(mut commands: Commands, q_new_clients: Query<Entity, Added
                    height: wc.part.default_height,
                    mass: wc.part.default_mass
                },
                transform: Transform::from_xyz(500.0, 0.0, 0.0), // todo,
                transform: new_transform,
                collider: Collider::cuboid(wc.part.default_width / 2.0, wc.part.default_height / 2.0),
                additional_mass_properties: AdditionalMassProperties::Mass(wc.part.default_mass)
                additional_mass_properties: AdditionalMassProperties::MassProperties(MassProperties {
                    local_center_of_mass: Vec2::ZERO,
                    mass: wc.part.default_mass,
                    principal_inertia: 7.5,
                })
            })
            .insert(ReadMassProperties::default())
            .insert(RigidBody::Dynamic)
            .insert(Replicated);
            .insert(Replicated)
            .insert(Player {
                client: joined_player,
            });
    }
}
\ No newline at end of file

M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +3 -2
@@ 3,7 3,7 @@ use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use bevy_replicon::prelude::{AppRuleExt, Channel, ClientEventAppExt};
use crate::config::planet::Planet;
use crate::ecs::{Ball, Ground, Part, SendBallHere};
use crate::ecs::{Ball, Ground, Part, Player, SendBallHere};

pub struct SharedPluginGroup;



@@ 26,7 26,8 @@ pub fn register_everything(app: &mut App) {
        .replicate::<Ground>()
        .replicate::<Collider>()
        .replicate::<Planet>()
        .replicate::<Part>();
        .replicate::<Part>()
        .replicate::<Player>();
}

fn physics_setup_plugin(mut app: &mut App) {