From 20888482aed16df7da3e2b3736306799e5601036 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Sun, 3 May 2009 21:42:39 +0000 Subject: [PATCH] BGE: fix a crash with previous scene destruction speed up commit when sensors and controllers are cross connected between objects. --- source/gameengine/GameLogic/SCA_LogicManager.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp index 0b549ded474..c43875a0047 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.cpp +++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp @@ -193,10 +193,20 @@ void SCA_LogicManager::RemoveSensor(SCA_ISensor* sensor) void SCA_LogicManager::RemoveController(SCA_IController* controller) { + sensormap_t::iterator sit; + sit = m_sensorcontrollermapje.begin(); + if (sit==m_sensorcontrollermapje.end()) + { + //TRICK: either there is no sensor at all, or the scene is being deleted + //(see KX_Scene::~KX_Scene()). In the first case, this is harmless. + //In the second case, we cannot rely on the sensor being still available, + //make the controller inactive to avoid link count. + //Need a better solution, maybe something similar to m_removedActuators. + controller->SetActive(false); + } controller->UnlinkAllSensors(); controller->UnlinkAllActuators(); - sensormap_t::iterator sit; - for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit) + for (;!(sit==m_sensorcontrollermapje.end());++sit) { (*sit).second.remove(controller); }