From cd8ec0c7ed8be29ce5c632c0c0d59f27b3887345 Mon Sep 17 00:00:00 2001 From: En Yi Date: Tue, 15 Aug 2023 19:58:14 +0800 Subject: [PATCH] Fix grid entities set update bug for OOB entities When entities are marked for deletion, the tilecoord components still exists, which can update the grid entities set, even if the entity is not alive --- scenes/engine/collisions.c | 13 ++++++++----- scenes/game_systems.c | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/scenes/engine/collisions.c b/scenes/engine/collisions.c index 6bef940..ee71f9d 100644 --- a/scenes/engine/collisions.c +++ b/scenes/engine/collisions.c @@ -4,12 +4,15 @@ void remove_entity_from_tilemap(EntityManager_t *p_manager, TileGrid_t* tilemap, Entity_t* p_ent) { CTileCoord_t* p_tilecoord = get_component(p_ent, CTILECOORD_COMP_T); - for (size_t i = 0;i < p_tilecoord->n_tiles; ++i) + if (p_tilecoord != NULL) { - // Use previously store tile position - // Clear from those positions - unsigned int tile_idx = p_tilecoord->tiles[i]; - sc_map_del_64v(&(tilemap->tiles[tile_idx].entities_set), p_ent->m_id); + for (size_t i = 0;i < p_tilecoord->n_tiles; ++i) + { + // Use previously store tile position + // Clear from those positions + unsigned int tile_idx = p_tilecoord->tiles[i]; + sc_map_del_64v(&(tilemap->tiles[tile_idx].entities_set), p_ent->m_id); + } } remove_entity(p_manager, p_ent->m_id); } diff --git a/scenes/game_systems.c b/scenes/game_systems.c index b7d85e6..a14a0cd 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -1305,6 +1305,7 @@ void update_tilemap_system(Scene_t* scene) sc_map_foreach(&scene->ent_manager.component_map[CTILECOORD_COMP_T], ent_idx, p_tilecoord) { Entity_t* p_ent = get_entity(&scene->ent_manager, ent_idx); + if (!p_ent->m_alive) continue; CTransform_t* p_ctransform = get_component(p_ent, CTRANSFORM_COMP_T); if (p_ctransform == NULL) continue; CBBox_t* p_bbox = get_component(p_ent, CBBOX_COMP_T);