From 5acaa78ad8f7c7f00ea23df78c5ab09c96796cbd Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Sat, 6 Jan 2024 13:57:03 -0600 Subject: [PATCH] landing thruster manipulation should finally work --- server/src/main.rs | 253 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 200 insertions(+), 53 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index d9a5a2eab58a19b2cf5e7480051049df201c4477..34de1dab95c59d7692bcc2dcbd4363db5ed23226 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -23,8 +23,8 @@ use bevy::math::{vec2, vec3}; use bevy::{ecs::event::ManualEventReader, prelude::*}; use bevy_rapier2d::prelude::*; use bevy_twite::{twite::frame::MessageType, ServerEvent, TwiteServerConfig, TwiteServerPlugin}; -use component::*; use component::Input; +use component::*; use packet::*; use rand::Rng; @@ -76,8 +76,7 @@ fn main() { .add_systems(Update, on_message) .add_systems(Update, on_close) .add_systems(FixedUpdate, on_position_change) - .add_systems(FixedUpdate, gravity_update) - .add_systems(FixedUpdate, player_input_update) + .add_systems(FixedUpdate, (gravity_update, player_input_update).chain()) .add_systems(FixedUpdate, convert_modules) //.insert_resource(Time::::from_seconds(1.0/20.0)) .run(); @@ -478,6 +477,13 @@ fn on_message( let mut children = [None, None, None, None]; if let Some(loose_attach) = module.4 { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -488,6 +494,17 @@ fn on_message( children, }); attach.children[2] = Some(module.0); + if *module.1 == PartType::LandingThruster { + let loose_attach = module.4.unwrap().clone(); + let mut transform = part_query.get_mut(loose_attach.children[2].unwrap()).unwrap().2; + transform.translation = vec3( + p_pos.x + 53. / SCALE * angle.sin(), + p_pos.y - 53. / SCALE * angle.cos(), + 0., + ); + transform.rotation = + Quat::from_euler(EulerRot::ZYX, angle, 0., 0.); + } break; } else if attach.children[0] == None && -30. / SCALE < rel_y @@ -502,7 +519,7 @@ fn on_message( ); module.2.rotation = Quat::from_euler( EulerRot::ZYX, - angle + std::f32::consts::PI, + angle + PI, 0., 0., ); @@ -512,6 +529,13 @@ fn on_message( let mut children = [None, None, None, None]; if let Some(loose_attach) = module.4 { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -522,6 +546,17 @@ fn on_message( children, }); attach.children[0] = Some(module.0); + if *module.1 == PartType::LandingThruster { + let loose_attach = module.4.unwrap().clone(); + let mut transform = part_query.get_mut(loose_attach.children[2].unwrap()).unwrap().2; + transform.translation = vec3( + p_pos.x - 53. / SCALE * angle.sin(), + p_pos.y + 53. / SCALE * angle.cos(), + 0., + ); + transform.rotation = + Quat::from_euler(EulerRot::ZYX, angle + PI, 0., 0.); + } break; } else if attach.children[1] == None && -30. / SCALE < rel_x @@ -536,7 +571,7 @@ fn on_message( ); module.2.rotation = Quat::from_euler( EulerRot::ZYX, - angle + (std::f32::consts::PI / 2.), + angle + (PI / 2.), 0., 0., ); @@ -547,6 +582,13 @@ fn on_message( let mut children = [None, None, None, None]; if let Some(loose_attach) = module.4 { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -557,6 +599,17 @@ fn on_message( children, }); attach.children[1] = Some(module.0); + if *module.1 == PartType::LandingThruster { + let loose_attach = module.4.unwrap().clone(); + let mut transform = part_query.get_mut(loose_attach.children[2].unwrap()).unwrap().2; + transform.translation = vec3( + p_pos.x + 53. / SCALE * angle.cos(), + p_pos.y + 53. / SCALE * angle.sin(), + 0., + ); + transform.rotation = + Quat::from_euler(EulerRot::ZYX, angle + (PI / 2.), 0., 0.); + } break; } else if attach.children[3] == None && 15. / SCALE < rel_x @@ -571,7 +624,7 @@ fn on_message( ); module.2.rotation = Quat::from_euler( EulerRot::ZYX, - angle - (std::f32::consts::PI / 2.), + angle - (PI / 2.), 0., 0., ); @@ -582,6 +635,13 @@ fn on_message( let mut children = [None, None, None, None]; if let Some(loose_attach) = module.4 { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -592,6 +652,17 @@ fn on_message( children, }); attach.children[3] = Some(module.0); + if *module.1 == PartType::LandingThruster { + let loose_attach = module.4.unwrap().clone(); + let mut transform = part_query.get_mut(loose_attach.children[2].unwrap()).unwrap().2; + transform.translation = vec3( + p_pos.x - 53. / SCALE * angle.cos(), + p_pos.y - 53. / SCALE * angle.sin(), + 0., + ); + transform.rotation = + Quat::from_euler(EulerRot::ZYX, angle - (PI / 2.), 0., 0.); + } break; } } else if attached_query.contains(select) { @@ -599,17 +670,19 @@ fn on_message( let parent = module.3.parent.unwrap(); commands.entity(select).remove::(); commands.entity(select).remove::(); + let children_attach = module.3.clone(); if *module.1 == PartType::LandingThruster { - commands.entity(entity).insert(LooseAttach { - children: attach.children, + commands.entity(select).insert(LooseAttach { + children: module.3.children, }); + commands.entity(module.3.children[2].unwrap()).remove::(); + } else { + detach_recursive( + &mut commands, + module.3.clone(), + &mut attached_query, + ); } - let children_attach = module.3.clone(); - detach_recursive( - &mut commands, - module.3.clone(), - &mut attached_query, - ); if attached_query.contains(parent) { { let mut parent_attach = @@ -766,13 +839,15 @@ fn detach_recursive( attached_query.get(child).unwrap(); commands.entity(entity).remove::(); if *part_type == PartType::LandingThruster { - commands.entity(entity).remove::(); commands.entity(entity).insert(LooseAttach { children: attach.children, }); + commands.entity(attach.children[2].unwrap()).remove::(); + continue; } else if *part_type == PartType::LandingThrusterSuspension { let parent = attach.parent.unwrap(); let parent_attach = attached_query.get(parent).unwrap().3; + println!("suspension {:?} {:?}", parent_attach.children, entity); commands.entity(parent).insert(LooseAttach { children: parent_attach.children, }); @@ -861,6 +936,13 @@ fn attach_on_module_tree( let mut children = [None, None, None, None]; if let Some(loose_attach) = loose_attach { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -893,6 +975,13 @@ fn attach_on_module_tree( let mut children = [None, None, None, None]; if let Some(loose_attach) = loose_attach { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -925,6 +1014,13 @@ fn attach_on_module_tree( let mut children = [None, None, None, None]; if let Some(loose_attach) = loose_attach { commands.entity(entity).remove::(); + if *module.1 == PartType::LandingThruster { + commands.entity(loose_attach.children[2].unwrap()).insert(Attach { + associated_player: attach.associated_player, + parent: Some(entity), + children: [None, None, None, None] + }); + } children = loose_attach.children; } let mut module_entity = commands.entity(module.0); @@ -938,15 +1034,17 @@ fn attach_on_module_tree( return true; } ret = ret - | attach_on_module_tree( - x, - y, - commands, - attach.clone(), - select, - attached_query, - part_query, - ); + | if *module.1 != PartType::LandingThruster { + attach_on_module_tree( + x, + y, + commands, + attach.clone(), + select, + attached_query, + part_query, + ) + } else { false }; } } return ret; @@ -1274,8 +1372,17 @@ fn on_position_change( } fn player_input_update( - mut player_and_body_query: Query<(Entity, &mut Player, &Attach, &mut ExternalForce, &Transform)>, - mut attached_query: Query<(&Attach, &PartType, &mut ExternalForce, &Transform), Without> + mut player_and_body_query: Query<( + Entity, + &mut Player, + &Attach, + &mut ExternalForce, + &Transform, + )>, + mut attached_query: Query< + (&Attach, &PartType, &mut ExternalForce, &Transform), + Without, + >, ) { for (_, player, attach, mut forces, transform) in &mut player_and_body_query { //forces.torque = 0.0; @@ -1345,14 +1452,22 @@ fn player_input_update( forces.torque += thruster_force.torque; } } - search_thrusters(player.input, attach.clone(), *transform, &mut attached_query); + search_thrusters( + player.input, + attach.clone(), + *transform, + &mut attached_query, + ); } } fn search_thrusters( input: Input, attach: Attach, p_transform: Transform, - attached_query: &mut Query<(&Attach, &PartType, &mut ExternalForce, &Transform), Without> + attached_query: &mut Query< + (&Attach, &PartType, &mut ExternalForce, &Transform), + Without, + >, ) { let p_angle = p_transform.rotation.to_euler(EulerRot::ZYX).0; for child in attach.children { @@ -1362,8 +1477,12 @@ fn search_thrusters( let relative_angle = (p_angle - angle).abs(); let relative_pos = transform.translation - p_transform.translation; let relative_pos = Vec2::new( - relative_pos.x.mul_add((-p_angle).cos(), -relative_pos.y * (-p_angle).sin()), - relative_pos.x.mul_add((-p_angle).sin(), relative_pos.y * (-p_angle).cos()), + relative_pos + .x + .mul_add((-p_angle).cos(), -relative_pos.y * (-p_angle).sin()), + relative_pos + .x + .mul_add((-p_angle).sin(), relative_pos.y * (-p_angle).cos()), ); let mut force_mult = 0.; @@ -1371,10 +1490,12 @@ fn search_thrusters( force_mult = LANDING_THRUSTER_FORCE; } if input.up { - if 3.*PI/4. < relative_angle && relative_angle < 5.*PI/4. { + if 3. * PI / 4. < relative_angle && relative_angle < 5. * PI / 4. { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1383,10 +1504,14 @@ fn search_thrusters( } } if input.down { - if (0. < relative_angle && relative_angle < PI/4.)||(7.*PI/4. < relative_angle && relative_angle < 2.*PI) { + if (0. < relative_angle && relative_angle < PI / 4.) + || (7. * PI / 4. < relative_angle && relative_angle < 2. * PI) + { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1395,11 +1520,13 @@ fn search_thrusters( } } if input.left { - if 3.*PI/4. < relative_angle && relative_angle < 5.*PI/4. { + if 3. * PI / 4. < relative_angle && relative_angle < 5. * PI / 4. { if relative_pos.x > 24. / SCALE { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1407,11 +1534,15 @@ fn search_thrusters( force.torque += thruster_force.torque; } } - if (0. < relative_angle && relative_angle < PI/4.)||(7.*PI/4. < relative_angle && relative_angle < 2.*PI) { + if (0. < relative_angle && relative_angle < PI / 4.) + || (7. * PI / 4. < relative_angle && relative_angle < 2. * PI) + { if relative_pos.x < -24. / SCALE { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1419,11 +1550,13 @@ fn search_thrusters( force.torque += thruster_force.torque; } } - if PI/4. < relative_angle && relative_angle < 3.*PI/4. { + if PI / 4. < relative_angle && relative_angle < 3. * PI / 4. { if relative_pos.y < -24. / SCALE { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1432,8 +1565,10 @@ fn search_thrusters( } if -24. / SCALE < relative_pos.y && relative_pos.y < 24. / SCALE { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1441,11 +1576,13 @@ fn search_thrusters( force.torque += thruster_force.torque; } } - if 5.*PI/4. < relative_angle && relative_angle < 7.*PI/4. { + if 5. * PI / 4. < relative_angle && relative_angle < 7. * PI / 4. { if relative_pos.y > 24. / SCALE { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1454,8 +1591,10 @@ fn search_thrusters( } if -24. / SCALE < relative_pos.y && relative_pos.y < 24. / SCALE { let thruster_force = ExternalForce::at_point( - Vec2::new(-force_mult / SCALE * angle.sin(), - force_mult / SCALE * angle.cos()), + Vec2::new( + -force_mult / SCALE * angle.sin(), + force_mult / SCALE * angle.cos(), + ), transform.translation.xy(), transform.translation.xy(), ); @@ -1473,7 +1612,15 @@ fn search_thrusters( } fn gravity_update( - mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalForce, &mut ExternalImpulse), With>, + mut part_query: Query< + ( + &Transform, + &ReadMassProperties, + &mut ExternalForce, + &mut ExternalImpulse, + ), + With, + >, planet_query: Query<(&Transform, &ReadMassProperties), With>, ) { for (part_transform, part_mp, mut forces, mut impulses) in &mut part_query {