diff --git a/src/collision/collision_object.cpp b/src/collision/collision_object.cpp index 9285c3675fe..04b0bca24b4 100644 --- a/src/collision/collision_object.cpp +++ b/src/collision/collision_object.cpp @@ -66,6 +66,12 @@ CollisionObject::collision_moving_object_bottom(CollisionObject& other) } } +void +CollisionObject::notify_object_removal(CollisionObject* other) +{ + m_objects_hit_bottom.erase(other); +} + void CollisionObject::clear_bottom_collision_list() { diff --git a/src/collision/collision_object.hpp b/src/collision/collision_object.hpp index c53b006f438..73e8847af4f 100644 --- a/src/collision/collision_object.hpp +++ b/src/collision/collision_object.hpp @@ -54,6 +54,8 @@ class CollisionObject /** called when this object, if (moving) static, has collided on its top with a moving object */ void collision_moving_object_bottom(CollisionObject& other); + void notify_object_removal(CollisionObject* other); + void set_ground_movement_manager(const std::shared_ptr& movement_manager) { m_ground_movement_manager = movement_manager; diff --git a/src/collision/collision_system.cpp b/src/collision/collision_system.cpp index cdfca298c68..f15fcc4a028 100644 --- a/src/collision/collision_system.cpp +++ b/src/collision/collision_system.cpp @@ -56,6 +56,14 @@ CollisionSystem::remove(CollisionObject* object) m_objects.erase( std::find(m_objects.begin(), m_objects.end(), object)); + + // FIXME: this is a patch. A better way of fixing this is coming. + for (auto* collision_object : m_objects) { + collision_object->notify_object_removal(object); + } + for (auto* tilemap : m_sector.get_solid_tilemaps()) { + tilemap->notify_object_removal(object); + } } void diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index af61b8a6756..c5472614b56 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -535,6 +535,12 @@ TileMap::hits_object_bottom(CollisionObject& object) m_objects_hit_bottom.insert(&object); } +void +TileMap::notify_object_removal(CollisionObject* other) +{ + m_objects_hit_bottom.erase(other); +} + void TileMap::set_solid(bool solid) { diff --git a/src/object/tilemap.hpp b/src/object/tilemap.hpp index 2e6247e5bae..6a95e04c3f2 100644 --- a/src/object/tilemap.hpp +++ b/src/object/tilemap.hpp @@ -131,6 +131,7 @@ class TileMap final : /** Called by the collision mechanism to indicate that this tilemap has been hit on the top, i.e. has hit a moving object on the bottom of its collision rectangle. */ void hits_object_bottom(CollisionObject& object); + void notify_object_removal(CollisionObject* other); int get_layer() const { return m_z_pos; } void set_layer(int layer_) { m_z_pos = layer_; }