Properly update the Ptr object in the mechanics manager when moving across cells

This commit is contained in:
Chris Robinson 2013-02-25 09:57:34 -08:00
parent ff1ecb85c6
commit 48271e49ec
10 changed files with 26 additions and 14 deletions

View file

@ -43,7 +43,7 @@ namespace MWBase
virtual void remove (const MWWorld::Ptr& ptr) = 0; virtual void remove (const MWWorld::Ptr& ptr) = 0;
///< Deregister an object for management ///< 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 ///< Moves an object to a new cell
virtual void drop (const MWWorld::CellStore *cellStore) = 0; virtual void drop (const MWWorld::CellStore *cellStore) = 0;

View file

@ -26,13 +26,15 @@ void Activators::removeActivator (const MWWorld::Ptr& ptr)
mActivators.erase(iter); 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()) if(iter != mActivators.end())
{ {
CharacterController ctrl = iter->second; CharacterController ctrl = iter->second;
mActivators.erase(iter); mActivators.erase(iter);
ctrl.updatePtr(ptr);
mActivators.insert(std::make_pair(ptr, ctrl)); mActivators.insert(std::make_pair(ptr, ctrl));
} }
} }

View file

@ -28,8 +28,8 @@ namespace MWMechanics
void removeActivator (const MWWorld::Ptr& ptr); void removeActivator (const MWWorld::Ptr& ptr);
///< Deregister an activator ///< Deregister an activator
void updateActivatorCell(const MWWorld::Ptr& ptr); void updateActivator(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr);
///< Updates an activator with a new cell store ///< Updates an activator with a new Ptr
void dropActivators (const MWWorld::CellStore *cellStore); void dropActivators (const MWWorld::CellStore *cellStore);
///< Deregister all activators in the given cell. ///< Deregister all activators in the given cell.

View file

@ -179,13 +179,15 @@ namespace MWMechanics
mActors.erase(iter); 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()) if(iter != mActors.end())
{ {
CharacterController ctrl = iter->second; CharacterController ctrl = iter->second;
mActors.erase(iter); mActors.erase(iter);
ctrl.updatePtr(ptr);
mActors.insert(std::make_pair(ptr, ctrl)); mActors.insert(std::make_pair(ptr, ctrl));
} }
} }

View file

@ -58,8 +58,8 @@ namespace MWMechanics
/// ///
/// \note Ignored, if \a ptr is not a registered actor. /// \note Ignored, if \a ptr is not a registered actor.
void updateActorCell(const MWWorld::Ptr& ptr); void updateActor(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr);
///< Updates an actor with a new cell store ///< Updates an actor with a new Ptr
void dropActors (const MWWorld::CellStore *cellStore); void dropActors (const MWWorld::CellStore *cellStore);
///< Deregister all actors in the given cell. ///< Deregister all actors in the given cell.

View file

@ -131,6 +131,12 @@ CharacterController::~CharacterController()
} }
void CharacterController::updatePtr(const MWWorld::Ptr &ptr)
{
mPtr = ptr;
}
void CharacterController::markerEvent(float time, const std::string &evt) void CharacterController::markerEvent(float time, const std::string &evt)
{ {
if(evt == "stop") if(evt == "stop")

View file

@ -79,6 +79,8 @@ public:
CharacterController(const CharacterController &rhs); CharacterController(const CharacterController &rhs);
virtual ~CharacterController(); virtual ~CharacterController();
void updatePtr(const MWWorld::Ptr &ptr);
Ogre::Vector3 update(float duration); Ogre::Vector3 update(float duration);
void playGroup(const std::string &groupname, int mode, int count); void playGroup(const std::string &groupname, int mode, int count);

View file

@ -191,12 +191,12 @@ namespace MWMechanics
mActivators.removeActivator(ptr); 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()) if(ptr.getTypeName() == typeid(ESM::Activator).name())
mActivators.updateActivatorCell(ptr); mActivators.updateActivator(old, ptr);
else else
mActors.updateActorCell(ptr); mActors.updateActor(old, ptr);
} }

View file

@ -48,7 +48,7 @@ namespace MWMechanics
virtual void remove (const MWWorld::Ptr& ptr); virtual void remove (const MWWorld::Ptr& ptr);
///< Deregister an object for management ///< 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 ///< Moves an object to a new cell
virtual void drop(const MWWorld::CellStore *cellStore); virtual void drop(const MWWorld::CellStore *cellStore);

View file

@ -773,7 +773,7 @@ namespace MWWorld
mRendering->updateObjectCell(ptr, copy); mRendering->updateObjectCell(ptr, copy);
MWBase::MechanicsManager *mechMgr = MWBase::Environment::get().getMechanicsManager(); MWBase::MechanicsManager *mechMgr = MWBase::Environment::get().getMechanicsManager();
mechMgr->updateCell(copy); mechMgr->updateCell(ptr, copy);
std::string script = std::string script =
MWWorld::Class::get(ptr).getScript(ptr); MWWorld::Class::get(ptr).getScript(ptr);