mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-20 14:41:34 +00:00
Merge branch 'dont_look_at_me_im_hideous' into 'master'
Implement ignored records Closes #6699 See merge request OpenMW/openmw!1779
This commit is contained in:
commit
e66008c4e2
7 changed files with 24 additions and 11 deletions
|
@ -145,6 +145,7 @@
|
||||||
Feature #6592: Missing support for NiTriShape particle emitters
|
Feature #6592: Missing support for NiTriShape particle emitters
|
||||||
Feature #6600: Support NiSortAdjustNode
|
Feature #6600: Support NiSortAdjustNode
|
||||||
Feature #6684: Support NiFltAnimationNode
|
Feature #6684: Support NiFltAnimationNode
|
||||||
|
Feature #6699: Ignored flag
|
||||||
Task #6201: Remove the "Note: No relevant classes found. No output generated" warnings
|
Task #6201: Remove the "Note: No relevant classes found. No output generated" warnings
|
||||||
Task #6264: Remove the old classes in animation.cpp
|
Task #6264: Remove the old classes in animation.cpp
|
||||||
Task #6553: Simplify interpreter instruction registration
|
Task #6553: Simplify interpreter instruction registration
|
||||||
|
|
|
@ -11,6 +11,7 @@ EsmLoader::EsmLoader(MWWorld::ESMStore& store, std::vector<ESM::ESMReader>& read
|
||||||
: mEsm(readers)
|
: mEsm(readers)
|
||||||
, mStore(store)
|
, mStore(store)
|
||||||
, mEncoder(encoder)
|
, 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.open(filepath.string());
|
||||||
lEsm.resolveParentFileIndices(mEsm);
|
lEsm.resolveParentFileIndices(mEsm);
|
||||||
mEsm[index] = std::move(lEsm);
|
mEsm[index] = std::move(lEsm);
|
||||||
mStore.load(mEsm[index], listener);
|
mStore.load(mEsm[index], listener, mDialogue);
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* namespace MWWorld */
|
} /* namespace MWWorld */
|
||||||
|
|
|
@ -13,6 +13,7 @@ namespace ToUTF8
|
||||||
namespace ESM
|
namespace ESM
|
||||||
{
|
{
|
||||||
class ESMReader;
|
class ESMReader;
|
||||||
|
struct Dialogue;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
|
@ -31,6 +32,7 @@ struct EsmLoader : public ContentLoader
|
||||||
std::vector<ESM::ESMReader>& mEsm;
|
std::vector<ESM::ESMReader>& mEsm;
|
||||||
MWWorld::ESMStore& mStore;
|
MWWorld::ESMStore& mStore;
|
||||||
ToUTF8::Utf8Encoder* mEncoder;
|
ToUTF8::Utf8Encoder* mEncoder;
|
||||||
|
ESM::Dialogue* mDialogue;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace MWWorld */
|
} /* namespace MWWorld */
|
||||||
|
|
|
@ -143,12 +143,10 @@ static bool isCacheableRecord(int id)
|
||||||
return false;
|
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);
|
listener->setProgressRange(1000);
|
||||||
|
|
||||||
ESM::Dialogue *dialogue = nullptr;
|
|
||||||
|
|
||||||
// Land texture loading needs to use a separate internal store for each plugin.
|
// 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
|
// 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.
|
// 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::NAME n = esm.getRecName();
|
||||||
esm.getRecHeader();
|
esm.getRecHeader();
|
||||||
|
if (esm.getRecordFlags() & ESM::FLAG_Ignored)
|
||||||
|
{
|
||||||
|
esm.skipRecord();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Look up the record type.
|
// Look up the record type.
|
||||||
std::map<int, StoreBase *>::iterator it = mStores.find(n.toInt());
|
std::map<int, StoreBase *>::iterator it = mStores.find(n.toInt());
|
||||||
|
|
|
@ -196,7 +196,7 @@ namespace MWWorld
|
||||||
/// Validate entries in store after loading a save
|
/// Validate entries in store after loading a save
|
||||||
void validateDynamic();
|
void validateDynamic();
|
||||||
|
|
||||||
void load(ESM::ESMReader &esm, Loading::Listener* listener);
|
void load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialogue*& dialogue);
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
const Store<T> &get() const {
|
const Store<T> &get() const {
|
||||||
|
|
|
@ -29,13 +29,14 @@ struct ContentFileTest : public ::testing::Test
|
||||||
|
|
||||||
// load the content files
|
// load the content files
|
||||||
int index=0;
|
int index=0;
|
||||||
|
ESM::Dialogue* dialogue = nullptr;
|
||||||
for (const auto & mContentFile : mContentFiles)
|
for (const auto & mContentFile : mContentFiles)
|
||||||
{
|
{
|
||||||
ESM::ESMReader lEsm;
|
ESM::ESMReader lEsm;
|
||||||
lEsm.setEncoder(nullptr);
|
lEsm.setEncoder(nullptr);
|
||||||
lEsm.setIndex(index);
|
lEsm.setIndex(index);
|
||||||
lEsm.open(mContentFile.string());
|
lEsm.open(mContentFile.string());
|
||||||
mEsmStore.load(lEsm, &dummyListener);
|
mEsmStore.load(lEsm, &dummyListener, dialogue);
|
||||||
|
|
||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
|
@ -249,17 +250,18 @@ TEST_F(StoreTest, delete_test)
|
||||||
record.mId = recordId;
|
record.mId = recordId;
|
||||||
|
|
||||||
ESM::ESMReader reader;
|
ESM::ESMReader reader;
|
||||||
|
ESM::Dialogue* dialogue = nullptr;
|
||||||
|
|
||||||
// master file inserts a record
|
// master file inserts a record
|
||||||
reader.open(getEsmFile(record, false), "filename");
|
reader.open(getEsmFile(record, false), "filename");
|
||||||
mEsmStore.load(reader, &dummyListener);
|
mEsmStore.load(reader, &dummyListener, dialogue);
|
||||||
mEsmStore.setUp();
|
mEsmStore.setUp();
|
||||||
|
|
||||||
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 1);
|
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 1);
|
||||||
|
|
||||||
// now a plugin deletes it
|
// now a plugin deletes it
|
||||||
reader.open(getEsmFile(record, true), "filename");
|
reader.open(getEsmFile(record, true), "filename");
|
||||||
mEsmStore.load(reader, &dummyListener);
|
mEsmStore.load(reader, &dummyListener, dialogue);
|
||||||
mEsmStore.setUp();
|
mEsmStore.setUp();
|
||||||
|
|
||||||
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 0);
|
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 0);
|
||||||
|
@ -267,7 +269,7 @@ TEST_F(StoreTest, delete_test)
|
||||||
// now another plugin inserts it again
|
// now another plugin inserts it again
|
||||||
// expected behaviour is the record to reappear rather than staying deleted
|
// expected behaviour is the record to reappear rather than staying deleted
|
||||||
reader.open(getEsmFile(record, false), "filename");
|
reader.open(getEsmFile(record, false), "filename");
|
||||||
mEsmStore.load(reader, &dummyListener);
|
mEsmStore.load(reader, &dummyListener, dialogue);
|
||||||
mEsmStore.setUp();
|
mEsmStore.setUp();
|
||||||
|
|
||||||
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 1);
|
ASSERT_TRUE (mEsmStore.get<RecordType>().getSize() == 1);
|
||||||
|
@ -286,17 +288,18 @@ TEST_F(StoreTest, overwrite_test)
|
||||||
record.mId = recordId;
|
record.mId = recordId;
|
||||||
|
|
||||||
ESM::ESMReader reader;
|
ESM::ESMReader reader;
|
||||||
|
ESM::Dialogue* dialogue = nullptr;
|
||||||
|
|
||||||
// master file inserts a record
|
// master file inserts a record
|
||||||
reader.open(getEsmFile(record, false), "filename");
|
reader.open(getEsmFile(record, false), "filename");
|
||||||
mEsmStore.load(reader, &dummyListener);
|
mEsmStore.load(reader, &dummyListener, dialogue);
|
||||||
mEsmStore.setUp();
|
mEsmStore.setUp();
|
||||||
|
|
||||||
// now a plugin overwrites it with changed data
|
// 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.mId = recordIdUpper; // change id to uppercase, to test case smashing while we're at it
|
||||||
record.mModel = "the_new_model";
|
record.mModel = "the_new_model";
|
||||||
reader.open(getEsmFile(record, false), "filename");
|
reader.open(getEsmFile(record, false), "filename");
|
||||||
mEsmStore.load(reader, &dummyListener);
|
mEsmStore.load(reader, &dummyListener, dialogue);
|
||||||
mEsmStore.setUp();
|
mEsmStore.setUp();
|
||||||
|
|
||||||
// verify that changes were actually applied
|
// verify that changes were actually applied
|
||||||
|
|
|
@ -19,7 +19,10 @@ enum Version
|
||||||
|
|
||||||
enum RecordFlag
|
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_Persistent = 0x00000400,
|
||||||
|
FLAG_Ignored = 0x00001000,
|
||||||
FLAG_Blocked = 0x00002000
|
FLAG_Blocked = 0x00002000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue