use crate::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint}; use crate::config::planet::Planet; use crate::ecs::{DragRequestEvent, Part, Particles, Player, PlayerStorage, ThrustEvent}; use bevy::app::{App, PluginGroup, PluginGroupBuilder}; use bevy::prelude::*; use bevy_rapier2d::prelude::*; use bevy_replicon::prelude::{AppRuleExt, Channel, ClientEventAppExt}; pub struct SharedPluginGroup; impl PluginGroup for SharedPluginGroup { fn build(self) -> PluginGroupBuilder { PluginGroupBuilder::start::() .add(RapierPhysicsPlugin::::pixels_per_meter(100.0)) .add(physics_setup_plugin) .add(register_everything) } } pub fn register_everything(app: &mut App) { app.add_client_event::(Channel::Ordered) .add_mapped_client_event::(Channel::Ordered) .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::(); } fn physics_setup_plugin(app: &mut App) { app.add_systems(Startup, setup_physics); } fn setup_physics( mut rapier_config: Query<&mut RapierConfiguration>, mut rapier_context: Query<&mut RapierContextSimulation>, ) { let mut cfg = rapier_config.single_mut().unwrap(); cfg.gravity = Vec2::ZERO; let ctx = rapier_context.single_mut().unwrap(); let mut params = ctx.integration_parameters; params.num_internal_stabilization_iterations = 16; }