Browse Source

Fix TileMap NavigationServer 'Invalid ID' error

Fixes NavigationServer 'Invalid ID' error of the TileMap.
The issue was not caused directly by the TileMap but with the late call to get_world_2d()->get_navigation_map() while everything is shut down abruptly e.g. game window closed or Editor "Reload Saved Scene" function.
smix8 2 years ago
parent
commit
fef6ffabe5
2 changed files with 6 additions and 2 deletions
  1. 5 2
      scene/2d/tile_map.cpp
  2. 1 0
      scene/2d/tile_map.h

+ 5 - 2
scene/2d/tile_map.cpp

@@ -754,8 +754,9 @@ TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() {
 
 void TileMap::set_navigation_map(int p_layer, RID p_map) {
 	ERR_FAIL_INDEX(p_layer, (int)layers.size());
-
+	ERR_FAIL_COND_MSG(!is_inside_tree(), "A TileMap navigation map can only be changed while inside the SceneTree.");
 	layers[p_layer].navigation_map = p_map;
+	layers[p_layer].uses_world_navigation_map = p_map == get_world_2d()->get_navigation_map();
 }
 
 RID TileMap::get_navigation_map(int p_layer) const {
@@ -1111,10 +1112,12 @@ void TileMap::_navigation_update_layer(int p_layer) {
 		if (p_layer == 0 && is_inside_tree()) {
 			// Use the default World2D navigation map for the first layer when empty.
 			layers[p_layer].navigation_map = get_world_2d()->get_navigation_map();
+			layers[p_layer].uses_world_navigation_map = true;
 		} else {
 			RID new_layer_map = NavigationServer2D::get_singleton()->map_create();
 			NavigationServer2D::get_singleton()->map_set_active(new_layer_map, true);
 			layers[p_layer].navigation_map = new_layer_map;
+			layers[p_layer].uses_world_navigation_map = false;
 		}
 	}
 }
@@ -1124,7 +1127,7 @@ void TileMap::_navigation_cleanup_layer(int p_layer) {
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 
 	if (layers[p_layer].navigation_map.is_valid()) {
-		if (is_inside_tree() && layers[p_layer].navigation_map == get_world_2d()->get_navigation_map()) {
+		if (layers[p_layer].uses_world_navigation_map) {
 			// Do not delete the World2D default navigation map.
 			return;
 		}

+ 1 - 0
scene/2d/tile_map.h

@@ -212,6 +212,7 @@ private:
 		HashMap<Vector2i, TileMapQuadrant> quadrant_map;
 		SelfList<TileMapQuadrant>::List dirty_quadrant_list;
 		RID navigation_map;
+		bool uses_world_navigation_map = false;
 	};
 	LocalVector<TileMapLayer> layers;
 	int selected_layer = -1;