Skip to content

Commit a2f1e8d

Browse files
Client / Server refactoring (#17)
* Update server * Simplify server * Implement chunk serde serialization * Implement serverside ChunkRequest event * Refactor chunk definition * Fix linter * Implement chunk response handling (almost) * Update ChunkResponse message channel_id * Fix linter, attempt fix max memory * Attempt update channel configuration * wip * Implement chunk batch request * Attempt fix batches * Fix merge conflicts * Fix linter * Add terrain ready event, refactor * Refactor * Rework systems * Refactor * Fix linter
1 parent 42d8d65 commit a2f1e8d

File tree

22 files changed

+580
-82
lines changed

22 files changed

+580
-82
lines changed

Cargo.lock

Lines changed: 10 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ bevy_renet = {version = "0.0.11", features = ["serde"]}
1616
bincode = "1.3.3"
1717
rand = "0.8.5"
1818
renet = "0.0.15"
19-
serde = "1.0.203"
20-
serde_repr = "0.1"
19+
serde = { version = "1.0.203", features = ["derive"] }
20+
serde-big-array = "0.5.1"
2121

2222
[profile.dev.package."*"]
2323
opt-level = 3

src/client/networking/mod.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
pub mod systems;
22

3+
use renet::{ChannelConfig, SendType};
4+
35
use crate::prelude::*;
46

57
const SERVER_ADDR: &str = "127.0.0.1:5000";
@@ -9,7 +11,36 @@ impl Plugin for NetworkingPlugin {
911
fn build(&self, app: &mut App) {
1012
app.add_plugins((RenetClientPlugin, NetcodeClientPlugin));
1113

12-
let client = RenetClient::new(ConnectionConfig::default());
14+
let channel_config_unreliable = ChannelConfig {
15+
channel_id: 0,
16+
max_memory_usage_bytes: 1000 * 1024 * 1024,
17+
send_type: SendType::Unreliable,
18+
};
19+
20+
let channel_config_reliable_ordered = ChannelConfig {
21+
channel_id: 1,
22+
max_memory_usage_bytes: 1000 * 1024 * 1024,
23+
send_type: SendType::ReliableOrdered {
24+
resend_time: Duration::from_millis(300),
25+
},
26+
};
27+
28+
let channel_config_reliable_unordered = ChannelConfig {
29+
channel_id: 2,
30+
max_memory_usage_bytes: 1000 * 1024 * 1024,
31+
send_type: SendType::ReliableUnordered {
32+
resend_time: Duration::from_millis(300),
33+
},
34+
};
35+
36+
let client = RenetClient::new(ConnectionConfig {
37+
client_channels_config: Vec::from([
38+
channel_config_unreliable,
39+
channel_config_reliable_ordered,
40+
channel_config_reliable_unordered,
41+
]),
42+
..Default::default()
43+
});
1344
app.insert_resource(client);
1445

1546
let client_id = rand::random::<u64>();

src/client/networking/systems.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
use crate::prelude::*;
22

3+
#[allow(clippy::too_many_arguments)]
34
pub fn receive_message_system(
45
mut client: ResMut<RenetClient>,
56
mut player_spawn_events: ResMut<Events<remote_player_events::RemotePlayerSpawnedEvent>>,
67
mut player_despawn_events: ResMut<Events<remote_player_events::RemotePlayerDespawnedEvent>>,
78
mut player_sync_events: ResMut<Events<remote_player_events::RemotePlayerSyncEvent>>,
89
mut block_update_events: ResMut<Events<terrain_events::BlockUpdateEvent>>,
10+
mut chunk_manager: ResMut<terrain_resources::ChunkManager>,
11+
mut chunk_mesh_events: ResMut<Events<terrain_events::ChunkMeshUpdateEvent>>,
12+
mut spawn_area_loaded: ResMut<terrain_resources::SpawnAreaLoaded>,
913
) {
1014
while let Some(message) = client.receive_message(DefaultChannel::ReliableOrdered) {
1115
let message = bincode::deserialize(&message).unwrap();
@@ -46,6 +50,29 @@ pub fn receive_message_system(
4650
if let Ok(message) = message {
4751
debug!("Received message: {:?}", message);
4852
match message {
53+
lib::NetworkingMessage::ChunkBatchResponse(chunks) => {
54+
info!("Client received chunk batch response message.");
55+
for chunk in chunks {
56+
info!(
57+
"Client received chunk response message for: {:?}",
58+
chunk.position
59+
);
60+
let chunk_position = chunk.position;
61+
chunk_manager.insert_chunk(chunk);
62+
chunk_mesh_events.send(terrain_events::ChunkMeshUpdateEvent {
63+
position: chunk_position,
64+
});
65+
66+
if chunk_position.eq(&Vec3 {
67+
x: 0.0,
68+
y: 0.0,
69+
z: 0.0,
70+
}) {
71+
info!("Spawn area loaded.");
72+
spawn_area_loaded.0 = true;
73+
}
74+
}
75+
}
4976
lib::NetworkingMessage::PlayerSync(event) => {
5077
player_sync_events
5178
.send(remote_player_events::RemotePlayerSyncEvent { players: event });

src/client/player/mod.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ pub struct PlayerPlugin;
99

1010
impl Plugin for PlayerPlugin {
1111
fn build(&self, app: &mut App) {
12+
debug!("Building PlayerPlugin");
13+
info!("Building PlayerPlugin");
1214
app.add_plugins(FpsControllerPlugin);
1315
app.add_plugins(RapierPhysicsPlugin::<NoUserData>::default());
1416
app.add_plugins(RapierDebugRenderPlugin::default());
1517
app.insert_resource(RapierConfiguration {
16-
gravity: Vec3::new(0., -1.6, 0.),
18+
gravity: Vec3::new(0., 0.0, 0.),
1719
physics_pipeline_active: true,
1820
force_update_from_transform_changes: false,
1921
scaled_shape_subdivision: 1,
@@ -25,14 +27,21 @@ impl Plugin for PlayerPlugin {
2527
});
2628
app.add_event::<player_events::PlayerColliderUpdateEvent>();
2729
app.insert_resource(player_resources::BlockSelection::new());
30+
app.insert_resource(player_resources::PlayerSpawned(false));
2831
app.insert_resource(player_resources::LastPlayerPosition::new());
2932
app.add_systems(
3033
Startup,
3134
(
32-
player_systems::setup_controller_system,
3335
player_systems::setup_highlight_cube_system,
36+
player_systems::setup_player_camera,
3437
),
3538
);
39+
app.add_systems(
40+
Update,
41+
(player_systems::setup_controller_on_area_ready_system,)
42+
.run_if(terrain_resources::SpawnAreaLoaded::is_loaded)
43+
.run_if(player_resources::PlayerSpawned::is_not_spawned),
44+
);
3645
app.add_systems(
3746
Update,
3847
(
@@ -44,7 +53,8 @@ impl Plugin for PlayerPlugin {
4453
player_systems::handle_block_update_events,
4554
player_systems::broadcast_player_attributes_system,
4655
player_systems::handle_player_collider_events_system,
47-
),
56+
)
57+
.run_if(player_resources::PlayerSpawned::is_spawned),
4858
);
4959
}
5060
}

src/client/player/resources.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ pub struct BlockSelection {
66
pub normal: Option<Vec3>,
77
}
88

9+
#[derive(Resource)]
10+
pub struct PlayerSpawned(pub bool);
11+
12+
impl PlayerSpawned {
13+
pub fn is_spawned(resource: Res<PlayerSpawned>) -> bool {
14+
resource.0
15+
}
16+
17+
pub fn is_not_spawned(resource: Res<PlayerSpawned>) -> bool {
18+
!resource.0
19+
}
20+
}
21+
922
impl Default for BlockSelection {
1023
fn default() -> Self {
1124
Self::new()

src/client/player/systems/controller.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
use crate::prelude::*;
22

3-
const SPAWN_POINT: Vec3 = Vec3::new(0.0, 20.0, 0.0);
3+
const SPAWN_POINT: Vec3 = Vec3::new(0.0, 32.0, 0.0);
44

5-
pub fn setup_controller_system(mut commands: Commands, mut window: Query<&mut Window>) {
6-
let mut window = window.single_mut();
7-
window.title = String::from("Minimal FPS Controller Example");
5+
pub fn setup_player_camera(mut commands: Commands) {
6+
commands.spawn((
7+
Camera3dBundle {
8+
projection: Projection::Perspective(PerspectiveProjection {
9+
fov: TAU / 5.0,
10+
..default()
11+
}),
12+
..default()
13+
},
14+
RenderPlayer {
15+
logical_entity: Entity::from_raw(0),
16+
},
17+
));
18+
}
19+
20+
pub fn setup_controller_on_area_ready_system(
21+
mut commands: Commands,
22+
mut player_spawned: ResMut<player_resources::PlayerSpawned>,
23+
mut render_player: Query<&mut RenderPlayer>,
24+
) {
25+
info!("Setting up controller");
826

927
let logical_entity = commands
1028
.spawn((
@@ -47,16 +65,10 @@ pub fn setup_controller_system(mut commands: Commands, mut window: Query<&mut Wi
4765
.insert(player_components::Player)
4866
.id();
4967

50-
commands.spawn((
51-
Camera3dBundle {
52-
projection: Projection::Perspective(PerspectiveProjection {
53-
fov: TAU / 5.0,
54-
..default()
55-
}),
56-
..default()
57-
},
58-
RenderPlayer { logical_entity },
59-
));
68+
let mut player = render_player.single_mut();
69+
player.logical_entity = logical_entity;
70+
71+
player_spawned.0 = true;
6072
}
6173

6274
pub fn handle_controller_movement_system(

src/client/prelude.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// my crates
2-
pub use crate::terrain::util::chunk::CHUNK_SIZE;
32
pub use rsmc as lib;
43
pub use rsmc::BlockId;
54
pub use rsmc::NetworkingMessage;
5+
pub use rsmc::CHUNK_SIZE;
66

77
pub use crate::collider::components as collider_components;
88
pub use crate::collider::events as collider_events;
@@ -64,8 +64,8 @@ pub use iyes_perf_ui::prelude::*;
6464
pub use iyes_perf_ui::PerfUiCompleteBundle;
6565
pub use serde::*;
6666

67+
pub use self::lib::Chunk;
6768
pub use self::terrain_util::Block;
68-
pub use self::terrain_util::Chunk;
6969
pub use bevy::render::mesh::{Indices, PrimitiveTopology};
7070
pub use bevy::render::render_asset::RenderAssetUsages;
7171
pub use noise::NoiseFn;

src/client/terrain/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ pub struct TerrainPlugin;
1010

1111
impl Plugin for TerrainPlugin {
1212
fn build(&self, app: &mut App) {
13+
info!("Building TerrainPlugin");
1314
app.insert_resource(terrain_resources::ChunkManager::new());
15+
app.insert_resource(terrain_resources::SpawnAreaLoaded(false));
1416
app.insert_resource(util::TextureManager::new());
1517
app.add_event::<terrain_events::BlockUpdateEvent>();
1618
app.add_event::<terrain_events::ChunkMeshUpdateEvent>();
17-
app.add_systems(Startup, terrain_systems::setup_world_system);
19+
app.add_systems(Startup, terrain_systems::prepare_spawn_area_system);
20+
app.add_systems(Startup, terrain_systems::generate_world_system);
1821
app.add_systems(Update, terrain_systems::handle_chunk_mesh_update_events);
1922
}
2023
}

0 commit comments

Comments
 (0)