From 2e6878633145a7dc6b6897a1110b9fb4817ce52e Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Wed, 27 Mar 2024 07:32:53 +0000 Subject: [PATCH] Fix(CS): Actually allow unlocking doors ( #7899 ) --- CHANGELOG.md | 1 + apps/opencs/model/world/columnimp.hpp | 31 +++++++++++++++++++++++++-- apps/opencs/model/world/columns.cpp | 1 + apps/opencs/model/world/columns.hpp | 2 ++ apps/opencs/model/world/data.cpp | 2 ++ components/esm3/cellref.cpp | 12 ++++++----- 6 files changed, 42 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af3daecddc..e82ca284d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -163,6 +163,7 @@ Bug #7872: Region sounds use wrong odds Bug #7887: Editor: Mismatched reported script data size and actual data size causes a crash during save Bug #7898: Editor: Invalid reference scales are allowed + Bug #7899: Editor: Doors can't be unlocked Feature #2566: Handle NAM9 records for manual cell references Feature #3537: Shader-based water ripples Feature #5173: Support for NiFogProperty diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 53e0ba07cf..cb263eb8bc 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -1182,6 +1182,26 @@ namespace CSMWorld bool isUserEditable() const override { return true; } }; + template + struct IsLockedColumn : public Column + { + IsLockedColumn(int flags) + : Column(Columns::ColumnId_IsLocked, ColumnBase::Display_Boolean, flags) + { + } + + QVariant get(const Record& record) const override { return record.get().mIsLocked; } + + void set(Record& record, const QVariant& data) override + { + ESXRecordT record2 = record.get(); + record2.mIsLocked = data.toBool(); + record.setModified(record2); + } + + bool isEditable() const override { return true; } + }; + template struct LockLevelColumn : public Column { @@ -1190,7 +1210,12 @@ namespace CSMWorld { } - QVariant get(const Record& record) const override { return record.get().mLockLevel; } + QVariant get(const Record& record) const override + { + if (record.get().mIsLocked) + return record.get().mLockLevel; + return QVariant(); + } void set(Record& record, const QVariant& data) override { @@ -1212,7 +1237,9 @@ namespace CSMWorld QVariant get(const Record& record) const override { - return QString::fromUtf8(record.get().mKey.getRefIdString().c_str()); + if (record.get().mIsLocked) + return QString::fromUtf8(record.get().mKey.getRefIdString().c_str()); + return QVariant(); } void set(Record& record, const QVariant& data) override diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index f487266dbb..0f42b12508 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -59,6 +59,7 @@ namespace CSMWorld { ColumnId_StackCount, "Count" }, { ColumnId_Teleport, "Teleport" }, { ColumnId_TeleportCell, "Teleport Cell" }, + { ColumnId_IsLocked, "Locked" }, { ColumnId_LockLevel, "Lock Level" }, { ColumnId_Key, "Key" }, { ColumnId_Trap, "Trap" }, diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index f5a8e446a5..a691eada9e 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -351,6 +351,8 @@ namespace CSMWorld ColumnId_SoundProbability = 317, + ColumnId_IsLocked = 318, + // Allocated to a separate value range, so we don't get a collision should we ever need // to extend the number of use values. ColumnId_UseValue1 = 0x10000, diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 1f8ff54e89..1bff00701a 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -599,6 +599,8 @@ CSMWorld::Data::Data(ToUTF8::FromType encoding, const Files::PathContainer& data mRefs.addColumn(new RotColumn(&CellRef::mDoorDest, 0, true)); mRefs.addColumn(new RotColumn(&CellRef::mDoorDest, 1, true)); mRefs.addColumn(new RotColumn(&CellRef::mDoorDest, 2, true)); + mRefs.addColumn(new IsLockedColumn( + ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh)); mRefs.addColumn(new LockLevelColumn); mRefs.addColumn(new KeyColumn); mRefs.addColumn(new TrapColumn); diff --git a/components/esm3/cellref.cpp b/components/esm3/cellref.cpp index ecba6f7f5e..97ccfb730a 100644 --- a/components/esm3/cellref.cpp +++ b/components/esm3/cellref.cpp @@ -230,12 +230,14 @@ namespace ESM if (!inInventory) { - int lockLevel = mLockLevel; - if (lockLevel == 0 && mIsLocked) - lockLevel = ZeroLock; - if (lockLevel != 0) + if (mIsLocked) + { + int lockLevel = mLockLevel; + if (lockLevel == 0) + lockLevel = ZeroLock; esm.writeHNT("FLTV", lockLevel); - esm.writeHNOCRefId("KNAM", mKey); + esm.writeHNOCRefId("KNAM", mKey); + } esm.writeHNOCRefId("TNAM", mTrap); }