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()