From 7c8b82f45cb8228b9366aedb714ed7e0114794d0 Mon Sep 17 00:00:00 2001
From: Evil Eye <malusluminis@hotmail.com>
Date: Tue, 17 Sep 2019 20:30:37 +0200
Subject: [PATCH] move locking behaviour to cellref

---
 apps/openmw/mwclass/container.cpp               |  2 +-
 apps/openmw/mwclass/door.cpp                    |  2 +-
 apps/openmw/mwmechanics/mechanicsmanagerimp.cpp |  2 +-
 apps/openmw/mwmechanics/security.cpp            |  2 +-
 apps/openmw/mwmechanics/spellcasting.cpp        |  4 ++--
 apps/openmw/mwscript/miscextensions.cpp         |  4 ++--
 apps/openmw/mwworld/cellref.cpp                 | 13 +++++++++++++
 apps/openmw/mwworld/cellref.hpp                 |  2 ++
 apps/openmw/mwworld/class.cpp                   | 14 --------------
 apps/openmw/mwworld/class.hpp                   |  6 ------
 10 files changed, 23 insertions(+), 28 deletions(-)

diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp
index f77a9307cd..818f917353 100644
--- a/apps/openmw/mwclass/container.cpp
+++ b/apps/openmw/mwclass/container.cpp
@@ -181,7 +181,7 @@ namespace MWClass
         {
             MWBase::Environment::get().getWindowManager ()->messageBox (keyName + " #{sKeyUsed}");
             if(isLocked)
-                unlock(ptr);
+                ptr.getCellRef().unlock();
             // using a key disarms the trap
             if(isTrapped)
             {
diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp
index b98a8cc994..ecb6ececfe 100644
--- a/apps/openmw/mwclass/door.cpp
+++ b/apps/openmw/mwclass/door.cpp
@@ -162,7 +162,7 @@ namespace MWClass
             if(actor == MWMechanics::getPlayer())
                 MWBase::Environment::get().getWindowManager()->messageBox(keyName + " #{sKeyUsed}");
             if(isLocked)
-                unlock(ptr); //Call the function here. because that makes sense.
+                ptr.getCellRef().unlock(); //Call the function here. because that makes sense.
             // using a key disarms the trap
             if(isTrapped)
             {
diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
index 7547f086b2..a1994da02e 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
@@ -1150,7 +1150,7 @@ namespace MWMechanics
             store.remove(*it, toMove, player);
         }
         // TODO: unhardcode the locklevel
-        targetContainer.getClass().lock(targetContainer,50);
+        targetContainer.getCellRef().lock(50);
     }
 
     void MechanicsManager::itemTaken(const MWWorld::Ptr &ptr, const MWWorld::Ptr &item, const MWWorld::Ptr& container,
diff --git a/apps/openmw/mwmechanics/security.cpp b/apps/openmw/mwmechanics/security.cpp
index 62169c84a8..cafc65b992 100644
--- a/apps/openmw/mwmechanics/security.cpp
+++ b/apps/openmw/mwmechanics/security.cpp
@@ -50,7 +50,7 @@ namespace MWMechanics
         {
             if (Misc::Rng::roll0to99() <= x)
             {
-                lock.getClass().unlock(lock);
+                lock.getCellRef().unlock();
                 resultMessage = "#{sLockSuccess}";
                 resultSound = "Open Lock";
                 mActor.getClass().skillUsageSucceeded(mActor, ESM::Skill::Security, 1);
diff --git a/apps/openmw/mwmechanics/spellcasting.cpp b/apps/openmw/mwmechanics/spellcasting.cpp
index 359e74fc69..2d979e034a 100644
--- a/apps/openmw/mwmechanics/spellcasting.cpp
+++ b/apps/openmw/mwmechanics/spellcasting.cpp
@@ -696,7 +696,7 @@ namespace MWMechanics
                 {
                     if (caster == getPlayer())
                         MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicLockSuccess}");
-                    target.getClass().lock(target, static_cast<int>(magnitude));
+                    target.getCellRef().lock(static_cast<int>(magnitude));
                 }
                 return true;
             }
@@ -716,7 +716,7 @@ namespace MWMechanics
                         if (caster == getPlayer())
                             MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicOpenSuccess}");
                     }
-                    target.getClass().unlock(target);
+                    target.getCellRef().unlock();
                 }
                 else
                     MWBase::Environment::get().getSoundManager()->playSound3D(target, "Open Lock Fail", 1.f, 1.f);
diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp
index 29a25c9978..e2506edb86 100644
--- a/apps/openmw/mwscript/miscextensions.cpp
+++ b/apps/openmw/mwscript/miscextensions.cpp
@@ -182,7 +182,7 @@ namespace MWScript
                         runtime.pop();
                     }
 
-                    ptr.getClass().lock (ptr, lockLevel);
+                    ptr.getCellRef().lock (lockLevel);
 
                     // Instantly reset door to closed state
                     // This is done when using Lock in scripts, but not when using Lock spells.
@@ -202,7 +202,7 @@ namespace MWScript
                 {
                     MWWorld::Ptr ptr = R()(runtime);
 
-                    ptr.getClass().unlock (ptr);
+                    ptr.getCellRef().unlock ();
                 }
         };
 
diff --git a/apps/openmw/mwworld/cellref.cpp b/apps/openmw/mwworld/cellref.cpp
index 094669bddf..fb9fd592a9 100644
--- a/apps/openmw/mwworld/cellref.cpp
+++ b/apps/openmw/mwworld/cellref.cpp
@@ -225,6 +225,19 @@ namespace MWWorld
         }
     }
 
+    void CellRef::lock(int lockLevel)
+    {
+        if(lockLevel != 0)
+            setLockLevel(abs(lockLevel)); //Changes lock to locklevel, if positive
+        else
+            setLockLevel(ESM::UnbreakableLock); // If zero, set to max lock level
+    }
+
+    void CellRef::unlock()
+    {
+        setLockLevel(-abs(mCellRef.mLockLevel)); //Makes lockLevel negative
+    }
+
     std::string CellRef::getKey() const
     {
         return mCellRef.mKey;
diff --git a/apps/openmw/mwworld/cellref.hpp b/apps/openmw/mwworld/cellref.hpp
index 5646bafb04..04e807ce59 100644
--- a/apps/openmw/mwworld/cellref.hpp
+++ b/apps/openmw/mwworld/cellref.hpp
@@ -99,6 +99,8 @@ namespace MWWorld
         // For an unlocked door, it is set to -(previous locklevel)
         int getLockLevel() const;
         void setLockLevel(int lockLevel);
+        void lock(int lockLevel);
+        void unlock();
          // Key and trap ID names, if any
         std::string getKey() const;
         std::string getTrap() const;
diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp
index 3efc00491b..cd1f719d6d 100644
--- a/apps/openmw/mwworld/class.cpp
+++ b/apps/openmw/mwworld/class.cpp
@@ -144,20 +144,6 @@ namespace MWWorld
         return false;
     }
 
-    void Class::lock (const Ptr& ptr, int lockLevel) const
-    {
-        if(lockLevel != 0)
-            ptr.getCellRef().setLockLevel(abs(lockLevel)); //Changes lock to locklevel, if positive
-        else
-            ptr.getCellRef().setLockLevel(ESM::UnbreakableLock); // If zero, set to max lock level
-    }
-
-    void Class::unlock (const Ptr& ptr) const
-    {
-        int lockLevel = ptr.getCellRef().getLockLevel();
-        ptr.getCellRef().setLockLevel(-abs(lockLevel)); //Makes lockLevel negative
-    }
-
     bool Class::canLock(const ConstPtr &ptr) const
     {
         return false;
diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp
index 964ef19a5f..0d3a0e8075 100644
--- a/apps/openmw/mwworld/class.hpp
+++ b/apps/openmw/mwworld/class.hpp
@@ -163,12 +163,6 @@ namespace MWWorld
             virtual bool hasInventoryStore (const Ptr& ptr) const;
             ///< Does this object have an inventory store, i.e. equipment slots? (default implementation: false)
 
-            virtual void lock (const Ptr& ptr, int lockLevel) const;
-            ///< Lock object (default implementation: throw an exception)
-
-            virtual void unlock (const Ptr& ptr) const;
-            ///< Unlock object (default implementation: throw an exception)
-
             virtual bool canLock (const ConstPtr& ptr) const;
 
             virtual void setRemainingUsageTime (const Ptr& ptr, float duration) const;