Seperated locked and lock level, to allow for relocking doors to previous lock level.

The data is stored in the esm as -lockLevel if unlocked; lockLevel if locked. While not tested, it should not present any problems.
actorid
Thomas 11 years ago
parent e71a119c23
commit cac8e52154

@ -111,7 +111,7 @@ namespace MWClass
MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayerPtr();
MWWorld::InventoryStore& invStore = MWWorld::Class::get(player).getInventoryStore(player);
bool needKey = ptr.getCellRef().mLockLevel>0;
bool needKey = ptr.getCellRef().mLocked;
bool hasKey = false;
std::string keyName;
@ -132,7 +132,7 @@ namespace MWClass
if (needKey && hasKey)
{
MWBase::Environment::get().getWindowManager ()->messageBox (keyName + " #{sKeyUsed}");
ptr.getCellRef().mLockLevel = 0;
unlock(ptr);
// using a key disarms the trap
ptr.getCellRef().mTrap = "";
}
@ -209,7 +209,7 @@ namespace MWClass
info.caption = ref->mBase->mName;
std::string text;
if (ref->mRef.mLockLevel > 0)
if (ref->mRef.mLocked)
text += "\n#{sLockLevel}: " + MWGui::ToolTips::toString(ref->mRef.mLockLevel);
if (ref->mRef.mTrap != "")
text += "\n#{sTrapped}";
@ -240,15 +240,22 @@ namespace MWClass
void Container::lock (const MWWorld::Ptr& ptr, int lockLevel) const
{
if (lockLevel<0)
lockLevel = 0;
ptr.getCellRef().mLockLevel = lockLevel;
ptr.getCellRef().mLocked = true;
if(lockLevel>=0) //Lock level setting left as most of the code relies on this
ptr.getCellRef().mLockLevel = lockLevel;
}
void Container::unlock (const MWWorld::Ptr& ptr) const
{
ptr.getCellRef().mLockLevel = 0;
ptr.getCellRef().mLocked= false;
}
void Container::changeLockLevel(const MWWorld::Ptr& ptr, int lockLevel, bool doLock) {
if (lockLevel<0)
lockLevel = 0;
ptr.getCellRef().mLockLevel = lockLevel;
if(doLock) lock(ptr);
}
MWWorld::Ptr

@ -48,12 +48,15 @@ namespace MWClass
///< Returns total weight of objects inside this object (including modifications from magic
/// effects). Throws an exception, if the object can't hold other objects.
virtual void lock (const MWWorld::Ptr& ptr, int lockLevel) const;
virtual void lock (const MWWorld::Ptr& ptr, int lockLevel = -999) const;
///< Lock object
virtual void unlock (const MWWorld::Ptr& ptr) const;
///< Unlock object
///Changes the lock level of the object
virtual void changeLockLevel(const MWWorld::Ptr& ptr, int lockLevel, bool lock=true);
virtual void readAdditionalState (const MWWorld::Ptr& ptr, const ESM::ObjectState& state)
const;
///< Read additional state from \a state into \a ptr.

@ -76,7 +76,7 @@ namespace MWClass
MWWorld::ContainerStore &invStore = get(actor).getContainerStore(actor);
bool needKey = ptr.getCellRef().mLockLevel>0;
bool needKey = ptr.getCellRef().mLocked;
bool hasKey = false;
std::string keyName;
@ -98,7 +98,7 @@ namespace MWClass
{
if(actor == MWBase::Environment::get().getWorld()->getPlayerPtr())
MWBase::Environment::get().getWindowManager()->messageBox(keyName + " #{sKeyUsed}");
ptr.getCellRef().mLockLevel = 0;
unlock(ptr); //Call the function here. because that makes sense.
// using a key disarms the trap
ptr.getCellRef().mTrap = "";
}
@ -158,15 +158,22 @@ namespace MWClass
void Door::lock (const MWWorld::Ptr& ptr, int lockLevel) const
{
ptr.getCellRef().mLocked = true;
if(lockLevel>=0) //Lock level setting left as most of the code relies on this
ptr.getCellRef().mLockLevel = lockLevel;
}
void Door::changeLockLevel(const MWWorld::Ptr& ptr, int lockLevel, bool doLock) const{
if (lockLevel<0)
lockLevel = 0;
ptr.getCellRef().mLockLevel = lockLevel;
if(doLock) lock(ptr); //A change in lock level almost always nesesitates a lock
}
void Door::unlock (const MWWorld::Ptr& ptr) const
{
ptr.getCellRef().mLockLevel = 0;
ptr.getCellRef().mLocked = false;
}
std::string Door::getScript (const MWWorld::Ptr& ptr) const
@ -208,7 +215,7 @@ namespace MWClass
text += "\n" + getDestination(*ref);
}
if (ref->mRef.mLockLevel > 0)
if (ref->mRef.mLocked == true)
text += "\n#{sLockLevel}: " + MWGui::ToolTips::toString(ref->mRef.mLockLevel);
if (ref->mRef.mTrap != "")
text += "\n#{sTrapped}";

@ -36,18 +36,22 @@ namespace MWClass
static std::string getDestination (const MWWorld::LiveCellRef<ESM::Door>& door);
///< @return destination cell name or token
virtual void lock (const MWWorld::Ptr& ptr, int lockLevel) const;
virtual void lock (const MWWorld::Ptr& ptr, int lockLevel = -999) const;
///< Lock object
virtual void unlock (const MWWorld::Ptr& ptr) const;
///< Unlock object
///Change the lock level
virtual void changeLockLevel(const MWWorld::Ptr& ptr, int lockLevel, bool lock=true) const;
virtual std::string getScript (const MWWorld::Ptr& ptr) const;
///< Return name of the script attached to ptr
static void registerSelf();
virtual std::string getModel(const MWWorld::Ptr &ptr) const;
private:
};
}

@ -29,7 +29,7 @@ namespace MWMechanics
void Security::pickLock(const MWWorld::Ptr &lock, const MWWorld::Ptr &lockpick,
std::string& resultMessage, std::string& resultSound)
{
if (lock.getCellRef().mLockLevel <= 0)
if (!lock.getCellRef().mLocked)
return;
int lockStrength = lock.getCellRef().mLockLevel;

@ -420,6 +420,7 @@ namespace MWMechanics
{
if (effectId == ESM::MagicEffect::Lock)
{
target.getCellRef().mLocked = true;
if (target.getCellRef().mLockLevel < magnitude)
target.getCellRef().mLockLevel = magnitude;
}
@ -427,12 +428,12 @@ namespace MWMechanics
{
if (target.getCellRef().mLockLevel <= magnitude)
{
if (target.getCellRef().mLockLevel > 0)
if (target.getCellRef().mLocked)
{
MWBase::Environment::get().getSoundManager()->playSound3D(target, "Open Lock", 1.f, 1.f);
MWBase::Environment::get().getMechanicsManager()->objectOpened(caster, target);
}
target.getCellRef().mLockLevel = 0;
target.getCellRef().mLocked=false;
}
else
MWBase::Environment::get().getSoundManager()->playSound3D(target, "Open Lock Fail", 1.f, 1.f);

@ -131,7 +131,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
Interpreter::Type_Integer lockLevel = 100;
Interpreter::Type_Integer lockLevel = ptr.getCellRef().mLockLevel;
if (arg0==1)
{
@ -283,7 +283,7 @@ namespace MWScript
virtual void execute (Interpreter::Runtime& runtime)
{
// We are ignoring the DontSaveObject statement for now. Probably not worth
/// bothering with. The incompatibility we are creating should be marginal at most.
// bothering with. The incompatibility we are creating should be marginal at most.
}
};
@ -320,7 +320,7 @@ namespace MWScript
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push (ptr.getCellRef ().mLockLevel > 0);
runtime.push (ptr.getCellRef().mLocked);
}
};

@ -137,6 +137,11 @@ namespace MWWorld
throw std::runtime_error ("class does not support locking");
}
void Class::setLockLevel (const Ptr& ptr, int lockLevel) const
{
throw std::runtime_error ("class does not support setting lock level");
}
void Class::unlock (const Ptr& ptr) const
{
throw std::runtime_error ("class does not support unlocking");
@ -397,7 +402,7 @@ namespace MWWorld
void Class::writeAdditionalState (const MWWorld::Ptr& ptr, ESM::ObjectState& state) const {}
int Class::getBaseGold(const MWWorld::Ptr& ptr) const
int Class::getBaseGold(const MWWorld::Ptr& ptr) const
{
throw std::runtime_error("class does not support base gold");
}

@ -165,6 +165,8 @@ namespace MWWorld
virtual void lock (const Ptr& ptr, int lockLevel) const;
///< Lock object (default implementation: throw an exception)
virtual void setLockLevel(const Ptr& ptr, int lockLevel) const;
virtual void unlock (const Ptr& ptr) const;
///< Unlock object (default implementation: throw an exception)

@ -76,6 +76,7 @@ namespace MWWorld
cellRef.mEnchantmentCharge = -1;
cellRef.mTeleport = false;
cellRef.mLockLevel = 0;
cellRef.mLocked = false;
cellRef.mReferenceBlocked = 0;
mPtr.getRefData().setCount(count);
}

Loading…
Cancel
Save