M Cargo.lock => Cargo.lock +4 -2
@@ 1917,8 1917,9 @@ dependencies = [
[[package]]
name = "bevy_replicon"
-version = "0.34.1"
-source = "git+https://github.com/projectharmonia/bevy_replicon?branch=fix-uninit-drop#b17e5645fbf0378399fd7f33ac5a91cd205e6613"
+version = "0.34.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a53c0883605628061944d818258c506c12ba316ea02d542fa7de300ef4df5c3d"
dependencies = [
"bevy 0.16.1",
"bitflags 2.9.1",
@@ 7858,6 7859,7 @@ dependencies = [
"bevy_replicon_renet2",
"clap",
"log",
+ "rand 0.9.1",
"serde",
"tracing-subscriber",
]
M Cargo.toml => Cargo.toml +1 -6
@@ 57,9 57,4 @@ lto = "thin"
[profile.wasm-release]
inherits = "release"
opt-level = "s"
-strip = "debuginfo"
-
-
-[patch.crates-io]
-# TODO https://github.com/projectharmonia/bevy_replicon/pull/514
-bevy_replicon = { git = "https://github.com/projectharmonia/bevy_replicon", branch = "fix-uninit-drop" }>
\ No newline at end of file
+strip = "debuginfo"<
\ No newline at end of file
M crates/unified/Cargo.toml => crates/unified/Cargo.toml +3 -1
@@ 17,4 17,6 @@ clap = { version = "4", features = ["derive", "cargo"] }
tracing-subscriber = "0.3"
log = { version = "*", features = ["max_level_debug", "release_max_level_warn"] }
-serde = { version = "1", features = ["derive"] }>
\ No newline at end of file
+serde = { version = "1", features = ["derive"] }
+
+rand = "0.9"<
\ No newline at end of file
M crates/unified/assets/config/planets.pc.toml => crates/unified/assets/config/planets.pc.toml +62 -6
@@ 1,20 1,76 @@
[[planets]]
name = "Sun"
sprite = "textures/sun.png"
-radius = 400.0 # m
-mass = 160_000_00.0 # kg
+radius = 20_000.0 # m
+mass = 16_000_000.0 # kg
default_transform = [0.0, 0.0, 0.0]
[[planets]]
name = "Mercury"
sprite = "textures/mercury_NEEDS_4_1_1.png"
-radius = 6.666_7 # m
+radius = 333.33 # m
mass = 246.669_133_339 # kg
-default_transform = [2322.588, 0.0, 0.0]
+default_transform = [116_129.4, 0.0, 0.0]
[[planets]]
name = "Venus"
sprite = "textures/venus.png"
-radius = 18.998 # m
+radius = 949.9 # m
mass = 8_166.826_315 # kg
-default_transform = [4339.992, 0.0, 0.0]>
\ No newline at end of file
+default_transform = [216_999.6, 0.0, 0.0]
+
+[[planets]]
+name = "Earth"
+sprite = "textures/earth.png"
+radius = 1000.0 # m
+mass = 10_000.0 # kg
+default_transform = [300_000.0, 0.0, 0.0]
+
+[[planets]]
+name = "Moon"
+sprite = "textures/moon.png"
+radius = 272.7 # m
+mass = 123.082_143_245 # kg
+default_transform = [301_541.4, 0.0, 0.0]
+
+[[planets]]
+name = "Mars"
+sprite = "textures/mars.png"
+radius = 531.0 # m
+mass = 1_070.519_602 # kg
+default_transform = [457_100.0, 0.0, 0.0]
+
+[[planets]]
+name = "Jupiter"
+sprite = "textures/jupiter.png"
+radius = 10973.0 # m
+mass = 2_554_342.750_93 # kg
+default_transform = [1_561_140.0, 0.0, 0.0]
+
+[[planets]]
+name = "Saturn"
+sprite = "textures/saturn.png"
+radius = 9_140.2 # m
+mass = 889_991.421_487 # kg
+default_transform = [2_874_780.0, 0.0, 0.0]
+
+[[planets]]
+name = "Uranus"
+sprite = "textures/uranus.png"
+radius = 4007.0 # m
+mass = 171_547.175867 # kg
+default_transform = [5_757_350.0, 0.0, 0.0]
+
+[[planets]]
+name = "Neptune"
+sprite = "textures/neptune.png"
+radius = 3_883.0 # m
+mass = 171_546.175_867 # kg
+default_transform = [9_021_000.0, 0.0, 0.0]
+
+[[planets]]
+name = "Pluto"
+sprite = "textures/pluto.png"
+radius = 186.8 # m
+mass = 22.075_947_755_1 # kg
+default_transform = [11_844_600.0, 0.0, 0.0]<
\ No newline at end of file
M crates/unified/assets/config/world.wc.toml => crates/unified/assets/config/world.wc.toml +4 -4
@@ 1,7 1,7 @@
[world]
-gravity = 0.015
+gravity = 2
[part]
-default_height = 25
-default_width = 25
-default_mass = 50>
\ No newline at end of file
+default_height = 50
+default_width = 50
+default_mass = 100<
\ No newline at end of file
M crates/unified/src/client/incoming_parts.rs => crates/unified/src/client/incoming_parts.rs +11 -2
@@ 1,4 1,5 @@
use bevy::prelude::*;
+use bevy_rapier2d::dynamics::MassProperties;
use bevy_rapier2d::prelude::{AdditionalMassProperties, ReadMassProperties, RigidBody};
use crate::config::planet::Planet;
use crate::ecs::Part;
@@ 14,7 15,11 @@ fn handle_incoming_parts(mut commands: Commands, mut new_parts: Query<(Entity, &
commands.entity(new_entity)
.insert(sprite)
- .insert(AdditionalMassProperties::Mass(new_part.mass))
+ .insert(AdditionalMassProperties::MassProperties(MassProperties {
+ local_center_of_mass: Vec2::ZERO,
+ mass: new_part.mass,
+ principal_inertia: 7.5,
+ }))
.insert(ReadMassProperties::default())
.insert(RigidBody::Dynamic);
info!(?new_part, "prepared new part");
@@ 29,7 34,11 @@ fn handle_updated_parts(mut commands: Commands, mut updated_parts: Query<(Entity
.remove::<Sprite>()
.remove::<AdditionalMassProperties>()
.insert(sprite)
- .insert(AdditionalMassProperties::Mass(updated_part.mass));
+ .insert(AdditionalMassProperties::MassProperties(MassProperties {
+ local_center_of_mass: Vec2::ZERO,
+ mass: updated_part.mass,
+ principal_inertia: 7.5,
+ }));
info!(?updated_part, "updated part");
}
}=
\ No newline at end of file
M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +25 -2
@@ 6,13 6,14 @@ use std::time::SystemTime;
use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_rapier2d::prelude::RigidBody;
-use bevy_replicon::prelude::RepliconChannels;
+use bevy_replicon::prelude::{ConnectedClient, RepliconChannels};
+use bevy_replicon::shared::server_entity_map::ServerEntityMap;
use bevy_replicon_renet2::netcode::{ClientAuthentication, NetcodeClientTransport, NativeSocket};
use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetClient};
use bevy_replicon_renet2::RenetChannelsExt;
use crate::client::incoming_parts::incoming_parts_plugin;
use crate::client::incoming_planets::incoming_planets_plugin;
-use crate::ecs::{Ball, CursorWorldCoordinates, Ground, MainCamera, SendBallHere};
+use crate::ecs::{Ball, CursorWorldCoordinates, Ground, MainCamera, Player, SendBallHere};
pub struct ClientPlugin {
pub server: SocketAddr
@@ 46,16 47,38 @@ impl Plugin for ClientPlugin {
})
.add_systems(Startup, setup_graphics)
.add_systems(Update, update_cursor_position)
+ .add_systems(Update, follow_camera)
+ .add_systems(Update, find_me)
.add_plugins(incoming_planets_plugin)
.add_plugins(incoming_parts_plugin);
}
}
+#[derive(Component)]
+pub struct Me;
+
+
+fn find_me(mut commands: Commands, q_clients: Query<(Entity, &Player), Added<Player>>, entity_map: Res<ServerEntityMap>) {
+ for (entity, player) in q_clients.iter() {
+ let this_id_clientside = entity_map.to_client().get(&player.client).unwrap();
+ if *this_id_clientside == entity {
+ commands.entity(entity).insert(Me);
+ }
+ }
+}
+
+
fn setup_graphics(mut commands: Commands) {
commands.spawn(Camera2d::default())
.insert(MainCamera);
}
+fn follow_camera(mut camera: Query<&mut Transform, (With<MainCamera>, Without<Me>)>, mut player: Query<&Transform, With<Me>>) {
+ let mut camera = camera.single_mut().unwrap();
+ let Ok(player) = player.single() else { return; };
+ camera.translation = player.translation;
+}
+
fn update_cursor_position(
q_windows: Query<&Window, With<PrimaryWindow>>,
q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
M crates/unified/src/ecs.rs => crates/unified/src/ecs.rs +6 -1
@@ 1,5 1,5 @@
use bevy::math::Vec2;
-use bevy::prelude::{Bundle, Component, Event, Resource, Transform};
+use bevy::prelude::{Bundle, Component, Entity, Event, Resource, Transform};
use bevy_rapier2d::dynamics::AdditionalMassProperties;
use bevy_replicon::prelude::Replicated;
use bevy_rapier2d::dynamics::RigidBody;
@@ 33,4 33,9 @@ pub struct PartBundle {
pub transform: Transform,
pub collider: Collider,
pub additional_mass_properties: AdditionalMassProperties,
+}
+
+#[derive(Component, Serialize, Deserialize, Debug)]
+pub struct Player {
+ pub client: Entity
}=
\ No newline at end of file
M crates/unified/src/server/player.rs => crates/unified/src/server/player.rs +23 -8
@@ 1,16 1,26 @@
use bevy::prelude::*;
-use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider, ReadMassProperties, RigidBody};
+use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider, MassProperties, ReadMassProperties, RigidBody};
use bevy_replicon::prelude::{ConnectedClient, Replicated};
-use crate::ecs::{Part, PartBundle};
+use crate::config::planet::Planet;
+use crate::ecs::{Part, PartBundle, Player};
use crate::server::world_config::WorldConfigResource;
pub fn player_management_plugin(mut app: &mut App) {
app.add_systems(Update, handle_new_players);
}
-fn handle_new_players(mut commands: Commands, q_new_clients: Query<Entity, Added<ConnectedClient>>, world_config: Res<WorldConfigResource>) {
+fn handle_new_players(mut commands: Commands, q_new_clients: Query<Entity, Added<ConnectedClient>>, world_config: Res<WorldConfigResource>, planets: Query<(&Transform, &Planet)>) {
let Some(wc) = &world_config.config else { return; };
for joined_player in &q_new_clients {
+ // find earth
+ let (earth_pos, earth_planet) = planets.iter().find(|p| p.1.name == "Earth").expect("earth is missing? (check that the planet is named 'Earth')");
+ let angle = rand::random::<f32>() * std::f32::consts::TAU;
+ let offset = earth_planet.radius + 150.0;
+ let mut new_transform = Transform::from_xyz(angle.cos() * offset, angle.sin() * offset, 0.0);
+ new_transform.rotate_z(angle);
+ new_transform.translation += earth_pos.translation;
+
+
commands.entity(joined_player)
.insert(PartBundle {
part: Part {
@@ 19,12 29,17 @@ fn handle_new_players(mut commands: Commands, q_new_clients: Query<Entity, Added
height: wc.part.default_height,
mass: wc.part.default_mass
},
- transform: Transform::from_xyz(500.0, 0.0, 0.0), // todo,
+ transform: new_transform,
collider: Collider::cuboid(wc.part.default_width / 2.0, wc.part.default_height / 2.0),
- additional_mass_properties: AdditionalMassProperties::Mass(wc.part.default_mass)
+ additional_mass_properties: AdditionalMassProperties::MassProperties(MassProperties {
+ local_center_of_mass: Vec2::ZERO,
+ mass: wc.part.default_mass,
+ principal_inertia: 7.5,
+ })
})
- .insert(ReadMassProperties::default())
- .insert(RigidBody::Dynamic)
- .insert(Replicated);
+ .insert(Replicated)
+ .insert(Player {
+ client: joined_player,
+ });
}
}=
\ No newline at end of file
M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +3 -2
@@ 3,7 3,7 @@ use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use bevy_replicon::prelude::{AppRuleExt, Channel, ClientEventAppExt};
use crate::config::planet::Planet;
-use crate::ecs::{Ball, Ground, Part, SendBallHere};
+use crate::ecs::{Ball, Ground, Part, Player, SendBallHere};
pub struct SharedPluginGroup;
@@ 26,7 26,8 @@ pub fn register_everything(app: &mut App) {
.replicate::<Ground>()
.replicate::<Collider>()
.replicate::<Planet>()
- .replicate::<Part>();
+ .replicate::<Part>()
+ .replicate::<Player>();
}
fn physics_setup_plugin(mut app: &mut App) {