forked from teamnwah/openmw-tes3coop
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;
|
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;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue