From 89c38c327e6eca6da0ab6d0d2b03d6af21b9f244 Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sun, 19 Apr 2026 20:57:22 -0500 Subject: [PATCH] fix: parts have initial velocity matching parent planet, and orbit indicator uses relative velocity --- crates/unified/assets/config/planets.pc.toml | 22 ++++++++++---------- crates/unified/src/client/starguide/orbit.rs | 21 ++++++++++++------- crates/unified/src/config/planet.rs | 1 - crates/unified/src/server/craft.rs | 13 ++++++------ crates/unified/src/server/earth_parts.rs | 9 ++++---- crates/unified/src/server/orbit/mod.rs | 14 +++++++++---- crates/unified/src/server/part.rs | 1 + crates/unified/src/server/planets.rs | 8 ++++--- crates/unified/src/server/player/join.rs | 13 +++++++----- 9 files changed, 60 insertions(+), 42 deletions(-) diff --git a/crates/unified/assets/config/planets.pc.toml b/crates/unified/assets/config/planets.pc.toml index e730ade69317f3ff293e292b36a761a2589b2e37..5cba598bf51cd710c2c7d54f46a8df2d4709258c 100644 --- a/crates/unified/assets/config/planets.pc.toml +++ b/crates/unified/assets/config/planets.pc.toml @@ -1,5 +1,5 @@ [orbit] -planet_spring_compliance = 0 +planet_spring_compliance = 0.0 [[planets]] name = "Sun" @@ -17,7 +17,7 @@ radius = 666.66 # m mass = 205_000_000.0 # kg default_transform = [116_129.4, 0.0, 0.0] planet_resource = { name = "Composite", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.2056, period = 299.0 } +orbit = { orbiting = "Sun", eccentricity = 0.2056 } [[planets]] name = "Venus" @@ -26,7 +26,7 @@ radius = 1899.8 # m mass = 806_166_000.0 # kg default_transform = [216_999.6, 0.0, 0.0] planet_resource = { name = "Sulfur", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.0068, period = 546.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0068 } [[planets]] name = "Earth" @@ -36,7 +36,7 @@ radius = 2000.0 # m mass = 16_900_000_000.0 # kg planet_resource = { name = "Carbon", color = { LinearRgba = { red = 1.0, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 2.0 } default_transform = [300_000.0, 0.0, 0.0] -orbit = { orbiting = "Sun", eccentricity = 0.0167, period = 900.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0167 } [[planets]] name = "Moon" @@ -46,7 +46,7 @@ radius = 545.4 # m mass = 360_236_000.0 # kg default_transform = [312_700.0, 0.0, 0.0] planet_resource = { name = "Silicon", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Earth", eccentricity = 0.0549, period = 256.0 } +orbit = { orbiting = "Earth", eccentricity = 0.0549 } [[planets]] name = "Mars" @@ -56,7 +56,7 @@ radius = 1062.0 # m mass = 525_857_000.0 # kg default_transform = [430_000.0, 0.0, 0.0] planet_resource = { name = "Iron", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.0934, period = 1745.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0934 } [[planets]] name = "Jupiter" @@ -65,7 +65,7 @@ radius = 21946.0 # m mass = 1_131_221_218_000.0 # kg default_transform = [1_561_140.0, 0.0, 0.0] planet_resource = { name = "Hydrogen", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.0484, period = 11218.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0484 } [[planets]] name = "Saturn" @@ -74,7 +74,7 @@ radius = 18_280.4 # m mass = 561_386_112_000.0 # kg default_transform = [2_874_780.0, 0.0, 0.0] planet_resource = { name = "Helium", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.0541, period = 28297.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0541 } [[planets]] name = "Uranus" @@ -83,7 +83,7 @@ radius = 8014.0 # m mass = 69_763_532_000.0 # kg default_transform = [4_050_000.0, 0.0, 0.0] planet_resource = { name = "Rubber", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.0472, period = 46791.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0472 } [[planets]] name = "Neptune" @@ -92,7 +92,7 @@ radius = 7_766.0 # m mass = 106_674_649_000.0 # kg default_transform = [5_000_000.0, 0.0, 0.0] planet_resource = { name = "Methane", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.0086, period = 60454.0 } +orbit = { orbiting = "Sun", eccentricity = 0.0086 } [[planets]] name = "Pluto" @@ -101,4 +101,4 @@ radius = 373.6 # m mass = 10_817_000.0 # kg default_transform = [5_922_300.0, 0.0, 0.0] planet_resource = { name = "Ice", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } -orbit = { orbiting = "Sun", eccentricity = 0.2488, period = 118234.0 } +orbit = { orbiting = "Sun", eccentricity = 0.2488 } diff --git a/crates/unified/src/client/starguide/orbit.rs b/crates/unified/src/client/starguide/orbit.rs index a56519bdacf2be6f2444145e3153f9cd2745776c..c4c6938f1a4d83ddb30b816bde88132a6a96928f 100644 --- a/crates/unified/src/client/starguide/orbit.rs +++ b/crates/unified/src/client/starguide/orbit.rs @@ -13,7 +13,7 @@ fn update_orbits( me: Single<(&Transform, &LinearVelocity), (With, Without)>, mut gizmos: Gizmos, world_config: Res, - planets: Query<(&Mass, &Planet, &Transform)>, + planets: Query<(&Mass, &Planet, &Transform, &LinearVelocity)>, ) { let Some(world_config) = &world_config.config else { return; @@ -22,12 +22,13 @@ fn update_orbits( let mut p_mass = None; let mut p_transform = None; - let (sun_mass, _, sun_transform) = planets.iter().find(|planet| planet.1.name == "Sun").unwrap(); + let mut p_velocity = None; + let (sun_mass, _, sun_transform, sun_velocity) = planets.iter().find(|planet| planet.1.name == "Sun").unwrap(); let mut closest = f32::INFINITY; - for (mass, planet, transform) in planets { + for (mass, planet, transform, velocity) in planets { if planet.name == "Sun" { continue } - let (other_mass, _, other_transform) = 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); @@ -37,24 +38,28 @@ fn update_orbits( if rel_dist < closest && hill_sphere > rel_dist { p_mass = Some(mass.0); p_transform = Some(*transform); + p_velocity = Some(*velocity); closest = rel_dist; } } if p_mass.is_none() { p_mass = Some(sun_mass.0); p_transform = Some(*sun_transform); + p_velocity = Some(*sun_velocity); } let p_mass = p_mass.unwrap(); let p_transform = p_transform.unwrap(); + let p_velocity = p_velocity.unwrap(); // orbit magic let rel_pos = me.0.translation - p_transform.translation; + let rel_vel = me.1.0 - p_velocity.0; let u = world_config.world.gravity*p_mass; - let h = rel_pos.x*me.1.y - rel_pos.y*me.1.x; + let h = rel_pos.x*rel_vel.y - rel_pos.y*rel_vel.x; let r = rel_pos.length(); - let a = (u*r) / (2.0*u - r*(me.1.x*me.1.x + me.1.y*me.1.y)); - let e_x = rel_pos.x/r - (h*me.1.y)/u; - let e_y = rel_pos.y/r + (h*me.1.x)/u; + let a = (u*r) / (2.0*u - r*(rel_vel.x*rel_vel.x + rel_vel.y*rel_vel.y)); + let e_x = rel_pos.x/r - (h*rel_vel.y)/u; + let e_y = rel_pos.y/r + (h*rel_vel.x)/u; let f_x = -2.0*a*e_x; let f_y = -2.0*a*e_y; diff --git a/crates/unified/src/config/planet.rs b/crates/unified/src/config/planet.rs index c95a67c0c7f85fd90dacea6a0735fe13dfb90612..cb7b11aa75636281acf41c0f2e25a8c9d04936be 100644 --- a/crates/unified/src/config/planet.rs +++ b/crates/unified/src/config/planet.rs @@ -49,7 +49,6 @@ pub struct PlanetResource { pub struct OrbitData { pub orbiting: String, pub eccentricity: f32, - pub period: f32 } #[derive(Deserialize, TypePath, Serialize, Clone, Debug)] diff --git a/crates/unified/src/server/craft.rs b/crates/unified/src/server/craft.rs index 919896fbc308bd6214ae4b458e29089e560477e0..1aa6de62f2b0b82838327edf9e8f40dbc2e9474a 100644 --- a/crates/unified/src/server/craft.rs +++ b/crates/unified/src/server/craft.rs @@ -8,8 +8,8 @@ pub fn craft_plugin(app: &mut App) { fn receive_crafting_request( mut craft_part_request: MessageReader>, - part_query: Query<(&Transform, &Part, &PartInShip)>, - player_query: Query<(Entity, &Transform, &Part), With>, + part_query: Query<(&Transform, &LinearVelocity, &Part, &PartInShip)>, + player_query: Query<(Entity, &Transform, &LinearVelocity, &Part), With>, parts_query: Query<&Parts>, mut single_storage_query: Query<(&mut SingleStorage)>, mut variable_storage_query: Query<(&mut VariableStorage)>, @@ -18,15 +18,15 @@ fn receive_crafting_request( ) { 'request: for request in craft_part_request.read() { // TODO: make crafting take time - let (transform, part, parts_list) = if let Ok((transform, 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"); continue; }; let parts_list = parts_list.iter().collect::>(); - (transform, part, parts_list) - } else if let Ok((entity, transform, part)) = player_query.get(request.crafting_part) { + (transform, vel, part, parts_list) + } else if let Ok((entity, transform, vel, part)) = player_query.get(request.crafting_part) { // this is a player let parts_list = if let Ok(parts_list) = parts_query.get(entity) { let mut parts_list = parts_list.iter().collect::>(); @@ -35,7 +35,7 @@ fn receive_crafting_request( } else { vec![entity] }; - (transform, part, parts_list) + (transform, vel, part, parts_list) } else { warn!("When receiving a crafting request, the crafting part didn't exist."); continue; @@ -113,6 +113,7 @@ fn receive_crafting_request( req: SpawnPartRequest(asset_server.load( format!("config/parts/{}.part.toml", request.crafted_part.to_lowercase()))), transform: transform.with_translation(transform.translation + vec3(50.0, 0.0, 0.0)), + vel: *vel, }); } } diff --git a/crates/unified/src/server/earth_parts.rs b/crates/unified/src/server/earth_parts.rs index 79705578805c9be4d6ade0500f400d2deed61107..d5c7a1c7f4e86708fa379785fa82d6e00387d7dc 100644 --- a/crates/unified/src/server/earth_parts.rs +++ b/crates/unified/src/server/earth_parts.rs @@ -18,7 +18,7 @@ pub fn spawn_parts_plugin(app: &mut App) { fn spawn_parts_on_earth( mut commands: Commands, world_config: Res, - planets: Query<(&Transform, &Planet)>, + planets: Query<(&Transform, &LinearVelocity, &Planet)>, mut timer: ResMut, asset_server: Res, time: Res