Skip to content

Commit cf19e6f

Browse files
Add terrain ready event, refactor
1 parent 620861a commit cf19e6f

File tree

7 files changed

+60
-12
lines changed

7 files changed

+60
-12
lines changed

src/client/networking/systems.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub fn receive_message_system(
88
mut block_update_events: ResMut<Events<terrain_events::BlockUpdateEvent>>,
99
mut chunk_manager: ResMut<terrain_resources::ChunkManager>,
1010
mut chunk_mesh_events: ResMut<Events<terrain_events::ChunkMeshUpdateEvent>>,
11+
mut spawn_ready_events: ResMut<Events<terrain_events::SpawnAreaReadyEvent>>,
1112
) {
1213
while let Some(message) = client.receive_message(DefaultChannel::ReliableOrdered) {
1314
let message = bincode::deserialize(&message).unwrap();
@@ -59,6 +60,14 @@ pub fn receive_message_system(
5960
chunk_mesh_events.send(terrain_events::ChunkMeshUpdateEvent {
6061
position: chunk_position,
6162
});
63+
64+
if chunk_position.eq(&Vec3 {
65+
x: 0.0,
66+
y: 0.0,
67+
z: 0.0,
68+
}) {
69+
spawn_ready_events.send(terrain_events::SpawnAreaReadyEvent {});
70+
}
6271
}
6372
}
6473
lib::NetworkingMessage::PlayerSync(event) => {

src/client/player/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,11 @@ impl Plugin for PlayerPlugin {
2828
app.add_event::<player_events::PlayerColliderUpdateEvent>();
2929
app.insert_resource(player_resources::BlockSelection::new());
3030
app.insert_resource(player_resources::LastPlayerPosition::new());
31-
app.add_systems(
32-
Startup,
33-
(
34-
player_systems::setup_controller_system,
35-
player_systems::setup_highlight_cube_system,
36-
),
37-
);
31+
app.add_systems(Startup, (player_systems::setup_highlight_cube_system,));
3832
app.add_systems(
3933
Update,
4034
(
35+
player_systems::setup_controller_on_area_ready_system,
4136
player_systems::handle_controller_movement_system,
4237
player_systems::manage_cursor_system,
4338
player_systems::handle_mouse_events_system,

src/client/player/systems/controller.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@ use crate::prelude::*;
22

33
const SPAWN_POINT: Vec3 = Vec3::new(0.0, 20.0, 0.0);
44

5-
pub fn setup_controller_system(mut commands: Commands, mut window: Query<&mut Window>) {
5+
pub fn setup_controller_on_area_ready_system(
6+
mut commands: Commands,
7+
mut window: Query<&mut Window>,
8+
mut spawn_area_ready_events: EventReader<terrain_events::SpawnAreaReadyEvent>,
9+
) {
10+
if spawn_area_ready_events.read().count() == 0 {
11+
return;
12+
}
13+
614
let mut window = window.single_mut();
715
window.title = String::from("Minimal FPS Controller Example");
816

src/client/terrain/events.rs

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

3+
#[derive(Event)]
4+
pub struct SpawnAreaReadyEvent;
5+
36
#[derive(Event)]
47
pub struct ChunkMeshUpdateEvent {
58
pub position: Vec3,

src/client/terrain/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ impl Plugin for TerrainPlugin {
1515
app.insert_resource(util::TextureManager::new());
1616
app.add_event::<terrain_events::BlockUpdateEvent>();
1717
app.add_event::<terrain_events::ChunkMeshUpdateEvent>();
18-
app.add_systems(Startup, terrain_systems::setup_world_system);
18+
app.add_event::<terrain_events::SpawnAreaReadyEvent>();
19+
app.add_systems(Startup, terrain_systems::generate_world_system);
1920
app.add_systems(Update, terrain_systems::handle_chunk_mesh_update_events);
2021
}
2122
}

src/client/terrain/resources.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,23 @@ impl ChunkManager {
3838
chunks
3939
}
4040

41+
pub fn instantiate_new_chunks(
42+
&mut self,
43+
position: Vec3,
44+
render_distance: i32,
45+
) -> Vec<lib::Chunk> {
46+
let chunks = Self::instantiate_chunks(position, render_distance);
47+
48+
chunks
49+
.into_iter()
50+
.filter(|chunk| {
51+
let chunk_position = chunk.position;
52+
let chunk = self.get_chunk(chunk_position);
53+
chunk.is_some()
54+
})
55+
.collect()
56+
}
57+
4158
pub fn insert_chunk(&mut self, chunk: lib::Chunk) {
4259
self.chunks
4360
.insert(Self::position_to_key(chunk.position), chunk);

src/client/terrain/systems.rs

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

3-
pub fn setup_world_system(mut client: ResMut<RenetClient>) {
4-
let render_distance = 4;
3+
pub fn prepare_spawn_area_system(mut client: ResMut<RenetClient>) {
4+
let render_distance = 2;
55

6-
info!("Sending chunk requests for chunks");
6+
info!("Sending chunk requests for spawn area");
77

88
let chunks = terrain_resources::ChunkManager::instantiate_chunks(
99
Vec3::new(0.0, 0.0, 0.0),
1010
render_distance,
1111
);
1212

13+
let positions: Vec<Vec3> = chunks.into_iter().map(|chunk| chunk.position).collect();
14+
let message = bincode::serialize(&NetworkingMessage::ChunkBatchRequest(positions));
15+
client.send_message(DefaultChannel::ReliableUnordered, message.unwrap());
16+
}
17+
18+
pub fn generate_world_system(
19+
mut client: ResMut<RenetClient>,
20+
mut chunk_manager: ResMut<terrain_resources::ChunkManager>,
21+
) {
22+
let render_distance = 6;
23+
24+
info!("Sending chunk requests for chunks");
25+
26+
let chunks = chunk_manager.instantiate_new_chunks(Vec3::new(0.0, 0.0, 0.0), render_distance);
27+
1328
let positions: Vec<Vec3> = chunks.into_iter().map(|chunk| chunk.position).collect();
1429

1530
let batched_positions = positions.chunks(32);

0 commit comments

Comments
 (0)