From 42f762da6cbfb717018fc435533ed423fe54b331 Mon Sep 17 00:00:00 2001 From: core Date: Tue, 1 Jul 2025 19:49:59 -0400 Subject: [PATCH] planets and hearty --- Cargo.lock | 6 +- Cargo.toml | 7 +- crates/unified/Cargo.toml | 4 +- crates/unified/assets/config/planets.pc.toml | 68 ++++++++++++++++++-- crates/unified/assets/config/world.wc.toml | 8 +-- crates/unified/src/client/incoming_parts.rs | 13 +++- crates/unified/src/client/mod.rs | 27 +++++++- crates/unified/src/ecs.rs | 7 +- crates/unified/src/server/player.rs | 31 ++++++--- crates/unified/src/shared_plugins.rs | 5 +- 10 files changed, 142 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b65a025ccd2ed47376f10c53b13430ed4e4cf2a..4e3c7a4e5cefecf7a2cf62c0dd5b70f780a99873 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", ] diff --git a/Cargo.toml b/Cargo.toml index f6d17fc84c7d8be12d86c50c0b75e551cc613724..000eccab2f115ebea7ac9bacebb4a1053e95dc40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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 diff --git a/crates/unified/Cargo.toml b/crates/unified/Cargo.toml index 0e7d7de643b88b931b994e17bbc8288b32f7e2a7..19d7c1a4cf75641cdf67d311462b02ed8986167c 100644 --- a/crates/unified/Cargo.toml +++ b/crates/unified/Cargo.toml @@ -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 diff --git a/crates/unified/assets/config/planets.pc.toml b/crates/unified/assets/config/planets.pc.toml index e3a5082a6f1360dc70d82ec6c8b93f51e1672c3a..1d21a0c62abafcb0efe4c26afc2921f90c08cdb4 100644 --- a/crates/unified/assets/config/planets.pc.toml +++ b/crates/unified/assets/config/planets.pc.toml @@ -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 diff --git a/crates/unified/assets/config/world.wc.toml b/crates/unified/assets/config/world.wc.toml index 7a9fbae37eac85ffc5bc2d79740bd8016dcda5e4..a2eca17a7e68e39453c63688d47fadcf42b24674 100644 --- a/crates/unified/assets/config/world.wc.toml +++ b/crates/unified/assets/config/world.wc.toml @@ -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 diff --git a/crates/unified/src/client/incoming_parts.rs b/crates/unified/src/client/incoming_parts.rs index 7e42e3c6b363442178e572169d5bfc2856128795..67e1db3af2e67572521d7f3fabb1c100541010ca 100644 --- a/crates/unified/src/client/incoming_parts.rs +++ b/crates/unified/src/client/incoming_parts.rs @@ -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::() .remove::() .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 diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index 30955db2a46834c5cb96988be441479bc73073c8..c7a3802d5be19ca5be1d37f03099b26131d910a3 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -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>, entity_map: Res) { + 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, Without)>, mut player: Query<&Transform, With>) { + 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>, q_camera: Query<(&Camera, &GlobalTransform), With>, diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index 2c72842c60e7383e6ecb5c4da75f264d17bb40d4..1c551f1bbbe663cd8e073ef2154364610b73303c 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -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 diff --git a/crates/unified/src/server/player.rs b/crates/unified/src/server/player.rs index 926b31963dd0dd6cd60f9a7edb14d319b34aacc4..01af78baf695ae6a404677e060ebd62bf726bb54 100644 --- a/crates/unified/src/server/player.rs +++ b/crates/unified/src/server/player.rs @@ -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>, world_config: Res) { +fn handle_new_players(mut commands: Commands, q_new_clients: Query>, world_config: Res, 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::() * 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() .replicate::() .replicate::() - .replicate::(); + .replicate::() + .replicate::(); } fn physics_setup_plugin(mut app: &mut App) {