can now attach with mouse to player directly
1 files changed, 56 insertions(+), 29 deletions(-) M server/src/main.rs
M server/src/main.rs => server/src/main.rs +56 -29
@@ 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<PlanetType>, Without<Player>)>, mut player_query: Query<(Entity, &mut Player, &Transform), Without<PlanetType>>, mut part_query: Query<(Entity, &PartType, &mut Transform, &mut Velocity), (Without<PlanetType>, Without<Player>, Without<Attach>)>, mut attached_query: Query<(Entity, &PartType, &mut Transform, &Attach), (Without<PlanetType>, Without<Player>)>, mut player_query: Query<(Entity, &mut Player, &Transform, &Velocity, &mut Attach), Without<PlanetType>>, mut packet_recv: Local<ManualEventReader<ServerEvent>>, mut packet_event_send: ResMut<Events<ServerEvent>>, ) { @@ 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;