@@ 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,
}
}
@@ 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,