From 5f84b680afaf8b7b69ab2b9623f8356dd2b72393 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 11 Sep 2010 11:55:28 +0200 Subject: [PATCH] implemented exterior coc --- apps/openmw/mwscript/cellextensions.cpp | 15 +++++++++++-- apps/openmw/mwworld/world.cpp | 14 ++++++++++++ apps/openmw/mwworld/world.hpp | 3 +++ components/esm_store/reclists.hpp | 30 +++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwscript/cellextensions.cpp b/apps/openmw/mwscript/cellextensions.cpp index 93e77ee48..cf0f02a93 100644 --- a/apps/openmw/mwscript/cellextensions.cpp +++ b/apps/openmw/mwscript/cellextensions.cpp @@ -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]); + context.getWorld().changeToExteriorCell (pos); + } + else + { + pos.pos[0] = pos.pos[1] = 0; + context.getWorld().changeCell (cell, pos); + } } }; diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 496da44ef..056d33c6b 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -691,6 +691,20 @@ 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 + if (mStore.regions.search (cellName)) + if (const ESM::Cell *cell = mStore.cells.searchExtByRegion (cellName)) + return cell; + + return 0; + } + void World::markCellAsUnchanged() { mCellChanged = false; diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index 2ff2d3ccc..395b279d7 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -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(); diff --git a/components/esm_store/reclists.hpp b/components/esm_store/reclists.hpp index 3711a20b1..823433f56 100644 --- a/components/esm_store/reclists.hpp +++ b/components/esm_store/reclists.hpp @@ -209,6 +209,36 @@ 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 + { + 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->region==id) + return iter->second; + } + } + + return 0; + } + void load(ESMReader &esm, const std::string &id) { using namespace std;