~starkingdoms/starkingdoms

a376e219865be16cfa3bc43be78ea441a7ef5c09 — core 5 months ago fb75351
chore: fix more things
9 files changed, 19 insertions(+), 90 deletions(-)

M crates/unified/src/client/parts.rs
D crates/unified/src/clientevent.rs
M crates/unified/src/ecs.rs
M crates/unified/src/lib.rs
M crates/unified/src/main.rs
M crates/unified/src/server/gravity.rs
M crates/unified/src/server/mod.rs
D crates/unified/src/server/part_dragging.rs
M crates/unified/src/shared_plugins.rs
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>()