From 2a76634f5f1891792e5f60d16482a08403314253 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 29 Jun 2021 23:25:26 +1000 Subject: [PATCH] Moved persistence flag from references to the header flags of referenceables (e.g. Static, Weapon, etc). Editing widget is not fully working. --- apps/opencs/model/doc/savingstages.cpp | 7 +- apps/opencs/model/world/columnimp.hpp | 27 ---- apps/opencs/model/world/data.cpp | 1 - apps/opencs/model/world/refidadapterimp.hpp | 20 ++- apps/opencs/model/world/refidcollection.cpp | 2 + apps/opencs/model/world/refiddata.cpp | 133 ++++++++++++++++++++ apps/opencs/model/world/refiddata.hpp | 4 +- components/esm/cellref.cpp | 4 - components/esm/cellref.hpp | 2 - components/esm/loadacti.cpp | 1 + components/esm/loadacti.hpp | 1 + components/esm/loadalch.cpp | 1 + components/esm/loadalch.hpp | 1 + components/esm/loadappa.cpp | 1 + components/esm/loadappa.hpp | 1 + components/esm/loadarmo.cpp | 1 + components/esm/loadarmo.hpp | 1 + components/esm/loadbook.cpp | 1 + components/esm/loadbook.hpp | 1 + components/esm/loadclot.cpp | 1 + components/esm/loadclot.hpp | 1 + components/esm/loadcont.cpp | 1 + components/esm/loadcont.hpp | 1 + components/esm/loadcrea.cpp | 3 +- components/esm/loadcrea.hpp | 1 + components/esm/loaddoor.cpp | 1 + components/esm/loaddoor.hpp | 1 + components/esm/loadingr.cpp | 1 + components/esm/loadingr.hpp | 1 + components/esm/loadlevlist.cpp | 1 + components/esm/loadlevlist.hpp | 1 + components/esm/loadligh.cpp | 1 + components/esm/loadligh.hpp | 1 + components/esm/loadlock.cpp | 1 + components/esm/loadlock.hpp | 1 + components/esm/loadmisc.cpp | 1 + components/esm/loadmisc.hpp | 1 + components/esm/loadnpc.cpp | 3 +- components/esm/loadnpc.hpp | 1 + components/esm/loadprob.cpp | 1 + components/esm/loadprob.hpp | 1 + components/esm/loadrepa.cpp | 1 + components/esm/loadrepa.hpp | 1 + components/esm/loadstat.cpp | 3 + components/esm/loadstat.hpp | 1 + components/esm/loadweap.cpp | 1 + components/esm/loadweap.hpp | 1 + 47 files changed, 205 insertions(+), 39 deletions(-) diff --git a/apps/opencs/model/doc/savingstages.cpp b/apps/opencs/model/doc/savingstages.cpp index 5e94f40b0f..7d6e8fef88 100644 --- a/apps/opencs/model/doc/savingstages.cpp +++ b/apps/opencs/model/doc/savingstages.cpp @@ -257,6 +257,8 @@ int CSMDoc::WriteCellCollectionStage::writeReferences (const std::deque& re { ESM::ESMWriter& writer = mState.getWriter(); size_t refCount = 0; + const CSMWorld::RefIdCollection& referenceables = mDocument.getData().getReferenceables(); + const CSMWorld::RefIdData& refIdData = referenceables.getDataSet(); for (std::deque::const_iterator iter (references.begin()); iter!=references.end(); ++iter) @@ -264,7 +266,10 @@ int CSMDoc::WriteCellCollectionStage::writeReferences (const std::deque& re const CSMWorld::Record& ref = mDocument.getData().getReferences().getRecord (*iter); - if (temp && ref.get().mIsPersistent || !temp && !ref.get().mIsPersistent) + unsigned int recordFlags = refIdData.getRecordFlags(ref.get().mId); + bool isPersistent = (recordFlags & 0x00000400) != 0; + + if (temp && isPersistent || !temp && !isPersistent) continue; refCount++; diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 11b47e1a08..17518937c2 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -1429,33 +1429,6 @@ namespace CSMWorld } }; - template - struct PersistentColumn : public Column - { - PersistentColumn() - : Column (Columns::ColumnId_Persistent, ColumnBase::Display_Boolean) - {} - - QVariant get (const Record& record) const override - { - return record.get().mIsPersistent; - } - - void set (Record& record, const QVariant& data) override - { - ESXRecordT record2 = record.get(); - - record2.mIsPersistent = data.toInt(); - - record.setModified (record2); - } - - bool isEditable() const override - { - return true; - } - }; - template struct QuestStatusTypeColumn : public Column { diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 0132584762..4ccd2a06db 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -528,7 +528,6 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, bool fsStrict, const Files::Pat mRefs.addColumn (new TrapColumn); mRefs.addColumn (new OwnerGlobalColumn); mRefs.addColumn (new RefNumColumn); - mRefs.addColumn (new PersistentColumn); mFilters.addColumn (new StringIdColumn); mFilters.addColumn (new RecordStateColumn); diff --git a/apps/opencs/model/world/refidadapterimp.hpp b/apps/opencs/model/world/refidadapterimp.hpp index 3d784f1b2b..f8ca93fec7 100644 --- a/apps/opencs/model/world/refidadapterimp.hpp +++ b/apps/opencs/model/world/refidadapterimp.hpp @@ -114,8 +114,9 @@ namespace CSMWorld struct ModelColumns : public BaseColumns { const RefIdColumn *mModel; + const RefIdColumn *mPersistence; - ModelColumns (const BaseColumns& base) : BaseColumns (base), mModel(nullptr) {} + ModelColumns (const BaseColumns& base) : BaseColumns (base), mModel(nullptr), mPersistence(nullptr) {} }; /// \brief Adapter for IDs with models (all but levelled lists) @@ -151,6 +152,12 @@ namespace CSMWorld if (column==mModel.mModel) return QString::fromUtf8 (record.get().mModel.c_str()); + if (column==mModel.mPersistence) + { + bool isPersistent = (record.get().mRecordFlags & 0x00000400) != 0; + return QString::fromUtf8 (isPersistent ? "Yes" : "No"); + } + return BaseRefIdAdapter::getData (column, data, index); } @@ -164,6 +171,17 @@ namespace CSMWorld RecordT record2 = record.get(); if (column==mModel.mModel) record2.mModel = value.toString().toUtf8().constData(); + else if (column==mModel.mPersistence) + { + unsigned int flag = record2.mRecordFlags; + std::string val = value.toString().toUtf8().constData(); + if (val == "Yes") + flag |= 0x00000400; + else if (val == "No") + flag &= ~0x00000400; + + record2.mRecordFlags = flag; + } else { BaseRefIdAdapter::setData (column, data, index, value); diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index cd2dd89dff..b7370c20da 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -54,6 +54,8 @@ CSMWorld::RefIdCollection::RefIdCollection() mColumns.emplace_back(Columns::ColumnId_Model, ColumnBase::Display_Mesh); modelColumns.mModel = &mColumns.back(); + mColumns.emplace_back(Columns::ColumnId_Persistent, ColumnBase::Display_Boolean); + modelColumns.mPersistence = &mColumns.back(); NameColumns nameColumns (modelColumns); diff --git a/apps/opencs/model/world/refiddata.cpp b/apps/opencs/model/world/refiddata.cpp index e2ffbcca6b..4f72bae92e 100644 --- a/apps/opencs/model/world/refiddata.cpp +++ b/apps/opencs/model/world/refiddata.cpp @@ -87,6 +87,139 @@ CSMWorld::RefIdData::LocalIndex CSMWorld::RefIdData::searchId ( return iter->second; } +unsigned int CSMWorld::RefIdData::getRecordFlags (const std::string& id) const +{ + LocalIndex localIndex = searchId (id); + + switch (localIndex.second) + { + case UniversalId::Type_Activator: + { + const RefIdDataContainer& records = getActivators(); + const ESM::Activator& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Potion: + { + const RefIdDataContainer& records = getPotions(); + const ESM::Potion& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Apparatus: + { + const RefIdDataContainer& records = getApparati(); + const ESM::Apparatus& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Armor: + { + const RefIdDataContainer& records = getArmors(); + const ESM::Armor& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Book: + { + const RefIdDataContainer& records = getBooks(); + const ESM::Book& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Clothing: + { + const RefIdDataContainer& records = getClothing(); + const ESM::Clothing& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Container: + { + const RefIdDataContainer& records = getContainers(); + const ESM::Container& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Creature: + { + const RefIdDataContainer& records = getCreatures(); + const ESM::Creature& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Door: + { + const RefIdDataContainer& records = getDoors(); + const ESM::Door& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Ingredient: + { + const RefIdDataContainer& records = getIngredients(); + const ESM::Ingredient& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_CreatureLevelledList: + { + const RefIdDataContainer& records = getCreatureLevelledLists(); + const ESM::CreatureLevList& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_ItemLevelledList: + { + const RefIdDataContainer& records = getItemLevelledList(); + const ESM::ItemLevList& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Light: + { + const RefIdDataContainer& records = getLights(); + const ESM::Light& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Lockpick: + { + const RefIdDataContainer& records = getLocpicks(); + const ESM::Lockpick& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Miscellaneous: + { + const RefIdDataContainer& records = getMiscellaneous(); + const ESM::Miscellaneous& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Npc: + { + const RefIdDataContainer& records = getNPCs(); + const ESM::NPC& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Probe: + { + const RefIdDataContainer& records = getProbes(); + const ESM::Probe& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Repair: + { + const RefIdDataContainer& records = getRepairs(); + const ESM::Repair& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Static: + { + const RefIdDataContainer& records = getStatics(); + const ESM::Static& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + case UniversalId::Type_Weapon: + { + const RefIdDataContainer& records = getWeapons(); + const ESM::Weapon& record = dynamic_cast(records.getRecord(localIndex.first)); + return record.mRecordFlags; + } + default: + break; + } + + return 0; +} + void CSMWorld::RefIdData::erase (int index, int count) { LocalIndex localIndex = globalToLocalIndex (index); diff --git a/apps/opencs/model/world/refiddata.hpp b/apps/opencs/model/world/refiddata.hpp index 1480bb71d9..da6ac7b154 100644 --- a/apps/opencs/model/world/refiddata.hpp +++ b/apps/opencs/model/world/refiddata.hpp @@ -209,7 +209,7 @@ namespace CSMWorld if (record.isModified() || record.mState == RecordBase::State_Deleted) { RecordT esmRecord = record.get(); - writer.startRecord(esmRecord.sRecordId); + writer.startRecord(esmRecord.sRecordId, esmRecord.mRecordFlags); esmRecord.save(writer, record.mState == RecordBase::State_Deleted); writer.endRecord(esmRecord.sRecordId); } @@ -273,6 +273,8 @@ namespace CSMWorld RecordBase& getRecord (const LocalIndex& index); + unsigned int getRecordFlags(const std::string& id) const; + void appendRecord (UniversalId::Type type, const std::string& id, bool base); int getAppendIndex (UniversalId::Type type) const; diff --git a/components/esm/cellref.cpp b/components/esm/cellref.cpp index 42bc3d648f..7d924d9c90 100644 --- a/components/esm/cellref.cpp +++ b/components/esm/cellref.cpp @@ -60,8 +60,6 @@ void ESM::CellRef::loadId (ESMReader& esm, bool wideRefNum) void ESM::CellRef::loadData(ESMReader &esm, bool &isDeleted, int *tempRefCount) { isDeleted = false; - mIsPersistent = !tempRefCount // default to persistent - || (tempRefCount && *tempRefCount == -1); bool isLoaded = false; while (!isLoaded && esm.hasMoreSubs()) @@ -247,6 +245,4 @@ void ESM::CellRef::blank() mPos.pos[i] = 0; mPos.rot[i] = 0; } - - mIsPersistent = false; } diff --git a/components/esm/cellref.hpp b/components/esm/cellref.hpp index 97cfea89d0..3e7a3a2f28 100644 --- a/components/esm/cellref.hpp +++ b/components/esm/cellref.hpp @@ -106,8 +106,6 @@ namespace ESM // Position and rotation of this object within the cell Position mPos; - bool mIsPersistent; - /// Calls loadId and loadData void load (ESMReader& esm, bool &isDeleted, int *tempRefCount, bool wideRefNum = false); diff --git a/components/esm/loadacti.cpp b/components/esm/loadacti.cpp index ba35535b8f..34592296ef 100644 --- a/components/esm/loadacti.cpp +++ b/components/esm/loadacti.cpp @@ -11,6 +11,7 @@ namespace ESM void Activator::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; while (esm.hasMoreSubs()) diff --git a/components/esm/loadacti.hpp b/components/esm/loadacti.hpp index 4cc72d5283..5b88ad379f 100644 --- a/components/esm/loadacti.hpp +++ b/components/esm/loadacti.hpp @@ -15,6 +15,7 @@ struct Activator /// Return a string descriptor for this record type. Currently used for debugging / error logs only. static std::string getRecordType() { return "Activator"; } + unsigned int mRecordFlags; std::string mId, mName, mScript, mModel; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadalch.cpp b/components/esm/loadalch.cpp index 85c24dc2d1..e1dd3a358b 100644 --- a/components/esm/loadalch.cpp +++ b/components/esm/loadalch.cpp @@ -11,6 +11,7 @@ namespace ESM void Potion::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); mEffects.mList.clear(); diff --git a/components/esm/loadalch.hpp b/components/esm/loadalch.hpp index 9ef390ebd9..d573531134 100644 --- a/components/esm/loadalch.hpp +++ b/components/esm/loadalch.hpp @@ -30,6 +30,7 @@ struct Potion }; ALDTstruct mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript; EffectList mEffects; diff --git a/components/esm/loadappa.cpp b/components/esm/loadappa.cpp index 1bd1f93798..5d8bd61189 100644 --- a/components/esm/loadappa.cpp +++ b/components/esm/loadappa.cpp @@ -11,6 +11,7 @@ namespace ESM void Apparatus::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadappa.hpp b/components/esm/loadappa.hpp index 74f8dd6aea..fcd9100be4 100644 --- a/components/esm/loadappa.hpp +++ b/components/esm/loadappa.hpp @@ -36,6 +36,7 @@ struct Apparatus }; AADTstruct mData; + unsigned int mRecordFlags; std::string mId, mModel, mIcon, mScript, mName; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadarmo.cpp b/components/esm/loadarmo.cpp index 6743702539..2253285c06 100644 --- a/components/esm/loadarmo.cpp +++ b/components/esm/loadarmo.cpp @@ -41,6 +41,7 @@ namespace ESM void Armor::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); mParts.mParts.clear(); diff --git a/components/esm/loadarmo.hpp b/components/esm/loadarmo.hpp index ef3bb734c0..195230fbf2 100644 --- a/components/esm/loadarmo.hpp +++ b/components/esm/loadarmo.hpp @@ -94,6 +94,7 @@ struct Armor AODTstruct mData; PartReferenceList mParts; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript, mEnchant; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadbook.cpp b/components/esm/loadbook.cpp index ee3c0c4af5..3535608272 100644 --- a/components/esm/loadbook.cpp +++ b/components/esm/loadbook.cpp @@ -11,6 +11,7 @@ namespace ESM void Book::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadbook.hpp b/components/esm/loadbook.hpp index bb2d7912f7..60b03f7a36 100644 --- a/components/esm/loadbook.hpp +++ b/components/esm/loadbook.hpp @@ -26,6 +26,7 @@ struct Book BKDTstruct mData; std::string mName, mModel, mIcon, mScript, mEnchant, mText; + unsigned int mRecordFlags; std::string mId; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadclot.cpp b/components/esm/loadclot.cpp index 12f0d495d5..cf0b40d699 100644 --- a/components/esm/loadclot.cpp +++ b/components/esm/loadclot.cpp @@ -11,6 +11,7 @@ namespace ESM void Clothing::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); mParts.mParts.clear(); diff --git a/components/esm/loadclot.hpp b/components/esm/loadclot.hpp index 4db791c0c1..bbc8449a95 100644 --- a/components/esm/loadclot.hpp +++ b/components/esm/loadclot.hpp @@ -46,6 +46,7 @@ struct Clothing PartReferenceList mParts; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mEnchant, mScript; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadcont.cpp b/components/esm/loadcont.cpp index 107aea7cf6..3bb603dbef 100644 --- a/components/esm/loadcont.cpp +++ b/components/esm/loadcont.cpp @@ -32,6 +32,7 @@ namespace ESM void Container::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); mInventory.mList.clear(); diff --git a/components/esm/loadcont.hpp b/components/esm/loadcont.hpp index 0cac580748..ade9004214 100644 --- a/components/esm/loadcont.hpp +++ b/components/esm/loadcont.hpp @@ -46,6 +46,7 @@ struct Container Unknown = 8 }; + unsigned int mRecordFlags; std::string mId, mName, mModel, mScript; float mWeight; // Not sure, might be max total weight allowed? diff --git a/components/esm/loadcrea.cpp b/components/esm/loadcrea.cpp index 52138e2232..fd358987e0 100644 --- a/components/esm/loadcrea.cpp +++ b/components/esm/loadcrea.cpp @@ -13,8 +13,9 @@ namespace ESM { void Creature::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); - mPersistent = (esm.getRecordFlags() & 0x0400) != 0; + mPersistent = (mRecordFlags & 0x0400) != 0; mAiPackage.mList.clear(); mInventory.mList.clear(); diff --git a/components/esm/loadcrea.hpp b/components/esm/loadcrea.hpp index 0ab09ee122..aeebeeb217 100644 --- a/components/esm/loadcrea.hpp +++ b/components/esm/loadcrea.hpp @@ -80,6 +80,7 @@ struct Creature float mScale; + unsigned int mRecordFlags; std::string mId, mModel, mName, mScript; std::string mOriginal; // Base creature that this is a modification of diff --git a/components/esm/loaddoor.cpp b/components/esm/loaddoor.cpp index 523d8a1efc..3e3e134112 100644 --- a/components/esm/loaddoor.cpp +++ b/components/esm/loaddoor.cpp @@ -11,6 +11,7 @@ namespace ESM void Door::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; while (esm.hasMoreSubs()) diff --git a/components/esm/loaddoor.hpp b/components/esm/loaddoor.hpp index 3afe5d5e4b..167eda20f5 100644 --- a/components/esm/loaddoor.hpp +++ b/components/esm/loaddoor.hpp @@ -15,6 +15,7 @@ struct Door /// Return a string descriptor for this record type. Currently used for debugging / error logs only. static std::string getRecordType() { return "Door"; } + unsigned int mRecordFlags; std::string mId, mName, mModel, mScript, mOpenSound, mCloseSound; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadingr.cpp b/components/esm/loadingr.cpp index a18e321ff7..6784d7ceac 100644 --- a/components/esm/loadingr.cpp +++ b/components/esm/loadingr.cpp @@ -11,6 +11,7 @@ namespace ESM void Ingredient::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadingr.hpp b/components/esm/loadingr.hpp index c0f4450238..34e05da2c1 100644 --- a/components/esm/loadingr.hpp +++ b/components/esm/loadingr.hpp @@ -29,6 +29,7 @@ struct Ingredient }; IRDTstruct mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadlevlist.cpp b/components/esm/loadlevlist.cpp index 0aed15aa94..c876e3b080 100644 --- a/components/esm/loadlevlist.cpp +++ b/components/esm/loadlevlist.cpp @@ -9,6 +9,7 @@ namespace ESM void LevelledListBase::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasList = false; diff --git a/components/esm/loadlevlist.hpp b/components/esm/loadlevlist.hpp index ed4131c165..d3451b70ae 100644 --- a/components/esm/loadlevlist.hpp +++ b/components/esm/loadlevlist.hpp @@ -22,6 +22,7 @@ struct LevelledListBase { int mFlags; unsigned char mChanceNone; // Chance that none are selected (0-100) + unsigned int mRecordFlags; std::string mId; // Record name used to read references. Must be set before load() is diff --git a/components/esm/loadligh.cpp b/components/esm/loadligh.cpp index 2a6dac14b0..b7c3d64cab 100644 --- a/components/esm/loadligh.cpp +++ b/components/esm/loadligh.cpp @@ -11,6 +11,7 @@ namespace ESM void Light::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadligh.hpp b/components/esm/loadligh.hpp index 8509c64b6d..901fe6ec85 100644 --- a/components/esm/loadligh.hpp +++ b/components/esm/loadligh.hpp @@ -45,6 +45,7 @@ struct Light LHDTstruct mData; + unsigned int mRecordFlags; std::string mSound, mScript, mModel, mIcon, mName, mId; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadlock.cpp b/components/esm/loadlock.cpp index b14353ec5a..a80760cf45 100644 --- a/components/esm/loadlock.cpp +++ b/components/esm/loadlock.cpp @@ -11,6 +11,7 @@ namespace ESM void Lockpick::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadlock.hpp b/components/esm/loadlock.hpp index 9db41af978..9cd40c0d4f 100644 --- a/components/esm/loadlock.hpp +++ b/components/esm/loadlock.hpp @@ -25,6 +25,7 @@ struct Lockpick }; // Size = 16 Data mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadmisc.cpp b/components/esm/loadmisc.cpp index 3ba6626505..f0ad49c1dc 100644 --- a/components/esm/loadmisc.cpp +++ b/components/esm/loadmisc.cpp @@ -11,6 +11,7 @@ namespace ESM void Miscellaneous::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadmisc.hpp b/components/esm/loadmisc.hpp index e7a3239042..72aaa5de3b 100644 --- a/components/esm/loadmisc.hpp +++ b/components/esm/loadmisc.hpp @@ -30,6 +30,7 @@ struct Miscellaneous }; MCDTstruct mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadnpc.cpp b/components/esm/loadnpc.cpp index 2bb0811ac9..678678b5d3 100644 --- a/components/esm/loadnpc.cpp +++ b/components/esm/loadnpc.cpp @@ -11,8 +11,9 @@ namespace ESM void NPC::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); - mPersistent = (esm.getRecordFlags() & 0x0400) != 0; + mPersistent = (mRecordFlags & 0x0400) != 0; mSpells.mList.clear(); mInventory.mList.clear(); diff --git a/components/esm/loadnpc.hpp b/components/esm/loadnpc.hpp index 687afeaf64..859f9d19e8 100644 --- a/components/esm/loadnpc.hpp +++ b/components/esm/loadnpc.hpp @@ -129,6 +129,7 @@ struct NPC AIPackageList mAiPackage; + unsigned int mRecordFlags; std::string mId, mName, mModel, mRace, mClass, mFaction, mScript; // body parts diff --git a/components/esm/loadprob.cpp b/components/esm/loadprob.cpp index 6307df3298..6460b793a0 100644 --- a/components/esm/loadprob.cpp +++ b/components/esm/loadprob.cpp @@ -11,6 +11,7 @@ namespace ESM void Probe::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadprob.hpp b/components/esm/loadprob.hpp index da203b456b..930e31a971 100644 --- a/components/esm/loadprob.hpp +++ b/components/esm/loadprob.hpp @@ -25,6 +25,7 @@ struct Probe }; // Size = 16 Data mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadrepa.cpp b/components/esm/loadrepa.cpp index c04691c12f..7bd98329ce 100644 --- a/components/esm/loadrepa.cpp +++ b/components/esm/loadrepa.cpp @@ -11,6 +11,7 @@ namespace ESM void Repair::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadrepa.hpp b/components/esm/loadrepa.hpp index 2537c53cb6..312c87b7b4 100644 --- a/components/esm/loadrepa.hpp +++ b/components/esm/loadrepa.hpp @@ -25,6 +25,7 @@ struct Repair }; // Size = 16 Data mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mScript; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadstat.cpp b/components/esm/loadstat.cpp index 6c9de22bd1..0c97662d7e 100644 --- a/components/esm/loadstat.cpp +++ b/components/esm/loadstat.cpp @@ -11,6 +11,9 @@ namespace ESM void Static::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); + //bool isBlocked = (mRecordFlags & 0x00002000) != 0; + //bool isPersistent = (mRecordFlags & 0x00000400) != 0; bool hasName = false; while (esm.hasMoreSubs()) diff --git a/components/esm/loadstat.hpp b/components/esm/loadstat.hpp index 3d91440402..038fb9f52b 100644 --- a/components/esm/loadstat.hpp +++ b/components/esm/loadstat.hpp @@ -26,6 +26,7 @@ struct Static /// Return a string descriptor for this record type. Currently used for debugging / error logs only. static std::string getRecordType() { return "Static"; } + unsigned int mRecordFlags; std::string mId, mModel; void load(ESMReader &esm, bool &isDeleted); diff --git a/components/esm/loadweap.cpp b/components/esm/loadweap.cpp index 4a77ff6a00..79d1a8c5e5 100644 --- a/components/esm/loadweap.cpp +++ b/components/esm/loadweap.cpp @@ -11,6 +11,7 @@ namespace ESM void Weapon::load(ESMReader &esm, bool &isDeleted) { isDeleted = false; + mRecordFlags = esm.getRecordFlags(); bool hasName = false; bool hasData = false; diff --git a/components/esm/loadweap.hpp b/components/esm/loadweap.hpp index 90431756d7..8d1591854b 100644 --- a/components/esm/loadweap.hpp +++ b/components/esm/loadweap.hpp @@ -73,6 +73,7 @@ struct Weapon WPDTstruct mData; + unsigned int mRecordFlags; std::string mId, mName, mModel, mIcon, mEnchant, mScript; void load(ESMReader &esm, bool &isDeleted);