diff --git a/apps/openmw/mwbase/mechanicsmanager.hpp b/apps/openmw/mwbase/mechanicsmanager.hpp index cb9539ef65..b8733259ff 100644 --- a/apps/openmw/mwbase/mechanicsmanager.hpp +++ b/apps/openmw/mwbase/mechanicsmanager.hpp @@ -43,7 +43,7 @@ namespace MWBase virtual void remove (const MWWorld::Ptr& ptr) = 0; ///< Deregister an object for management - virtual void updateCell(const MWWorld::Ptr &ptr) = 0; + virtual void updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr) = 0; ///< Moves an object to a new cell virtual void drop (const MWWorld::CellStore *cellStore) = 0; diff --git a/apps/openmw/mwmechanics/activators.cpp b/apps/openmw/mwmechanics/activators.cpp index 1a743cad59..b67fcb2164 100644 --- a/apps/openmw/mwmechanics/activators.cpp +++ b/apps/openmw/mwmechanics/activators.cpp @@ -26,13 +26,15 @@ void Activators::removeActivator (const MWWorld::Ptr& ptr) mActivators.erase(iter); } -void Activators::updateActivatorCell(const MWWorld::Ptr &ptr) +void Activators::updateActivator(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr) { - PtrControllerMap::iterator iter = mActivators.find(ptr); + PtrControllerMap::iterator iter = mActivators.find(old); if(iter != mActivators.end()) { CharacterController ctrl = iter->second; mActivators.erase(iter); + + ctrl.updatePtr(ptr); mActivators.insert(std::make_pair(ptr, ctrl)); } } diff --git a/apps/openmw/mwmechanics/activators.hpp b/apps/openmw/mwmechanics/activators.hpp index 0b9e984aa6..137674a57a 100644 --- a/apps/openmw/mwmechanics/activators.hpp +++ b/apps/openmw/mwmechanics/activators.hpp @@ -28,8 +28,8 @@ namespace MWMechanics void removeActivator (const MWWorld::Ptr& ptr); ///< Deregister an activator - void updateActivatorCell(const MWWorld::Ptr& ptr); - ///< Updates an activator with a new cell store + void updateActivator(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr); + ///< Updates an activator with a new Ptr void dropActivators (const MWWorld::CellStore *cellStore); ///< Deregister all activators in the given cell. diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index a8c05f17e3..9632bdf769 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -179,13 +179,15 @@ namespace MWMechanics mActors.erase(iter); } - void Actors::updateActorCell(const MWWorld::Ptr &ptr) + void Actors::updateActor(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr) { - PtrControllerMap::iterator iter = mActors.find(ptr); + PtrControllerMap::iterator iter = mActors.find(old); if(iter != mActors.end()) { CharacterController ctrl = iter->second; mActors.erase(iter); + + ctrl.updatePtr(ptr); mActors.insert(std::make_pair(ptr, ctrl)); } } diff --git a/apps/openmw/mwmechanics/actors.hpp b/apps/openmw/mwmechanics/actors.hpp index fbd787e835..fc4af8dd63 100644 --- a/apps/openmw/mwmechanics/actors.hpp +++ b/apps/openmw/mwmechanics/actors.hpp @@ -58,8 +58,8 @@ namespace MWMechanics /// /// \note Ignored, if \a ptr is not a registered actor. - void updateActorCell(const MWWorld::Ptr& ptr); - ///< Updates an actor with a new cell store + void updateActor(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr); + ///< Updates an actor with a new Ptr void dropActors (const MWWorld::CellStore *cellStore); ///< Deregister all actors in the given cell. diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 8f7929805f..ae0114a351 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -131,6 +131,12 @@ CharacterController::~CharacterController() } +void CharacterController::updatePtr(const MWWorld::Ptr &ptr) +{ + mPtr = ptr; +} + + void CharacterController::markerEvent(float time, const std::string &evt) { if(evt == "stop") diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index 2465aea98f..2b3c50864a 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -79,6 +79,8 @@ public: CharacterController(const CharacterController &rhs); virtual ~CharacterController(); + void updatePtr(const MWWorld::Ptr &ptr); + Ogre::Vector3 update(float duration); void playGroup(const std::string &groupname, int mode, int count); diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index eee72f8805..a02b64e9d3 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -191,12 +191,12 @@ namespace MWMechanics mActivators.removeActivator(ptr); } - void MechanicsManager::updateCell(const MWWorld::Ptr &ptr) + void MechanicsManager::updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr) { if(ptr.getTypeName() == typeid(ESM::Activator).name()) - mActivators.updateActivatorCell(ptr); + mActivators.updateActivator(old, ptr); else - mActors.updateActorCell(ptr); + mActors.updateActor(old, ptr); } diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 99010b7ffd..5ad8705719 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -48,7 +48,7 @@ namespace MWMechanics virtual void remove (const MWWorld::Ptr& ptr); ///< Deregister an object for management - virtual void updateCell(const MWWorld::Ptr &ptr); + virtual void updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr); ///< Moves an object to a new cell virtual void drop(const MWWorld::CellStore *cellStore); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index f723934be9..c1725c00c8 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -773,7 +773,7 @@ namespace MWWorld mRendering->updateObjectCell(ptr, copy); MWBase::MechanicsManager *mechMgr = MWBase::Environment::get().getMechanicsManager(); - mechMgr->updateCell(copy); + mechMgr->updateCell(ptr, copy); std::string script = MWWorld::Class::get(ptr).getScript(ptr);