~starkingdoms/starkingdoms

9b5e5de28c49151f75c480e52b9793dfb02cc1a9 — ghostlyzsh 2 years ago aa2e404
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;