1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-21 13:23:52 +00:00

Issue #19: More local script related cleanup

This commit is contained in:
Marc Zinnschlag 2011-10-07 09:52:42 +02:00
parent 896b7da23d
commit 8bebae17aa
6 changed files with 61 additions and 28 deletions

View file

@ -70,7 +70,7 @@ void OMW::Engine::executeLocalScripts()
break; break;
} }
mEnvironment.mWorld->getLocalScripts().setIgnore (MWWorld::Ptr()); localScripts.setIgnore (MWWorld::Ptr());
} }
bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt) bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)

View file

@ -1,6 +1,26 @@
#include "localscripts.hpp" #include "localscripts.hpp"
namespace
{
template<typename T>
void listCellScripts (MWWorld::LocalScripts& localScripts,
ESMS::CellRefList<T, MWWorld::RefData>& cellRefList, MWWorld::Ptr::CellStore *cell)
{
for (typename ESMS::CellRefList<T, MWWorld::RefData>::List::iterator iter (
cellRefList.list.begin());
iter!=cellRefList.list.end(); ++iter)
{
if (!iter->base->script.empty() && iter->mData.getCount())
{
localScripts.add (iter->base->script, MWWorld::Ptr (&*iter, cell));
}
}
}
}
MWWorld::LocalScripts::LocalScripts (const ESMS::ESMStore& store) : mStore (store) {}
void MWWorld::LocalScripts::setIgnore (const Ptr& ptr) void MWWorld::LocalScripts::setIgnore (const Ptr& ptr)
{ {
mIgnore = ptr; mIgnore = ptr;
@ -39,8 +59,34 @@ std::pair<std::string, MWWorld::Ptr> MWWorld::LocalScripts::getNext()
void MWWorld::LocalScripts::add (const std::string& scriptName, const Ptr& ptr) void MWWorld::LocalScripts::add (const std::string& scriptName, const Ptr& ptr)
{ {
if (const ESM::Script *script = mStore.scripts.find (scriptName))
{
ptr.getRefData().setLocals (*script);
mScripts.push_back (std::make_pair (scriptName, ptr)); mScripts.push_back (std::make_pair (scriptName, ptr));
} }
}
void MWWorld::LocalScripts::addCell (Ptr::CellStore *cell)
{
listCellScripts (*this, cell->activators, cell);
listCellScripts (*this, cell->potions, cell);
listCellScripts (*this, cell->appas, cell);
listCellScripts (*this, cell->armors, cell);
listCellScripts (*this, cell->books, cell);
listCellScripts (*this, cell->clothes, cell);
listCellScripts (*this, cell->containers, cell);
listCellScripts (*this, cell->creatures, cell);
listCellScripts (*this, cell->doors, cell);
listCellScripts (*this, cell->ingreds, cell);
listCellScripts (*this, cell->lights, cell);
listCellScripts (*this, cell->lockpicks, cell);
listCellScripts (*this, cell->miscItems, cell);
listCellScripts (*this, cell->npcs, cell);
listCellScripts (*this, cell->probes, cell);
listCellScripts (*this, cell->repairs, cell);
listCellScripts (*this, cell->weapons, cell);
}
void MWWorld::LocalScripts::clear() void MWWorld::LocalScripts::clear()
{ {

View file

@ -6,6 +6,11 @@
#include "ptr.hpp" #include "ptr.hpp"
namespace ESMS
{
struct ESMStore;
}
namespace MWWorld namespace MWWorld
{ {
/// \brief List of active local scripts /// \brief List of active local scripts
@ -14,9 +19,12 @@ namespace MWWorld
std::list<std::pair<std::string, Ptr> > mScripts; std::list<std::pair<std::string, Ptr> > mScripts;
std::list<std::pair<std::string, Ptr> >::iterator mIter; std::list<std::pair<std::string, Ptr> >::iterator mIter;
MWWorld::Ptr mIgnore; MWWorld::Ptr mIgnore;
const ESMS::ESMStore& mStore;
public: public:
LocalScripts (const ESMS::ESMStore& store);
void setIgnore (const Ptr& ptr); void setIgnore (const Ptr& ptr);
///< Mark a single reference for ignoring during iteration over local scripts (will revoke ///< Mark a single reference for ignoring during iteration over local scripts (will revoke
/// previous ignores). /// previous ignores).
@ -33,6 +41,9 @@ namespace MWWorld
void add (const std::string& scriptName, const Ptr& ptr); void add (const std::string& scriptName, const Ptr& ptr);
///< Add script to collection of active local scripts. ///< Add script to collection of active local scripts.
void addCell (Ptr::CellStore *cell);
///< Add all local scripts in a cell.
void clear(); void clear();
///< Clear active local scripts collection. ///< Clear active local scripts collection.

View file

@ -68,7 +68,7 @@ namespace MWWorld
void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render) void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render)
{ {
// register local scripts // register local scripts
mWorld->insertInteriorScripts (*cell); mWorld->getLocalScripts().addCell (cell);
// This connects the cell data with the rendering scene. // This connects the cell data with the rendering scene.
std::pair<CellRenderCollection::iterator, bool> result = std::pair<CellRenderCollection::iterator, bool> result =

View file

@ -66,28 +66,6 @@ namespace
namespace MWWorld namespace MWWorld
{ {
void World::insertInteriorScripts (ESMS::CellStore<RefData>& cell)
{
listCellScripts (mStore, cell.activators, mLocalScripts, &cell);
listCellScripts (mStore, cell.potions, mLocalScripts, &cell);
listCellScripts (mStore, cell.appas, mLocalScripts, &cell);
listCellScripts (mStore, cell.armors, mLocalScripts, &cell);
listCellScripts (mStore, cell.books, mLocalScripts, &cell);
listCellScripts (mStore, cell.clothes, mLocalScripts, &cell);
listCellScripts (mStore, cell.containers, mLocalScripts, &cell);
listCellScripts (mStore, cell.creatures, mLocalScripts, &cell);
listCellScripts (mStore, cell.doors, mLocalScripts, &cell);
listCellScripts (mStore, cell.ingreds, mLocalScripts, &cell);
listCellScripts (mStore, cell.lights, mLocalScripts, &cell);
listCellScripts (mStore, cell.lockpicks, mLocalScripts, &cell);
listCellScripts (mStore, cell.miscItems, mLocalScripts, &cell);
listCellScripts (mStore, cell.npcs, mLocalScripts, &cell);
listCellScripts (mStore, cell.probes, mLocalScripts, &cell);
listCellScripts (mStore, cell.repairs, mLocalScripts, &cell);
listCellScripts (mStore, cell.weapons, mLocalScripts, &cell);
}
Ptr World::getPtrViaHandle (const std::string& handle, Ptr::CellStore& cell) Ptr World::getPtrViaHandle (const std::string& handle, Ptr::CellStore& cell)
{ {
if (ESMS::LiveCellRef<ESM::Activator, RefData> *ref = if (ESMS::LiveCellRef<ESM::Activator, RefData> *ref =
@ -198,7 +176,7 @@ namespace MWWorld
const Files::Collections& fileCollections, const Files::Collections& fileCollections,
const std::string& master, const boost::filesystem::path& resDir, const std::string& master, const boost::filesystem::path& resDir,
bool newGame, Environment& environment, const std::string& encoding) bool newGame, Environment& environment, const std::string& encoding)
: mScene (renderer,physEng), mPlayer (0), mGlobalVariables (0), : mScene (renderer,physEng), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0),
mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this)
{ {
mPhysEngine = physEng; mPhysEngine = physEng;

View file

@ -107,8 +107,6 @@ namespace MWWorld
Ptr::CellStore *getInterior (const std::string& name); Ptr::CellStore *getInterior (const std::string& name);
void insertInteriorScripts (ESMS::CellStore<RefData>& cell);
void adjustSky(); void adjustSky();
MWWorld::Player& getPlayer(); MWWorld::Player& getPlayer();