mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-17 01:10:10 +00:00
Merge remote branch 'zinnschlag/cell'
This commit is contained in:
commit
3e170002e2
@ -41,9 +41,20 @@ namespace MWScript
|
||||
runtime.pop();
|
||||
|
||||
ESM::Position pos;
|
||||
pos.pos[0] = pos.pos[1] = pos.pos[2] = 0;
|
||||
pos.rot[0] = pos.rot[1] = pos.rot[2] = 0;
|
||||
context.getWorld().changeCell (cell, pos);
|
||||
pos.pos[2] = 0;
|
||||
|
||||
if (const ESM::Cell *exterior = context.getWorld().getExterior (cell))
|
||||
{
|
||||
context.getWorld().indexToPosition (exterior->data.gridX, exterior->data.gridY,
|
||||
pos.pos[0], pos.pos[1], true);
|
||||
context.getWorld().changeToExteriorCell (pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
pos.pos[0] = pos.pos[1] = 0;
|
||||
context.getWorld().changeCell (cell, pos);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -64,7 +75,7 @@ namespace MWScript
|
||||
|
||||
ESM::Position pos;
|
||||
|
||||
context.getWorld().indexToPosition (x, y, pos.pos[0], pos.pos[1]);
|
||||
context.getWorld().indexToPosition (x, y, pos.pos[0], pos.pos[1], true);
|
||||
pos.pos[2] = 0;
|
||||
|
||||
pos.rot[0] = pos.rot[1] = pos.rot[2] = 0;
|
||||
|
@ -691,6 +691,30 @@ namespace MWWorld
|
||||
changeCell (x, y, position);
|
||||
}
|
||||
|
||||
const ESM::Cell *World::getExterior (const std::string& cellName) const
|
||||
{
|
||||
// first try named cells
|
||||
if (const ESM::Cell *cell = mStore.cells.searchExtByName (cellName))
|
||||
return cell;
|
||||
|
||||
// didn't work -> now check for regions
|
||||
std::string cellName2 = ESMS::RecListT<ESM::Region>::toLower (cellName);
|
||||
|
||||
for (ESMS::RecListT<ESM::Region>::MapType::const_iterator iter (mStore.regions.list.begin());
|
||||
iter!=mStore.regions.list.end(); ++iter)
|
||||
{
|
||||
if (ESMS::RecListT<ESM::Region>::toLower (iter->second.name)==cellName2)
|
||||
{
|
||||
if (const ESM::Cell *cell = mStore.cells.searchExtByRegion (iter->first))
|
||||
return cell;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void World::markCellAsUnchanged()
|
||||
{
|
||||
mCellChanged = false;
|
||||
@ -756,12 +780,18 @@ namespace MWWorld
|
||||
// TODO cell change for non-player ref
|
||||
}
|
||||
|
||||
void World::indexToPosition (int cellX, int cellY, float &x, float &y) const
|
||||
void World::indexToPosition (int cellX, int cellY, float &x, float &y, bool centre) const
|
||||
{
|
||||
const int cellSize = 8192;
|
||||
|
||||
x = cellSize * cellX;
|
||||
y = cellSize * cellY;
|
||||
|
||||
if (centre)
|
||||
{
|
||||
x += cellSize/2;
|
||||
y += cellSize/2;
|
||||
}
|
||||
}
|
||||
|
||||
void World::positionToIndex (float x, float y, int &cellX, int &cellY) const
|
||||
|
@ -145,6 +145,9 @@ namespace MWWorld
|
||||
|
||||
void changeToExteriorCell (const ESM::Position& position);
|
||||
|
||||
const ESM::Cell *getExterior (const std::string& cellName) const;
|
||||
///< Return a cell matching the given name or a 0-pointer, if there is no such cell.
|
||||
|
||||
void markCellAsUnchanged();
|
||||
|
||||
std::string getFacedHandle();
|
||||
@ -154,7 +157,7 @@ namespace MWWorld
|
||||
|
||||
void moveObject (Ptr ptr, float x, float y, float z);
|
||||
|
||||
void indexToPosition (int cellX, int cellY, float &x, float &y) const;
|
||||
void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false) const;
|
||||
///< Convert cell numbers to position.
|
||||
|
||||
void positionToIndex (float x, float y, int &cellX, int &cellY) const;
|
||||
|
@ -209,6 +209,38 @@ namespace ESMS
|
||||
return it2->second;
|
||||
}
|
||||
|
||||
const Cell *searchExtByName (const std::string& id) const
|
||||
{
|
||||
for (ExtCells::const_iterator iter = extCells.begin(); iter!=extCells.end(); ++iter)
|
||||
{
|
||||
const ExtCellsCol& column = iter->second;
|
||||
for (ExtCellsCol::const_iterator iter = column.begin(); iter!=column.end(); ++iter)
|
||||
{
|
||||
if (iter->second->name==id)
|
||||
return iter->second;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Cell *searchExtByRegion (const std::string& id) const
|
||||
{
|
||||
std::string id2 = toLower (id);
|
||||
|
||||
for (ExtCells::const_iterator iter = extCells.begin(); iter!=extCells.end(); ++iter)
|
||||
{
|
||||
const ExtCellsCol& column = iter->second;
|
||||
for (ExtCellsCol::const_iterator iter = column.begin(); iter!=column.end(); ++iter)
|
||||
{
|
||||
if (toLower (iter->second->region)==id)
|
||||
return iter->second;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void load(ESMReader &esm, const std::string &id)
|
||||
{
|
||||
using namespace std;
|
||||
|
Loading…
Reference in New Issue
Block a user