~starkingdoms/starkingdoms

cc953e314b820d51a152d2ed066e1bc0ccb1326e — ghostlyzsh 2 years ago ccb7ac1
player can now move modules with mouse
4 files changed, 94 insertions(+), 6 deletions(-)

M server/Cargo.toml
M server/src/component.rs
M server/src/main.rs
M server/src/packet.rs
M server/Cargo.toml => server/Cargo.toml +1 -1
@@ 12,4 12,4 @@ bevy_twite = { git = "https://gitlab.com/ghostlyzsh/twite.git" }
bevy_rapier2d = "0.23.0"
rand = "0.8.5"
tracing-subscriber = "0.3"
starkingdoms-common = { version = "0.1", path = "../starkingdoms-common" }
\ No newline at end of file
starkingdoms-common = { version = "0.1", path = "../starkingdoms-common" }

M server/src/component.rs => server/src/component.rs +1 -0
@@ 48,6 48,7 @@ pub struct Player {
    pub addr: SocketAddr,
    pub username: String,
    pub input: Input,
    pub selected: Option<Entity>,
}

#[derive(Bundle)]

M server/src/main.rs => server/src/main.rs +80 -5
@@ 16,7 16,7 @@
use std::net::Ipv4Addr;

use crate::mathutil::rot2d;
use bevy::math::vec2;
use bevy::math::{vec2, vec3};
use bevy::utils::tracing;
use bevy::{ecs::event::ManualEventReader, prelude::*};
use bevy_rapier2d::prelude::*;


@@ 71,7 71,7 @@ fn main() {
}

fn setup_integration_parameters(mut context: ResMut<RapierContext>) {
    context.integration_parameters.dt = 1.0 / 20.0;
    context.integration_parameters.dt = 1.0 / 60.0;
    context.integration_parameters.joint_erp = 0.2;
    context.integration_parameters.erp = 0.5;
    context.integration_parameters.max_stabilization_iterations = 16;


@@ 114,15 114,15 @@ 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)>,
    part_query: Query<(Entity, &PartType, &Transform)>,
    mut packet_recv: Local<ManualEventReader<ServerEvent>>,
    mut packet_event_send: ResMut<Events<ServerEvent>>,
) {
    let mut event_queue = Vec::new();
    for ev in packet_recv.read(&packet_event_send) {
        if let ServerEvent::Recv(addr, MessageType::Text, data) = ev {
            let data = String::from_utf8_lossy(data);
            let data = String::from_utf8_lossy(&data);
            let packet: Packet = err_or_cont!(serde_json::from_str(&data));

            match packet {


@@ 147,6 147,7 @@ fn on_message(
                                addr: *addr,
                                username: username.to_string(),
                                input: component::Input::default(),
                                selected: None,
                            },
                            attach: Attach {
                                associated_player: None,


@@ 175,7 176,8 @@ fn on_message(
                    let module_id = commands
                        .spawn(PartBundle {
                            part_type: PartType::Cargo,
                            transform: TransformBundle::from(Transform::from_xyz(1100. / SCALE, 0., 0.)),
                            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)


@@ 203,6 205,37 @@ fn on_message(
                        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();


@@ 340,6 373,48 @@ fn on_message(
                        }
                    }
                }
                Packet::PlayerMouseInput { x, y, released, button: _ } => {
                    for (_entity, mut q_player) in &mut player_query {
                        if q_player.addr == *addr {
                            if released {
                                let select = if let Some(s) = q_player.selected { s } else {
                                    break;
                                };
                                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]
                                });*/
                                module.2.translation = vec3(x / SCALE, y / SCALE, 0.);
                                break;
                            }
                            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;
                                let angle = -transform.rotation.z;
                                let x = rel_x*angle.cos() - rel_y*angle.sin();
                                let y = rel_x*angle.sin() + rel_y*angle.cos();
                                let mut bound = [-25. / SCALE, 25. / SCALE, -25. / SCALE, 25. / SCALE]; // left, right, top, bottom
                                if let PartType::Cargo = part_type {
                                    bound = [-18.75 / SCALE, 18.75 / SCALE, -25. / SCALE, 21.875 / SCALE];
                                }

                                if bound[0] < x && x < bound[1] {
                                    if bound[2] < y && y < bound[3] {
                                        q_player.selected = Some(entity);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                _ => continue,
            }
        }

M server/src/packet.rs => server/src/packet.rs +12 -0
@@ 52,6 52,12 @@ pub enum MessageType {
    Chat,
    Direct,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum ButtonType {
    Left,
    Middle,
    Right,
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "t", content = "c")]


@@ 71,6 77,12 @@ pub enum Packet {
        left: bool,
        right: bool,
    },
    PlayerMouseInput {
        x: f32,
        y: f32,
        released: bool,
        button: ButtonType,
    },
    // clientbound
    SpawnPlayer {
        id: u32,