forked from teamnwah/openmw-tes3coop
Loading of moved refs complete.
This commit is contained in:
parent
74b98f7178
commit
7673be6d0f
4 changed files with 16 additions and 29 deletions
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <QAbstractItemModel>
|
#include <QAbstractItemModel>
|
||||||
|
|
||||||
|
@ -866,11 +865,12 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
||||||
if (index < 0 || index >= mCells.getSize())
|
if (index < 0 || index >= mCells.getSize())
|
||||||
{
|
{
|
||||||
// log an error and continue loading the refs to the last loaded cell
|
// log an error and continue loading the refs to the last loaded cell
|
||||||
std::cerr << "Logic error: cell index out of bounds" << std::endl;
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_None);
|
||||||
|
messages.add (id, "Logic error: cell index out of bounds");
|
||||||
index = mCells.getSize()-1;
|
index = mCells.getSize()-1;
|
||||||
}
|
}
|
||||||
std::string cellId = Misc::StringUtils::lowerCase (mCells.getId (index));
|
std::string cellId = Misc::StringUtils::lowerCase (mCells.getId (index));
|
||||||
mRefs.load (*mReader, index, mBase, mRefLoadCache[cellId], messages);
|
mRefs.load (*mReader, index, mBase, mRefLoadCache, cellId, messages);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "refcollection.hpp"
|
#include "refcollection.hpp"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <components/misc/stringops.hpp>
|
#include <components/misc/stringops.hpp>
|
||||||
#include <components/esm/loadcell.hpp>
|
#include <components/esm/loadcell.hpp>
|
||||||
|
@ -12,8 +13,10 @@
|
||||||
#include "record.hpp"
|
#include "record.hpp"
|
||||||
|
|
||||||
void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool base,
|
void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool base,
|
||||||
std::map<ESM::RefNum, std::string>& cache, CSMDoc::Messages& messages)
|
std::map<std::string, std::map<ESM::RefNum, std::string> >& cache, const std::string& origCellId,
|
||||||
|
CSMDoc::Messages& messages)
|
||||||
{
|
{
|
||||||
|
std::string cellid = origCellId;
|
||||||
Record<Cell> cell = mCells.getRecord (cellIndex);
|
Record<Cell> cell = mCells.getRecord (cellIndex);
|
||||||
|
|
||||||
Cell& cell2 = base ? cell.mBase : cell.mModified;
|
Cell& cell2 = base ? cell.mBase : cell.mModified;
|
||||||
|
@ -73,18 +76,20 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
|
||||||
std::cerr << "Position: #" << index.first << " " << index.second
|
std::cerr << "Position: #" << index.first << " " << index.second
|
||||||
<<", Target #"<< mref.mTarget[0] << " " << mref.mTarget[1] << std::endl;
|
<<", Target #"<< mref.mTarget[0] << " " << mref.mTarget[1] << std::endl;
|
||||||
}
|
}
|
||||||
// FIXME: need to transfer the ref to the new cell
|
|
||||||
|
// transfer the ref to the new cell
|
||||||
|
cellid = ref.mCell;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ref.mCell = cell2.mId;
|
ref.mCell = cell2.mId;
|
||||||
|
|
||||||
std::map<ESM::RefNum, std::string>::iterator iter = cache.find (ref.mRefNum);
|
std::map<ESM::RefNum, std::string>::iterator iter = cache[cellid].find (ref.mRefNum);
|
||||||
|
|
||||||
if (deleted)
|
if (deleted)
|
||||||
{
|
{
|
||||||
if (iter==cache.end())
|
if (iter==cache[cellid].end())
|
||||||
{
|
{
|
||||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Cell,
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Cell,
|
||||||
mCells.getId (cellIndex));
|
mCells.getId (cellIndex));
|
||||||
|
@ -101,7 +106,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
|
||||||
if (record.mState==RecordBase::State_BaseOnly)
|
if (record.mState==RecordBase::State_BaseOnly)
|
||||||
{
|
{
|
||||||
removeRows (index, 1);
|
removeRows (index, 1);
|
||||||
cache.erase (iter);
|
cache[cellid].erase (iter);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -112,7 +117,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iter==cache.end())
|
if (iter==cache[cellid].end())
|
||||||
{
|
{
|
||||||
// new reference
|
// new reference
|
||||||
ref.mId = getNewId();
|
ref.mId = getNewId();
|
||||||
|
@ -123,7 +128,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
|
||||||
|
|
||||||
appendRecord (record);
|
appendRecord (record);
|
||||||
|
|
||||||
cache.insert (std::make_pair (ref.mRefNum, ref.mId));
|
cache[cellid].insert (std::make_pair (ref.mRefNum, ref.mId));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace CSMWorld
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void load (ESM::ESMReader& reader, int cellIndex, bool base,
|
void load (ESM::ESMReader& reader, int cellIndex, bool base,
|
||||||
std::map<ESM::RefNum, std::string>& cache,
|
std::map<std::string, std::map<ESM::RefNum, std::string> >& cache, const std::string& cellid,
|
||||||
CSMDoc::Messages& messages);
|
CSMDoc::Messages& messages);
|
||||||
///< Load a sequence of references.
|
///< Load a sequence of references.
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <iostream> // FIXME: debugging only
|
|
||||||
|
|
||||||
#include <boost/concept_check.hpp>
|
#include <boost/concept_check.hpp>
|
||||||
|
|
||||||
|
@ -174,7 +173,6 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref, bool& deleted, bool ignoreMo
|
||||||
// TODO: Try and document reference numbering, I don't think this has been done anywhere else.
|
// TODO: Try and document reference numbering, I don't think this has been done anywhere else.
|
||||||
if (!esm.hasMoreSubs())
|
if (!esm.hasMoreSubs())
|
||||||
return false;
|
return false;
|
||||||
//bool print = false; // FIXME: debugging only
|
|
||||||
|
|
||||||
// NOTE: We should not need this check. It is a safety check until we have checked
|
// NOTE: We should not need this check. It is a safety check until we have checked
|
||||||
// more plugins, and how they treat these moved references.
|
// more plugins, and how they treat these moved references.
|
||||||
|
@ -184,9 +182,6 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref, bool& deleted, bool ignoreMo
|
||||||
{
|
{
|
||||||
esm.getHT (mref->mRefNum.mIndex);
|
esm.getHT (mref->mRefNum.mIndex);
|
||||||
esm.getHNOT (mref->mTarget, "CNDT");
|
esm.getHNOT (mref->mTarget, "CNDT");
|
||||||
//std::cout << "index " + std::to_string(mref->mRefNum.mIndex) + " target " <<
|
|
||||||
//std::to_string(mref->mTarget[0]) + ", " + std::to_string(mref->mTarget[1]) << std::endl;
|
|
||||||
//print = true; // FIXME: debugging only
|
|
||||||
adjustRefNum (mref->mRefNum, esm);
|
adjustRefNum (mref->mRefNum, esm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -199,19 +194,6 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref, bool& deleted, bool ignoreMo
|
||||||
|
|
||||||
ref.load (esm);
|
ref.load (esm);
|
||||||
|
|
||||||
#if 0
|
|
||||||
// FIXME: debugging only
|
|
||||||
if (print &&
|
|
||||||
((int)std::floor(ref.mPos.pos[0]/8192) != mref->mTarget[0] ||
|
|
||||||
(int)std::floor(ref.mPos.pos[1]/8192) != mref->mTarget[1]))
|
|
||||||
{
|
|
||||||
std::cout << ref.mRefID <<
|
|
||||||
", " + std::to_string((int)std::floor(ref.mPos.pos[0]/8192)) <<
|
|
||||||
", " + std::to_string((int)std::floor(ref.mPos.pos[1]/8192)) <<
|
|
||||||
", Z: " +std::to_string(ref.mPos.pos[2]) << std::endl;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Identify references belonging to a parent file and adapt the ID accordingly.
|
// Identify references belonging to a parent file and adapt the ID accordingly.
|
||||||
adjustRefNum (ref.mRefNum, esm);
|
adjustRefNum (ref.mRefNum, esm);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue