mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-03 17:54:06 +00:00
Fix AI moving load doors and throw an exception when trying to do this (Fixes #1907)
This commit is contained in:
parent
36a90198e2
commit
f3d4b63aaf
@ -396,6 +396,7 @@ namespace MWBase
|
||||
virtual void activateDoor(const MWWorld::Ptr& door) = 0;
|
||||
/// update movement state of a non-teleport door as specified
|
||||
/// @param state see MWClass::setDoorState
|
||||
/// @note throws an exception when invoked on a teleport door
|
||||
virtual void activateDoor(const MWWorld::Ptr& door, int state) = 0;
|
||||
|
||||
virtual bool getPlayerStandingOn (const MWWorld::Ptr& object) = 0; ///< @return true if the player is standing on \a object
|
||||
|
@ -324,6 +324,9 @@ namespace MWClass
|
||||
|
||||
void Door::setDoorState (const MWWorld::Ptr &ptr, int state) const
|
||||
{
|
||||
if (ptr.getCellRef().getTeleport())
|
||||
throw std::runtime_error("load doors can't be moved");
|
||||
|
||||
ensureCustomData(ptr);
|
||||
DoorCustomData& customData = dynamic_cast<DoorCustomData&>(*ptr.getRefData().getCustomData());
|
||||
customData.mDoorState = state;
|
||||
|
@ -97,7 +97,7 @@ bool MWMechanics::AiPackage::pathTo(const MWWorld::Ptr& actor, ESM::Pathgrid::Po
|
||||
MWWorld::Ptr door = getNearbyDoor(actor);
|
||||
if(door != MWWorld::Ptr()) // NOTE: checks interior cells only
|
||||
{
|
||||
if(door.getCellRef().getTrap().empty() && door.getClass().getDoorState(door) == 0) { //Open the door if untrapped
|
||||
if(!door.getCellRef().getTeleport() && door.getCellRef().getTrap().empty() && door.getClass().getDoorState(door) == 0) { //Open the door if untrapped
|
||||
MWBase::Environment::get().getWorld()->activateDoor(door, 1);
|
||||
}
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ namespace MWScript
|
||||
|
||||
// Instantly reset door to closed state
|
||||
// This is done when using Lock in scripts, but not when using Lock spells.
|
||||
if (ptr.getTypeName() == typeid(ESM::Door).name())
|
||||
if (ptr.getTypeName() == typeid(ESM::Door).name() && !ptr.getCellRef().getTeleport())
|
||||
{
|
||||
MWBase::Environment::get().getWorld()->activateDoor(ptr, 0);
|
||||
MWBase::Environment::get().getWorld()->localRotateObject(ptr, 0, 0, 0);
|
||||
|
@ -477,6 +477,7 @@ namespace MWWorld
|
||||
|
||||
/// update movement state of a non-teleport door as specified
|
||||
/// @param state see MWClass::setDoorState
|
||||
/// @note throws an exception when invoked on a teleport door
|
||||
virtual void activateDoor(const MWWorld::Ptr& door, int state);
|
||||
|
||||
virtual bool getPlayerStandingOn (const MWWorld::Ptr& object); ///< @return true if the player is standing on \a object
|
||||
|
Loading…
x
Reference in New Issue
Block a user