Merge branch 'dont_look_at_me_im_hideous' into 'master'

Implement ignored records

Closes #6699

See merge request OpenMW/openmw!1779
pull/3226/head
psi29a 2 years ago
commit e66008c4e2

@ -145,6 +145,7 @@
Feature #6592: Missing support for NiTriShape particle emitters
Feature #6600: Support NiSortAdjustNode
Feature #6684: Support NiFltAnimationNode
Feature #6699: Ignored flag
Task #6201: Remove the "Note: No relevant classes found. No output generated" warnings
Task #6264: Remove the old classes in animation.cpp
Task #6553: Simplify interpreter instruction registration

@ -11,6 +11,7 @@ EsmLoader::EsmLoader(MWWorld::ESMStore& store, std::vector<ESM::ESMReader>& read
: mEsm(readers)
, mStore(store)
, mEncoder(encoder)
, mDialogue(nullptr) // A content file containing INFO records without a DIAL record appends them to the previous file's dialogue
{
}
@ -22,7 +23,7 @@ void EsmLoader::load(const boost::filesystem::path& filepath, int& index, Loadin
lEsm.open(filepath.string());
lEsm.resolveParentFileIndices(mEsm);
mEsm[index] = std::move(lEsm);
mStore.load(mEsm[index], listener);
mStore.load(mEsm[index], listener, mDialogue);
}
} /* namespace MWWorld */

@ -13,6 +13,7 @@ namespace ToUTF8
namespace ESM
{
class ESMReader;
struct Dialogue;
}
namespace MWWorld
@ -31,6 +32,7 @@ struct EsmLoader : public ContentLoader
std::vector<ESM::ESMReader>& mEsm;
MWWorld::ESMStore& mStore;
ToUTF8::Utf8Encoder* mEncoder;
ESM::Dialogue* mDialogue;
};
} /* namespace MWWorld */

@ -143,12 +143,10 @@ static bool isCacheableRecord(int id)
return false;
}
void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener)
void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialogue*& dialogue)
{
listener->setProgressRange(1000);
ESM::Dialogue *dialogue = nullptr;
// Land texture loading needs to use a separate internal store for each plugin.
// We set the number of plugins here so we can properly verify if valid plugin
// indices are being passed to the LandTexture Store retrieval methods.
@ -159,6 +157,11 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener)
{
ESM::NAME n = esm.getRecName();
esm.getRecHeader();
if (esm.getRecordFlags() & ESM::FLAG_Ignored)
{
esm.skipRecord();
continue;
}
// Look up the record type.
std::map<int, StoreBase *>::iterator it = mStores.find(n.toInt());

@ -196,7 +196,7 @@ namespace MWWorld
/// Validate entries in store after loading a save
void validateDynamic();
void load(ESM::ESMReader &esm, Loading::Listener* listener);
void load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialogue*& dialogue);
template <class T>
const Store<T> &get() const {

@ -29,13 +29,14 @@ struct ContentFileTest : public ::testing::Test
// load the content files
int index=0;
ESM::Dialogue* dialogue = nullptr;
for (const auto & mContentFile : mContentFiles)
{
ESM::ESMReader lEsm;
lEsm.setEncoder(nullptr);
lEsm.setIndex(index);
lEsm.open(mContentFile.string());
mEsmStore.load(lEsm, &dummyListener);
mEsmStore.load(lEsm, &dummyListener, dialogue);
++index;
}
@ -249,17 +250,18 @@ TEST_F(StoreTest, delete_test)
record.mId = recordId;
ESM::ESMReader reader;
ESM::Dialogue* dialogue = nullptr;
// master file inserts a record
reader.open(getEsmFile(record, false), "filename");
mEsmStore.load(reader, &dummyListener);
mEsmStore.load(reader, &dummyListener, dialogue);
mEsmStore.setUp();
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 1);
// now a plugin deletes it
reader.open(getEsmFile(record, true), "filename");
mEsmStore.load(reader, &dummyListener);
mEsmStore.load(reader, &dummyListener, dialogue);
mEsmStore.setUp();
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 0);
@ -267,7 +269,7 @@ TEST_F(StoreTest, delete_test)
// now another plugin inserts it again
// expected behaviour is the record to reappear rather than staying deleted
reader.open(getEsmFile(record, false), "filename");
mEsmStore.load(reader, &dummyListener);
mEsmStore.load(reader, &dummyListener, dialogue);
mEsmStore.setUp();
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 1);
@ -286,17 +288,18 @@ TEST_F(StoreTest, overwrite_test)
record.mId = recordId;
ESM::ESMReader reader;
ESM::Dialogue* dialogue = nullptr;
// master file inserts a record
reader.open(getEsmFile(record, false), "filename");
mEsmStore.load(reader, &dummyListener);
mEsmStore.load(reader, &dummyListener, dialogue);
mEsmStore.setUp();
// now a plugin overwrites it with changed data
record.mId = recordIdUpper; // change id to uppercase, to test case smashing while we're at it
record.mModel = "the_new_model";
reader.open(getEsmFile(record, false), "filename");
mEsmStore.load(reader, &dummyListener);
mEsmStore.load(reader, &dummyListener, dialogue);
mEsmStore.setUp();
// verify that changes were actually applied

@ -19,7 +19,10 @@ enum Version
enum RecordFlag
{
// This flag exists, but is not used to determine if a record has been deleted while loading
FLAG_Deleted = 0x00000020,
FLAG_Persistent = 0x00000400,
FLAG_Ignored = 0x00001000,
FLAG_Blocked = 0x00002000
};

Loading…
Cancel
Save