diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index 0f5009400d..bc99ba7d7d 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -765,52 +765,48 @@ namespace MWWorld static void visitCell4References(const ESM4::Cell& cell, ESM::ReadersCache& readers, ReferenceInvocable&& invocable) { auto stream = Files::openBinaryInputFileStream(cell.mReaderContext.filename); - const ESM::Format format = ESM::readFormat(*stream); - assert(format == ESM::Format::Tes4); stream->seekg(0); ESM4::Reader readerESM4( std::move(stream), cell.mReaderContext.filename, MWBase::Environment::get().getResourceSystem()->getVFS()); readerESM4.setEncoder(readers.getStatelessEncoder()); - bool contextValid = cell.mReaderContext.filePos != std::numeric_limits::max(); + bool contextValid = cell.mReaderContext.filePos != std::streampos(-1); if (contextValid) readerESM4.restoreContext(cell.mReaderContext); - while ((ESM::RefId::formIdRefId(readerESM4.getContext().currCell) == cell.mId || !contextValid) - && readerESM4.hasMoreRecs()) + while ( + (ESM::RefId::formIdRefId(readerESM4.currCell()) == cell.mId || !contextValid) && readerESM4.hasMoreRecs()) { if (!contextValid) readerESM4.exitGroupCheck(); - if (!ESM4::ReaderUtils::readItem( - readerESM4, - [&](ESM4::Reader& reader) { - auto recordType = static_cast(reader.hdr().record.typeId); - ESM::RecNameInts esm4RecName = static_cast(ESM::esm4Recname(recordType)); - if (esm4RecName == ESM::RecNameInts::REC_REFR4 && contextValid) - { - reader.getRecordData(); - ESM4::Reference ref; - ref.load(reader); - invocable(ref); - return true; - } - else if (esm4RecName == ESM::RecNameInts::REC_CELL4) - { - reader.getRecordData(); - ESM4::Cell cellToLoad; - cellToLoad.load(reader); // This is necessary to exit or to find the correct cell - if (cellToLoad.mId == cell.mId) - contextValid = true; - return true; - } - - return false; - }, - [&](ESM4::Reader& reader) {})) - { + + auto onRecord = [&](ESM4::Reader& reader) { + auto recordType = static_cast(reader.hdr().record.typeId); + ESM::RecNameInts esm4RecName = static_cast(ESM::esm4Recname(recordType)); + if (esm4RecName == ESM::RecNameInts::REC_REFR4 && contextValid) + { + reader.getRecordData(); + ESM4::Reference ref; + ref.load(reader); + invocable(ref); + return true; + } + else if (esm4RecName == ESM::RecNameInts::REC_CELL4) + { + reader.getRecordData(); + ESM4::Cell cellToLoad; + cellToLoad.load(reader); // This is necessary to exit or to find the correct cell + if (cellToLoad.mId == cell.mId) + contextValid = true; + return true; + } + + return false; + }; + + if (!ESM4::ReaderUtils::readItem(readerESM4, onRecord, [&](ESM4::Reader& reader) {})) break; - } } } diff --git a/components/esm4/reader.cpp b/components/esm4/reader.cpp index e599034c8f..091df5abf1 100644 --- a/components/esm4/reader.cpp +++ b/components/esm4/reader.cpp @@ -134,7 +134,7 @@ namespace ESM4 ReaderContext Reader::getContext() { mCtx.filePos = mStream->tellg(); - if (mCtx.filePos == std::numeric_limits::max()) + if (mCtx.filePos == std::streampos(-1)) return mCtx; mCtx.filePos -= mCtx.recHeaderSize; // update file position return mCtx; diff --git a/components/esm4/reader.hpp b/components/esm4/reader.hpp index 0b792dcf28..91bd44a156 100644 --- a/components/esm4/reader.hpp +++ b/components/esm4/reader.hpp @@ -62,7 +62,7 @@ namespace ESM4 // case the file was re-opened. default = TES5 size, // can be reduced for TES4 by setRecHeaderSize() - std::size_t filePos; // assume that the record header will be re-read once + std::streampos filePos; // assume that the record header will be re-read once // the context is restored // for keeping track of things