~starkingdoms/starkingdoms

aa2e404acb8e51ec6cd0b41c6dc4a0d1c491673e — ghostlyzsh 2 years ago cc953e3
well attachment logic is there. functionality is not
1 files changed, 46 insertions(+), 79 deletions(-)

M server/src/main.rs
M server/src/main.rs => server/src/main.rs +46 -79
@@ 114,8 114,8 @@ fn remove_later_module_spawn(mut commands: Commands) {
fn on_message(
    mut commands: Commands,
    planet_query: Query<(Entity, &PlanetType, &Transform)>,
    mut part_query: Query<(Entity, &PartType, &mut Transform), Without<PlanetType>>,
    mut player_query: Query<(Entity, &mut Player)>,
    mut part_query: Query<(Entity, &PartType, &mut Transform), (Without<PlanetType>, Without<Player>)>,
    mut player_query: Query<(Entity, &mut Player, &Transform), Without<PlanetType>>,
    mut packet_recv: Local<ManualEventReader<ServerEvent>>,
    mut packet_event_send: ResMut<Events<ServerEvent>>,
) {


@@ 172,71 172,6 @@ fn on_message(
                        .insert(RigidBody::Dynamic).id();
                    let id = entity_id.index();

                    // spawn module
                    let module_id = commands
                        .spawn(PartBundle {
                            part_type: PartType::Cargo,
                            transform: TransformBundle::from(Transform::from_xyz(1100. / SCALE, 0., 0.)
                                                             .with_rotation(Quat::from_rotation_z(-angle))),
                        })
                        //.insert(Collider::cuboid(18.75 / SCALE, 23.4375 / SCALE))
                        .insert(RigidBody::Dynamic)
                        .with_children(|children| {
                            children
                                .spawn(Collider::cuboid(18.75 / SCALE, 23.4375 / SCALE))
                                .insert(TransformBundle::from(Transform::from_xyz(
                                    0.,
                                    1.5625 / SCALE,
                                    0.,
                                )));
                        })
                        .insert(ExternalForce::default())
                        .insert(ExternalImpulse::default())
                        .insert(ReadMassProperties::default()).id();

                    // attachment logic
                    let joint = FixedJointBuilder::new().local_anchor1(vec2(0. / SCALE, -53. / SCALE));
                    let mut module = commands.entity(module_id);
                    module.insert(ImpulseJoint::new(entity_id, joint));
                    let mut entity = commands.entity(entity_id);
                    // temporary remove attach
                    entity.remove::<Attach>();
                    entity.insert(Attach {
                        associated_player: None,
                        children: [None, None, Some(module_id), None]
                    });
                    let module_id_1 = commands
                        .spawn(PartBundle {
                            part_type: PartType::Cargo,
                            transform: TransformBundle::from(Transform::from_xyz(1100. / SCALE, 0., 0.)
                                                             .with_rotation(Quat::from_rotation_z(-angle))),
                        })
                        //.insert(Collider::cuboid(18.75 / SCALE, 23.4375 / SCALE))
                        .insert(RigidBody::Dynamic)
                        .with_children(|children| {
                            children
                                .spawn(Collider::cuboid(18.75 / SCALE, 23.4375 / SCALE))
                                .insert(TransformBundle::from(Transform::from_xyz(
                                    0.,
                                    1.5625 / SCALE,
                                    0.,
                                )));
                        })
                        .insert(ExternalForce::default())
                        .insert(ExternalImpulse::default())
                        .insert(ReadMassProperties::default()).id();
                    // attachment logic
                    let joint = FixedJointBuilder::new().local_anchor1(vec2(0. / SCALE, -53. / SCALE));
                    let mut module = commands.entity(module_id_1);
                    module.insert(ImpulseJoint::new(module_id, joint));
                    let mut entity = commands.entity(module_id);
                    // temporary remove attach
                    entity.remove::<Attach>();
                    entity.insert(Attach {
                        associated_player: None,
                        children: [None, None, Some(module_id_1), None]
                    });

                    // tell this player the planets
                    let mut planets = Vec::new();
                    for (entity, planet_type, transform) in planet_query.iter() {


@@ 260,7 195,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 };


@@ 321,7 256,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);
                        }


@@ 329,7 264,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);
                            }


@@ 364,7 299,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;


@@ 374,7 309,7 @@ fn on_message(
                    }
                }
                Packet::PlayerMouseInput { x, y, released, button: _ } => {
                    for (_entity, mut q_player) in &mut player_query {
                    for (entity, mut q_player, transform) in &mut player_query {
                        if q_player.addr == *addr {
                            if released {
                                let select = if let Some(s) = q_player.selected { s } else {


@@ 383,13 318,45 @@ fn on_message(
                                q_player.selected = None;
                                let mut module = part_query.get_mut(select).unwrap();
                                // attach module
                                /*let joint = FixedJointBuilder::new().local_anchor1(vec2(0. / SCALE, -53. / SCALE));
                                module.insert(ImpulseJoint::new(entity, joint));
                                let mut entity = commands.entity(entity);
                                entity.insert(Attach {
                                    associated_player: None,
                                    children: [None, None, Some(module_id_1), None]
                                });*/
                                let p_pos = transform.translation;
                                let (rel_x, rel_y) = (
                                    p_pos.x - x / SCALE,
                                    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()),
                                );

                                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.rotation = Quat::from_euler(EulerRot::ZYX, angle, 0., 0.);
                                    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]
                                    });
                                    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.);
                                    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]
                                    });
                                    break;
                                }
                                module.2.translation = vec3(x / SCALE, y / SCALE, 0.);
                                break;
                            }