From cc953e314b820d51a152d2ed066e1bc0ccb1326e Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Mon, 4 Dec 2023 01:10:21 -0600 Subject: [PATCH] player can now move modules with mouse --- server/Cargo.toml | 2 +- server/src/component.rs | 1 + server/src/main.rs | 85 ++++++++++++++++++++++++++++++++++++++--- server/src/packet.rs | 12 ++++++ 4 files changed, 94 insertions(+), 6 deletions(-) diff --git a/server/Cargo.toml b/server/Cargo.toml index a671ab8ab923f472466a61d4e9ce16b4bed8b520..6be3ef3107c88e7c95677423b89ed3f3579d9166 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -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" } diff --git a/server/src/component.rs b/server/src/component.rs index 8f0a62a2d63728b1a5e760742292d208cd4e9006..835b9bb36b5ddae8ae49895873bc9d3f6e4c8c3f 100644 --- a/server/src/component.rs +++ b/server/src/component.rs @@ -48,6 +48,7 @@ pub struct Player { pub addr: SocketAddr, pub username: String, pub input: Input, + pub selected: Option, } #[derive(Bundle)] diff --git a/server/src/main.rs b/server/src/main.rs index 1929ce0f172452d0c6a822d20e8b8897233151a8..848d054382b418ac38159bc5b53570fd5df2cfb5 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -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) { - 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>, mut player_query: Query<(Entity, &mut Player)>, - part_query: Query<(Entity, &PartType, &Transform)>, mut packet_recv: Local>, mut packet_event_send: ResMut>, ) { 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::(); + 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, } } diff --git a/server/src/packet.rs b/server/src/packet.rs index 532c97a99421845dcf7fc419424ebfc7738c3d34..efd005a266a56653ed04451e5df45aea932eca17 100644 --- a/server/src/packet.rs +++ b/server/src/packet.rs @@ -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,