M crates/unified/src/client/parts.rs => crates/unified/src/client/parts.rs +8 -16
@@ 1,14 1,13 @@
use std::fmt::Debug;
-use crate::ecs::{CursorWorldCoordinates, Part};
+use crate::ecs::{CursorWorldCoordinates, DragRequestEvent, Part};
use bevy::prelude::*;
use bevy_rapier2d::dynamics::MassProperties;
use bevy_rapier2d::prelude::{AdditionalMassProperties, ReadMassProperties, RigidBody};
use crate::client::Me;
-use crate::clientevent::{PartDragControlEvent, PartDragEvent};
pub fn parts_plugin(app: &mut App) {
app.insert_resource(DragResource(None));
- app.add_systems(Update, (handle_incoming_parts, handle_updated_parts, send_drag));
+ app.add_systems(Update, (handle_incoming_parts, handle_updated_parts));
app.add_observer(on_part_release);
}
@@ 65,26 64,19 @@ fn handle_updated_parts(
struct DragResource(Option<Entity>);
-fn on_part_click(ev: Trigger<Pointer<Pressed>>, sprites: Query<&Sprite, Without<Me>>, mut drag: ResMut<DragResource>, mut events: EventWriter<PartDragControlEvent>) {
+fn on_part_click(ev: Trigger<Pointer<Pressed>>, sprites: Query<&Sprite, Without<Me>>, mut drag: ResMut<DragResource>) {
if ev.button != PointerButton::Primary { return; };
let Ok(sprite) = sprites.get(ev.target()) else { return; };
-
drag.0 = Some(ev.target());
-
- events.write(PartDragControlEvent::Start(ev.target()));
}
-fn on_part_release(ev: Trigger<Pointer<Released>>, mut drag: ResMut<DragResource>, mut events: EventWriter<PartDragControlEvent>) {
+
+fn on_part_release(ev: Trigger<Pointer<Released>>, mut drag: ResMut<DragResource>, mut events: EventWriter<DragRequestEvent>, cursor: Res<CursorWorldCoordinates>) {
if ev.button != PointerButton::Primary { return; };
- if let Some(e) = drag.0 {
- events.write(PartDragControlEvent::Stop(e));
+ if let Some(e) = drag.0 && let Some(c) = cursor.0 {
+ debug!(?e, ?c, "sending drag request");
+ events.write(DragRequestEvent(e, c));
}
drag.0 = None;
-}
-fn send_drag(drag: ResMut<DragResource>, coords: Res<CursorWorldCoordinates>, mut events: EventWriter<PartDragEvent>) {
- let Some(dragging) = drag.0 else { return; };
- let Some(coordinates) = coords.0 else { return; };
-
- events.write(PartDragEvent(dragging, coordinates));
}=
\ No newline at end of file
D crates/unified/src/clientevent.rs => crates/unified/src/clientevent.rs +0 -25
@@ 1,25 0,0 @@
-use bevy::ecs::entity::MapEntities;
-use bevy::math::Vec2;
-use bevy::prelude::{Entity, EntityMapper, Event};
-use serde::{Deserialize, Serialize};
-
-#[derive(Debug, Deserialize, Event, Serialize, Clone)]
-pub struct PartDragEvent(pub Entity, pub Vec2);
-impl MapEntities for PartDragEvent {
- fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
- self.0 = entity_mapper.get_mapped(self.0);
- }
-}
-#[derive(Debug, Deserialize, Event, Serialize, Clone)]
-pub enum PartDragControlEvent {
- Start(Entity),
- Stop(Entity)
-}
-impl MapEntities for PartDragControlEvent {
- fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
- match self {
- PartDragControlEvent::Start(entity) => *entity = entity_mapper.get_mapped(*entity),
- PartDragControlEvent::Stop(entity) => *entity = entity_mapper.get_mapped(*entity),
- }
- }
-}>
\ No newline at end of file
M crates/unified/src/ecs.rs => crates/unified/src/ecs.rs +4 -0
@@ 1,3 1,4 @@
+use bevy::ecs::entity::MapEntities;
use bevy::math::Vec2;
use bevy::prelude::{Bundle, Component, Entity, Event, Resource, Transform};
use bevy_rapier2d::dynamics::AdditionalMassProperties;
@@ 65,3 66,6 @@ pub struct Particles {
pub effect: String,
pub active: bool,
}
+
+#[derive(Serialize, Deserialize, Event, Debug, MapEntities, Clone)]
+pub struct DragRequestEvent(#[entities] pub Entity, pub Vec2);<
\ No newline at end of file
M crates/unified/src/lib.rs => crates/unified/src/lib.rs +0 -1
@@ 27,5 27,4 @@ pub mod server_plugins;
pub mod shared_plugins;
#[cfg(all(not(target_arch = "wasm32"), feature = "particle_editor"))]
pub mod particle_editor;
-pub mod clientevent;
pub mod attachment;=
\ No newline at end of file
M crates/unified/src/main.rs => crates/unified/src/main.rs +3 -0
@@ 7,7 7,9 @@ use starkingdoms::server_plugins::ServerPluginGroup;
use starkingdoms::shared_plugins::SharedPluginGroup;
use std::net::SocketAddr;
use std::process::exit;
+use std::str::FromStr;
use tracing_subscriber::EnvFilter;
+use tracing_subscriber::filter::Directive;
use tracing_subscriber::util::SubscriberInitExt;
#[derive(Parser, Debug)]
@@ 37,6 39,7 @@ fn main() -> AppExit {
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::from_default_env()
+ .add_directive(Directive::from_str("naga=error").unwrap())
)
.finish()
.init();
M crates/unified/src/server/gravity.rs => crates/unified/src/server/gravity.rs +1 -2
@@ 4,14 4,13 @@ use crate::server::world_config::WorldConfigResource;
use bevy::math::FloatPow;
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
-use crate::server::part_dragging::BeingDragged;
pub fn newtonian_gravity_plugin(app: &mut App) {
app.add_systems(Update, update_gravity);
}
fn update_gravity(
- mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalForce), (With<Part>, Without<BeingDragged>)>,
+ mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalForce), (With<Part>)>,
planet_query: Query<(&Transform, &ReadMassProperties), With<Planet>>,
world_config: Res<WorldConfigResource>,
) {
M crates/unified/src/server/mod.rs => crates/unified/src/server/mod.rs +0 -3
@@ 3,7 3,6 @@ pub mod planets;
pub mod player;
mod world_config;
mod earth_parts;
-mod part_dragging;
mod part;
use crate::server::gravity::newtonian_gravity_plugin;
@@ 20,7 19,6 @@ use bevy_replicon::prelude::Replicated;
use std::net::SocketAddr;
use crate::server::earth_parts::spawn_parts_plugin;
use crate::server::part::part_config_plugin;
-use crate::server::part_dragging::part_dragging_plugin;
pub struct ServerPlugin {
pub bind: SocketAddr,
@@ 48,7 46,6 @@ impl Plugin for ServerPlugin {
.add_plugins(world_config_plugin)
.add_plugins(newtonian_gravity_plugin)
.add_plugins(player_management_plugin)
- .add_plugins(part_dragging_plugin)
.add_plugins(spawn_parts_plugin)
.add_plugins(part_config_plugin);
}
D crates/unified/src/server/part_dragging.rs => crates/unified/src/server/part_dragging.rs +0 -39
@@ 1,39 0,0 @@
-use bevy::prelude::*;
-use bevy_rapier2d::prelude::{Collider, ColliderDisabled};
-use bevy_replicon::prelude::FromClient;
-use crate::clientevent::{PartDragControlEvent, PartDragEvent};
-use crate::ecs::Part;
-
-pub fn part_dragging_plugin(app: &mut App) {
- app.add_systems(Update, (handle_dragged_parts, handle_start_stop_drag));
-}
-
-// todo: attachment
-
-#[derive(Component)]
-pub struct BeingDragged;
-
-fn handle_dragged_parts(mut transforms: Query<&mut Transform, (With<BeingDragged>)>, mut events: EventReader<FromClient<PartDragEvent>>) {
- for event in events.read() {
- let Ok(mut transform) = transforms.get_mut(event.0) else { continue; };
- transform.translation = (event.1, 0.0).into();
- }
-}
-fn handle_start_stop_drag(mut colliders: Query<&Collider, With<Part>>, mut events: EventReader<FromClient<PartDragControlEvent>>, mut commands: Commands) {
- for event in events.read() {
- let entity = match &event.event {
- PartDragControlEvent::Start(e) => *e,
- PartDragControlEvent::Stop(e) => *e,
- };
- let Ok(_) = colliders.get(entity) else { continue; };
- match &event.event {
- PartDragControlEvent::Start(_) => {
- commands.entity(entity)
- .insert(BeingDragged);
- },
- PartDragControlEvent::Stop(_) => {
- commands.entity(entity).remove::<BeingDragged>();
- }
- }
- }
-}>
\ No newline at end of file
M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +3 -4
@@ 1,11 1,10 @@
use crate::config::planet::Planet;
-use crate::ecs::{Part, Particles, Player, ThrustEvent};
+use crate::ecs::{DragRequestEvent, Part, Particles, Player, ThrustEvent};
use bevy::app::{App, PluginGroup, PluginGroupBuilder};
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use bevy_replicon::prelude::{AppRuleExt, Channel, ClientEventAppExt};
use crate::attachment::{Joint, JointOf, JointSnapFor, PartInShip, Peer, Ship};
-use crate::clientevent::{PartDragControlEvent, PartDragEvent};
pub struct SharedPluginGroup;
@@ 22,9 21,9 @@ impl PluginGroup for SharedPluginGroup {
pub fn register_everything(app: &mut App) {
app
.add_client_event::<ThrustEvent>(Channel::Ordered)
- .add_mapped_client_event::<PartDragEvent>(Channel::Unreliable)
- .add_mapped_client_event::<PartDragControlEvent>(Channel::Ordered)
+ .add_mapped_client_event::<DragRequestEvent>(Channel::Ordered)
.replicate::<Transform>()
+ .replicate::<GlobalTransform>()
.replicate::<Collider>()
.replicate::<RigidBody>()
.replicate::<Planet>()