mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-21 06:09:42 +00:00
Properly update the Ptr object in the mechanics manager when moving across cells
This commit is contained in:
parent
ff1ecb85c6
commit
48271e49ec
10 changed files with 26 additions and 14 deletions
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue