From 9b5e5de28c49151f75c480e52b9793dfb02cc1a9 Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Mon, 11 Dec 2023 22:35:17 -0600 Subject: [PATCH] can now attach with mouse to player directly --- server/src/main.rs | 85 ++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 3c49b65e4a536958b8f6b86aef37959a67e5de03..630d79b5d77aa621d45816c9f0806deebd088957 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -58,7 +58,7 @@ fn main() { .add_plugins(TwiteServerPlugin) .add_systems(Startup, setup_integration_parameters) .add_systems(Startup, spawn_planets) - .add_systems(Startup, remove_later_module_spawn) + .add_systems(Startup, module_spawn) .add_systems(Update, on_message) .add_systems(Update, on_close) .add_systems(FixedUpdate, on_position_change) @@ -89,7 +89,7 @@ fn spawn_planets(mut commands: Commands) { .insert(ReadMassProperties::default()) .insert(RigidBody::Fixed); } -fn remove_later_module_spawn(mut commands: Commands) { +fn module_spawn(mut commands: Commands) { commands .spawn(PartBundle { part_type: PartType::Cargo, @@ -108,14 +108,16 @@ fn remove_later_module_spawn(mut commands: Commands) { }) .insert(ExternalForce::default()) .insert(ExternalImpulse::default()) + .insert(Velocity::default()) .insert(ReadMassProperties::default()); } fn on_message( mut commands: Commands, planet_query: Query<(Entity, &PlanetType, &Transform)>, - mut part_query: Query<(Entity, &PartType, &mut Transform), (Without, Without)>, - mut player_query: Query<(Entity, &mut Player, &Transform), Without>, + mut part_query: Query<(Entity, &PartType, &mut Transform, &mut Velocity), (Without, Without, Without)>, + mut attached_query: Query<(Entity, &PartType, &mut Transform, &Attach), (Without, Without)>, + mut player_query: Query<(Entity, &mut Player, &Transform, &Velocity, &mut Attach), Without>, mut packet_recv: Local>, mut packet_event_send: ResMut>, ) { @@ -169,6 +171,7 @@ fn on_message( }) .insert(ExternalForce::default()) .insert(ReadMassProperties::default()) + .insert(Velocity::default()) .insert(RigidBody::Dynamic).id(); let id = entity_id.index(); @@ -195,7 +198,7 @@ fn on_message( // tell the player already existing users let mut players = Vec::new(); - for (entity, player, _) in &player_query { + for (entity, player, _, _, _) in &player_query { players.push((entity.index(), player.username.clone())); } let packet = Packet::PlayerList { players }; @@ -219,7 +222,18 @@ fn on_message( // tell the player where parts are let mut parts = Vec::new(); - for (entity, part_type, transform) in &part_query { + for (entity, part_type, transform, _) in &part_query { + parts.push(( + entity.index(), + Part { + part_type: *part_type, + transform: proto_transform!(Transform::from_translation( + transform.translation * SCALE + )), + }, + )); + } + for (entity, part_type, transform, _) in &attached_query { parts.push(( entity.index(), Part { @@ -256,7 +270,7 @@ fn on_message( Packet::SendMessage { target, content } => { // find our player let mut player = None; - for (_, q_player, _) in &player_query { + for (_, q_player, _, _, _) in &player_query { if q_player.addr == *addr { player = Some(q_player); } @@ -264,7 +278,7 @@ fn on_message( let player = player.unwrap(); if let Some(target_username) = target { let mut target_player = None; - for (_, q_player, _) in &player_query { + for (_, q_player, _, _, _) in &player_query { if q_player.username == target_username { target_player = Some(q_player); } @@ -299,7 +313,7 @@ fn on_message( left, right, } => { - for (_, mut q_player, _) in &mut player_query { + for (_, mut q_player, _, _, _) in &mut player_query { if q_player.addr == *addr { q_player.input.up = up; q_player.input.down = down; @@ -309,7 +323,7 @@ fn on_message( } } Packet::PlayerMouseInput { x, y, released, button: _ } => { - for (entity, mut q_player, transform) in &mut player_query { + for (entity, mut q_player, transform, velocity, mut attach) in &mut player_query { if q_player.addr == *addr { if released { let select = if let Some(s) = q_player.selected { s } else { @@ -324,43 +338,56 @@ fn on_message( p_pos.y - y / SCALE, ); let angle = transform.rotation.to_euler(EulerRot::ZYX).0; - println!("angle: {}", angle); let (rel_x, rel_y) = ( - rel_x.mul_add((-angle).cos(), -rel_y * (-angle).sin()), - rel_x.mul_add((-angle).sin(), rel_y * (-angle).cos()), + rel_x * (-angle).cos() - rel_y * (-angle).sin(), + rel_x * (-angle).sin() + rel_y * (-angle).cos(), ); - println!("{}, {}", rel_x, rel_y); if 15./SCALE < rel_y && rel_y < 30./SCALE && -20./SCALE < rel_x && rel_x < 20./SCALE { - module.2.translation = vec3(p_pos.x - 53./SCALE*(-angle).sin(), p_pos.y + 53./SCALE*(-angle).cos(), 0.); + module.2.translation = vec3(p_pos.x + 53./SCALE*angle.sin(), p_pos.y - 53./SCALE*angle.cos(), 0.); module.2.rotation = Quat::from_euler(EulerRot::ZYX, angle, 0., 0.); + module.3.linvel = velocity.linvel; let joint = FixedJointBuilder::new().local_anchor1(vec2(0. / SCALE, -53. / SCALE)); let mut module_entity = commands.entity(module.0); module_entity.insert(ImpulseJoint::new(entity, joint)); - let mut entity = commands.entity(entity); - entity.insert(Attach { - associated_player: None, - children: [None, None, Some(module.0), None] - }); + attach.children[2] = Some(module.0); break; } else if -30./SCALE < rel_y && rel_y < -15./SCALE && -20./SCALE < rel_x && rel_x < 20./SCALE { - let angle = angle + std::f32::consts::PI; - module.2.translation = vec3(p_pos.x + 53./SCALE*(-angle).sin(), p_pos.y - 53./SCALE*(-angle).cos(), 0.); - module.2.rotation = Quat::from_euler(EulerRot::ZYX, angle, 0., 0.); + module.2.translation = vec3(p_pos.x - 53./SCALE*angle.sin(), p_pos.y + 53./SCALE*angle.cos(), 0.); + module.2.rotation = Quat::from_euler(EulerRot::ZYX, angle + std::f32::consts::PI, 0., 0.); + module.3.linvel = velocity.linvel; let joint = FixedJointBuilder::new().local_anchor1(vec2(0. / SCALE, 53. / SCALE)); let mut module_entity = commands.entity(module.0); module_entity.insert(ImpulseJoint::new(entity, joint)); - let mut entity = commands.entity(entity); - entity.insert(Attach { - associated_player: None, - children: [Some(module.0), None, None, None] - }); + attach.children[0] = Some(module.0); + break; + } else if -30./SCALE < rel_x && rel_x < -15./SCALE && -20./SCALE < rel_y && rel_y < 20./SCALE { + module.2.translation = vec3(p_pos.x + 53./SCALE*angle.cos(), p_pos.y + 53./SCALE*angle.sin(), 0.); + module.2.rotation = Quat::from_euler(EulerRot::ZYX, angle + (std::f32::consts::PI/2.), 0., 0.); + module.3.linvel = velocity.linvel; + let joint = FixedJointBuilder::new() + .local_anchor1(vec2(53. / SCALE, 0. / SCALE)) + .local_basis2(std::f32::consts::PI/2.); + let mut module_entity = commands.entity(module.0); + module_entity.insert(ImpulseJoint::new(entity, joint)); + attach.children[1] = Some(module.0); + break; + } else if 15./SCALE < rel_x && rel_x < 30./SCALE && -20./SCALE < rel_y && rel_y < 20./SCALE { + module.2.translation = vec3(p_pos.x - 53./SCALE*angle.cos(), p_pos.y - 53./SCALE*angle.sin(), 0.); + module.2.rotation = Quat::from_euler(EulerRot::ZYX, angle - (std::f32::consts::PI/2.), 0., 0.); + module.3.linvel = velocity.linvel; + let joint = FixedJointBuilder::new() + .local_anchor1(vec2(-53. / SCALE, 0. / SCALE)) + .local_basis2(-std::f32::consts::PI/2.); + let mut module_entity = commands.entity(module.0); + module_entity.insert(ImpulseJoint::new(entity, joint)); + attach.children[1] = Some(module.0); break; } module.2.translation = vec3(x / SCALE, y / SCALE, 0.); break; } - for (entity, part_type, transform) in &part_query { + for (entity, part_type, transform, _) in &part_query { let pos = transform.translation; let rel_x = pos.x - x / SCALE; let rel_y = pos.y - y / SCALE;