~starkingdoms/starkingdoms

0f9dc3e24fd39d202acbccdce99160908801b0b9 — ghostly_zsh 27 days ago 10afa15
fix: time offset to sync orbit
M crates/unified/src/client/components/mod.rs => crates/unified/src/client/components/mod.rs +1 -1
@@ 1,4 1,4 @@
use crate::prelude::Component;
use crate::prelude::{Component, Resource};

#[derive(Component)]
pub struct MainCamera;

M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +10 -4
@@ 19,7 19,7 @@ use crate::prelude::*;
use planet::incoming_planets::incoming_planets_plugin;
use crate::client::components::Me;
use crate::client::ship::attachment::client_attachment_plugin;
use crate::shared::ecs::GameplayState;
use crate::shared::ecs::{GameplayState, TimeOffset};
use crate::shared::gravity::update_gravity;
use crate::shared::net::Hi;
use crate::shared::orbit::OrbitPlugin;


@@ 65,7 65,8 @@ impl Plugin for ClientPlugin {
            .add_plugins(crafting_ui_plugin)
            .add_systems(Update, find_me)
            .insert_state(GameplayState::Main)
            .insert_resource(DebugPickingMode::Disabled);
            .insert_resource(DebugPickingMode::Disabled)
            .insert_resource(TimeOffset::default());

        let server = self.server.clone();
        app.add_systems(PostStartup, move |mut commands: Commands| {


@@ 117,10 118,15 @@ pub fn on_disconnected(trigger: On<Disconnected>, names: Query<&Name>) {
    }
}

pub fn find_me(mut msgs: MessageReader<Hi>, mut commands: Commands) {
pub fn find_me(
    mut msgs: MessageReader<Hi>,
    mut commands: Commands,
    mut time_offset: ResMut<TimeOffset>,
) {
    for msg in msgs.read() {
        let we_are = msg.you_are;
        info!(?we_are, "joined successfully");
        commands.entity(we_are).insert(Me);
        time_offset.0 = msg.time_offset;
    }
}
\ No newline at end of file
}

M crates/unified/src/client/zoom.rs => crates/unified/src/client/zoom.rs +4 -2
@@ 7,6 7,8 @@ use crate::client::starfield::{parallax_layer_translation, StarfieldSize, BACK_S
use crate::client::starguide::components::{StarfieldBack, StarfieldFront, StarfieldMid, StarguideCamera};
use crate::shared::ecs::GameplayState;

const STARGUIDE_ZOOM_LEVEL: f32 = 20.0;

fn restore_tiled(sprite: &mut Sprite, size: Option<&StarfieldSize>) {
    if let Some(size) = size {
        sprite.image_mode = SpriteImageMode::Tiled {


@@ 100,7 102,7 @@ fn on_scroll(
                    camera_projection.scale *= 1.03;
                    starguide_projection.scale *= 1.03;
                }
                if camera_projection.scale > 20.0 && matches!(gameplay_state.get(), GameplayState::Main) {
                if camera_projection.scale > STARGUIDE_ZOOM_LEVEL && matches!(gameplay_state.get(), GameplayState::Main) {
                    camera.0.is_active = false;
                    starguide_camera.0.is_active = true;
                    starguide_camera.2.translation = player.translation;


@@ 112,7 114,7 @@ fn on_scroll(
                    *visibility_back = Visibility::Hidden;
                    *visibility_mid = Visibility::Hidden;
                    *visibility_front = Visibility::Hidden;
                } else if camera_projection.scale <= 20.0 && matches!(gameplay_state.get(), GameplayState::Starguide) {
                } else if camera_projection.scale <= STARGUIDE_ZOOM_LEVEL && matches!(gameplay_state.get(), GameplayState::Starguide) {
                    camera.0.is_active = true;
                    gameplay_next_state.set(GameplayState::Main);
                    starguide_camera.0.is_active = false;

M crates/unified/src/server/player/join.rs => crates/unified/src/server/player/join.rs +4 -2
@@ 69,7 69,8 @@ pub fn handle_new_players(
    world_config: Res<WorldConfigResource>,
    planets: Query<(&Transform, &LinearVelocity, &Planet)>,
    asset_server: Res<AssetServer>,
    mut welcome_messages: MessageWriter<ToClients<Hi>>
    mut welcome_messages: MessageWriter<ToClients<Hi>>,
    time: Res<Time>,
) {
    if q_new_clients.is_empty() { return }
    let Some(wc) = &world_config.config else {


@@ 84,7 85,8 @@ pub fn handle_new_players(
        welcome_messages.write(ToClients {
            mode: SendMode::Direct(ClientId::Client(joined_player.1.network_entity)),
            message: Hi {
                you_are: joined_player.0
                you_are: joined_player.0,
                time_offset: time.elapsed_secs_f64(),
            },
        });
        join_player(joined_player.0, commands.reborrow(), wc, planets, &asset_server);

M crates/unified/src/shared/ecs.rs => crates/unified/src/shared/ecs.rs +3 -0
@@ 36,6 36,9 @@ pub struct Part {
#[derive(Component, Debug)]
pub struct PartHandle(pub Handle<PartConfig>);

#[derive(Resource, Default)]
pub struct TimeOffset(pub f64);

#[derive(Component, Serialize, Deserialize, Debug)]
pub struct Player {
    pub client: Entity,

M crates/unified/src/shared/net.rs => crates/unified/src/shared/net.rs +3 -2
@@ 50,5 50,6 @@ pub fn register_replication(app: &mut App) {
#[derive(Message, Deserialize, Serialize, MapEntities)]
pub struct Hi {
    #[entities]
    pub you_are: Entity
}
\ No newline at end of file
    pub you_are: Entity,
    pub time_offset: f64,
}

M crates/unified/src/shared/orbit.rs => crates/unified/src/shared/orbit.rs +5 -2
@@ 2,10 2,12 @@ use std::collections::HashMap;
use std::f64::consts::PI;
use avian2d::math::TAU;
use avian2d::prelude::{LinearVelocity, Mass};
use bevy::log::debug;
use bevy::prelude::{App, Plugin, Transform, Update};
use bevy::time::Time;
use crate::shared::config::planet::{Planet, PlanetSpring};
use crate::prelude::{Query, Res, Without};
use crate::shared::ecs::TimeOffset;
use crate::shared::world_config::WorldConfigResource;

pub struct OrbitPlugin;


@@ 20,7 22,8 @@ pub fn update_orbits(
    planets_2: Query<(&Planet, &Transform, &Mass), Without<PlanetSpring>>,
    mut planet_springs: Query<(&PlanetSpring, &mut Transform, &mut LinearVelocity), Without<Planet>>,
    world_config: Res<WorldConfigResource>,
    time: Res<Time>
    time: Res<Time>,
    time_offset: Res<TimeOffset>,
) {
    let Some(ref world_config) = world_config.config else {
        return;


@@ 35,7 38,7 @@ pub fn update_orbits(
        let e = orbit_data.eccentricity;
        let t = 2.0*PI*((a*a*a)/(world_config.world.gravity*(**parent_mass as f64))).sqrt();

        let time = time.elapsed_secs_f64();
        let time = time.elapsed_secs_f64() + time_offset.0;

        let m = (TAU / t) * time;
        let e_k = iterative_kepler(m, e);

M crates/unified/src/shared/plugins.rs => crates/unified/src/shared/plugins.rs +2 -1
@@ 1,5 1,5 @@
use aeronet_transport::AeronetTransportPlugin;
use crate::shared::ecs::{CraftPartRequest, DragRequestEvent, ToggleDrillEvent};
use crate::shared::ecs::{CraftPartRequest, DragRequestEvent, TimeOffset, ToggleDrillEvent};
use crate::shared::thrust::ThrustSolution;
use bevy::app::{App, PluginGroup, PluginGroupBuilder};
use bevy::diagnostic::DiagnosticsPlugin;


@@ 30,6 30,7 @@ impl PluginGroup for SharedPluginGroup {
            .add(AeronetTransportPlugin)
            .add(|app: &mut App| {
                app.insert_resource(Time::from_hz(TICK_RATE));
                app.insert_resource(TimeOffset::default());
            })
            .add_group(
                PhysicsPlugins::default()