mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 20:53:50 +00:00
- Add support for multiple esm contexts in cell store. This will allow to generate references from multiple esX files. Currently, only the first context is used.
- Add many TODOs to mark points where more work is required to fully implement this feature.
This commit is contained in:
parent
64c08eada4
commit
7f77bf76c7
5 changed files with 89 additions and 60 deletions
|
@ -45,10 +45,16 @@ namespace MWWorld
|
|||
{
|
||||
assert (cell);
|
||||
|
||||
if (cell->mContext.filename.empty())
|
||||
if (cell->mContextList.size() == 0)
|
||||
return; // this is a dynamically generated cell -> skipping.
|
||||
|
||||
// Load references from all plugins that do something with this cell.
|
||||
// HACK: only use first entry for now, full support requires some more work
|
||||
//for (int i = 0; i < cell->mContextList.size(); i++)
|
||||
for (int i = 0; i < 1; i++)
|
||||
{
|
||||
// Reopen the ESM reader and seek to the right position.
|
||||
// TODO: we will need to intoduce separate "esm"s, one per plugin!
|
||||
cell->restore (esm);
|
||||
|
||||
ESM::CellRef ref;
|
||||
|
@ -61,8 +67,11 @@ namespace MWWorld
|
|||
std::transform (ref.mRefID.begin(), ref.mRefID.end(), std::back_inserter (lowerCase),
|
||||
(int(*)(int)) std::tolower);
|
||||
|
||||
// TODO: support deletion / moving references out of the cell. no simple "push_back",
|
||||
// but see what the plugin wants to do.
|
||||
mIds.push_back (lowerCase);
|
||||
}
|
||||
}
|
||||
|
||||
std::sort (mIds.begin(), mIds.end());
|
||||
}
|
||||
|
@ -71,10 +80,16 @@ namespace MWWorld
|
|||
{
|
||||
assert (cell);
|
||||
|
||||
if (cell->mContext.filename.empty())
|
||||
if (cell->mContextList.size() == 0)
|
||||
return; // this is a dynamically generated cell -> skipping.
|
||||
|
||||
// Load references from all plugins that do something with this cell.
|
||||
// HACK: only use first entry for now, full support requires some more work
|
||||
//for (int i = 0; i < cell->mContextList.size(); i++)
|
||||
for (int i = 0; i < 1; i++)
|
||||
{
|
||||
// Reopen the ESM reader and seek to the right position.
|
||||
// TODO: we will need to intoduce separate "esm"s, one per plugin!
|
||||
cell->restore(esm);
|
||||
|
||||
ESM::CellRef ref;
|
||||
|
@ -125,4 +140,5 @@ namespace MWWorld
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,6 +62,10 @@ namespace MWWorld
|
|||
if(obj == NULL)
|
||||
throw std::runtime_error("Error resolving cell reference " + ref.mRefID);
|
||||
|
||||
// TODO: this line must be modified for multiple plugins and moved references.
|
||||
// This means: no simple "push back", but search for an existing reference with
|
||||
// this ID first! If it exists, merge data into this list instead of just adding it.
|
||||
// I'll probably generate a separate method jist for this.
|
||||
list.push_back(LiveRef(ref, obj));
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <c++/4.6/list>
|
||||
|
||||
#include "esmreader.hpp"
|
||||
#include "esmwriter.hpp"
|
||||
|
@ -111,7 +112,7 @@ void Cell::load(ESMReader &esm)
|
|||
}
|
||||
|
||||
// Save position of the cell references and move on
|
||||
mContext = esm.getContext();
|
||||
mContextList.push_back(esm.getContext());
|
||||
esm.skipRecord();
|
||||
}
|
||||
|
||||
|
@ -148,7 +149,8 @@ void Cell::save(ESMWriter &esm)
|
|||
|
||||
void Cell::restore(ESMReader &esm) const
|
||||
{
|
||||
esm.restoreContext(mContext);
|
||||
// TODO: support all contexts in the list!
|
||||
esm.restoreContext(mContextList[0]);
|
||||
}
|
||||
|
||||
std::string Cell::getDescription() const
|
||||
|
@ -167,6 +169,12 @@ std::string Cell::getDescription() const
|
|||
|
||||
bool Cell::getNextRef(ESMReader &esm, CellRef &ref)
|
||||
{
|
||||
// TODO: Add support for moved references. References moved without crossing a cell boundary simply
|
||||
// overwrite old data. References moved across cell boundaries are using a different set of keywords,
|
||||
// and I'll have to think more about how this can be done.
|
||||
// TODO: Add support for multiple plugins. This requires a tricky renaming scheme for "ref.mRefnum".
|
||||
// I'll probably add something to "ESMReader", we will need one per plugin anyway.
|
||||
// TODO: Try and document reference numbering, I don't think this has been done anywhere else.
|
||||
if (!esm.hasMoreSubs())
|
||||
return false;
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define OPENMW_ESM_CELL_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "esmcommon.hpp"
|
||||
#include "defs.hpp"
|
||||
|
@ -120,7 +121,7 @@ struct Cell
|
|||
// Optional region name for exterior and quasi-exterior cells.
|
||||
std::string mRegion;
|
||||
|
||||
ESM_Context mContext; // File position
|
||||
std::vector<ESM_Context> mContextList; // File position; multiple positions for multiple plugin support
|
||||
DATAstruct mData;
|
||||
AMBIstruct mAmbi;
|
||||
float mWater; // Water level
|
||||
|
|
2
extern/shiny
vendored
2
extern/shiny
vendored
|
@ -1 +1 @@
|
|||
Subproject commit f17c4ebab0e7a1f3bbb25fd9b3dbef2bd742536a
|
||||
Subproject commit 4750676ac46a7aaa86bca53dc68c5a1ba11f3bc1
|
Loading…
Reference in a new issue