Skip to content

Commit 11a56f3

Browse files
committed
fix: regenerate navmesh if already exists
1 parent ba35327 commit 11a56f3

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

src/enemy/spawn/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
},
99
nav_mesh_pathfinding::{ArchipelagoRef, ENEMY_AGENT_RADIUS},
1010
};
11-
use avian3d::math::PI;
11+
use avian3d::{math::PI, prelude::LinearVelocity};
1212
use bevy::prelude::*;
1313
use bevy_landmass::{
1414
Agent, Agent3dBundle, AgentSettings, AgentTarget3d, ArchipelagoRef3d,
@@ -138,6 +138,7 @@ fn handle_spawn_enemies_at_enemy_spawn_locations_message(
138138
TimerMode::Repeating,
139139
)),
140140
Visibility::Visible,
141+
LinearVelocity::ZERO,
141142
))
142143
.with_child((
143144
Transform {

src/game_flow/systems.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use bevy::{
33
prelude::*,
44
window::{CursorGrabMode, CursorOptions, PrimaryWindow},
55
};
6-
use bevy_rerecast::prelude::NavmeshReady;
6+
use bevy_rerecast::{Navmesh, prelude::NavmeshReady};
77

88
use crate::{
99
enemy::Enemy,
@@ -12,6 +12,7 @@ use crate::{
1212
game_mode::StartGameModeMessage,
1313
states::{GameLoadingState, InGameState, SelectedMapState},
1414
},
15+
nav_mesh_pathfinding::NavMeshHandle,
1516
player::{Player, camera::components::FreeCam},
1617
user_interface::main_menu::MainMenuCamera,
1718
world::resources::WorldSceneHandle,
@@ -126,11 +127,24 @@ pub fn check_collider_constructor_hierarchy_ready(
126127
}
127128

128129
pub fn check_navmesh_ready(
129-
_: On<NavmeshReady>,
130+
trigger: On<NavmeshReady>,
131+
mut commands: Commands,
130132
mut next_game_loading_state: ResMut<NextState<GameLoadingState>>,
133+
mut nav_meshes: ResMut<Assets<Navmesh>>,
131134
) {
135+
let Some(nav_mesh_handle) = nav_meshes.get_strong_handle(trigger.0) else {
136+
panic!(
137+
"Got navmeshready event but the Handle could not be found using \
138+
the asset id from the trigger"
139+
);
140+
};
141+
132142
info!("Navmesh is now ready!");
133143
next_game_loading_state.set(GameLoadingState::NavMeshReady);
144+
145+
// need to store it in our own resource so we can call regenerate when a new map is selected
146+
commands.insert_resource(NavMeshHandle(nav_mesh_handle));
147+
info!("Stored navmesh handle in our own resource, `NavMeshHandle`");
134148
}
135149

136150
pub fn on_game_loading_state_nav_mesh_ready(

src/nav_mesh_pathfinding/mod.rs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,32 +27,46 @@ impl Plugin for NavMeshPathfindingPlugin {
2727
}
2828
}
2929

30+
#[derive(Resource)]
31+
pub struct NavMeshHandle(pub Handle<Navmesh>);
32+
3033
#[derive(Resource)]
3134
pub struct ArchipelagoRef(pub Entity);
3235

3336
fn generate_navmesh_when_map_colliders_ready(
3437
mut commands: Commands,
3538
mut generator: NavmeshGenerator,
39+
maybe_existing_nav_mesh: Option<Res<NavMeshHandle>>,
3640
) {
37-
let archipelago_id = commands
38-
.spawn(Archipelago3d::new(ArchipelagoOptions::from_agent_radius(
39-
ENEMY_AGENT_RADIUS,
40-
)))
41-
.id();
42-
commands.insert_resource(ArchipelagoRef(archipelago_id));
43-
44-
let navmesh = generator.generate(NavmeshSettings {
41+
let nav_mesh_settings = NavmeshSettings {
4542
agent_radius: ENEMY_AGENT_RADIUS,
4643
..default()
47-
});
44+
};
4845

49-
commands.spawn(DetailNavmeshGizmo::new(&navmesh));
46+
if let Some(existing_nav_mesh) = maybe_existing_nav_mesh {
47+
info!("Nav mesh already exists, regenerating!");
48+
generator.regenerate(&existing_nav_mesh.0, nav_mesh_settings);
49+
} else {
50+
let archipelago_id = commands
51+
.spawn(Archipelago3d::new(ArchipelagoOptions::from_agent_radius(
52+
ENEMY_AGENT_RADIUS,
53+
)))
54+
.id();
55+
commands.insert_resource(ArchipelagoRef(archipelago_id));
5056

51-
commands.spawn(Island3dBundle {
52-
island: Island,
53-
archipelago_ref: ArchipelagoRef3d::new(archipelago_id),
54-
nav_mesh: NavMeshHandle3d(navmesh),
55-
});
57+
let navmesh = generator.generate(NavmeshSettings {
58+
agent_radius: ENEMY_AGENT_RADIUS,
59+
..default()
60+
});
61+
62+
commands.spawn(DetailNavmeshGizmo::new(&navmesh));
63+
64+
commands.spawn(Island3dBundle {
65+
island: Island,
66+
archipelago_ref: ArchipelagoRef3d::new(archipelago_id),
67+
nav_mesh: NavMeshHandle3d(navmesh),
68+
});
69+
}
5670
}
5771

5872
fn update_agent_velocity(

0 commit comments

Comments
 (0)