forked from mirror/openmw-tes3mp
added unifying LiveCellRef pointer class
This commit is contained in:
parent
d51e6fb7c4
commit
3fae68b403
7 changed files with 69 additions and 7 deletions
|
@ -61,7 +61,8 @@ set(GAMEWORLD
|
||||||
apps/openmw/mwworld/world.cpp)
|
apps/openmw/mwworld/world.cpp)
|
||||||
set(GAMEWORLD_HEADER
|
set(GAMEWORLD_HEADER
|
||||||
apps/openmw/mwworld/refdata.hpp
|
apps/openmw/mwworld/refdata.hpp
|
||||||
apps/openmw/mwworld/world.hpp)
|
apps/openmw/mwworld/world.hpp
|
||||||
|
apps/openmw/mwworld/ptr.hpp)
|
||||||
source_group(apps\\openmw\\mwworld FILES ${GAMEWORLD} ${GAMEWORLD_HEADER})
|
source_group(apps\\openmw\\mwworld FILES ${GAMEWORLD} ${GAMEWORLD_HEADER})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,13 +17,15 @@
|
||||||
#include "mwsound/soundmanager.hpp"
|
#include "mwsound/soundmanager.hpp"
|
||||||
|
|
||||||
#include "mwworld/world.hpp"
|
#include "mwworld/world.hpp"
|
||||||
|
#include "mwworld/ptr.hpp"
|
||||||
|
|
||||||
void OMW::Engine::executeLocalScripts()
|
void OMW::Engine::executeLocalScripts()
|
||||||
{
|
{
|
||||||
for (MWWorld::World::ScriptList::const_iterator iter (mWorld->getLocalScripts().begin());
|
for (MWWorld::World::ScriptList::const_iterator iter (mWorld->getLocalScripts().begin());
|
||||||
iter!=mWorld->getLocalScripts().end(); ++iter)
|
iter!=mWorld->getLocalScripts().end(); ++iter)
|
||||||
{
|
{
|
||||||
MWScript::InterpreterContext interpreterContext (*mWorld, *mSoundManager, iter->second);
|
MWScript::InterpreterContext interpreterContext (*mWorld, *mSoundManager,
|
||||||
|
&iter->second.getRefData().getLocals(), MWWorld::Ptr (iter->second));
|
||||||
mScriptManager->run (iter->first, interpreterContext);
|
mScriptManager->run (iter->first, interpreterContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
namespace MWScript
|
namespace MWScript
|
||||||
{
|
{
|
||||||
InterpreterContext::InterpreterContext (MWWorld::World& world,
|
InterpreterContext::InterpreterContext (MWWorld::World& world,
|
||||||
MWSound::SoundManager& soundManager, MWScript::Locals *locals)
|
MWSound::SoundManager& soundManager, MWScript::Locals *locals, MWWorld::Ptr reference)
|
||||||
: mWorld (world), mSoundManager (soundManager), mLocals (locals)
|
: mWorld (world), mSoundManager (soundManager), mLocals (locals), mReference (reference)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
int InterpreterContext::getLocalShort (int index) const
|
int InterpreterContext::getLocalShort (int index) const
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include <components/interpreter/context.hpp>
|
#include <components/interpreter/context.hpp>
|
||||||
|
|
||||||
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
class World;
|
class World;
|
||||||
|
@ -22,11 +24,12 @@ namespace MWScript
|
||||||
MWWorld::World& mWorld;
|
MWWorld::World& mWorld;
|
||||||
MWSound::SoundManager& mSoundManager;
|
MWSound::SoundManager& mSoundManager;
|
||||||
Locals *mLocals;
|
Locals *mLocals;
|
||||||
|
MWWorld::Ptr mReference;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
InterpreterContext (MWWorld::World& world, MWSound::SoundManager& soundManager,
|
InterpreterContext (MWWorld::World& world, MWSound::SoundManager& soundManager,
|
||||||
MWScript::Locals *locals);
|
MWScript::Locals *locals, MWWorld::Ptr reference);
|
||||||
///< The ownership of \a locals is not transferred. 0-pointer allowed.
|
///< The ownership of \a locals is not transferred. 0-pointer allowed.
|
||||||
|
|
||||||
virtual int getLocalShort (int index) const;
|
virtual int getLocalShort (int index) const;
|
||||||
|
|
55
apps/openmw/mwworld/ptr.hpp
Normal file
55
apps/openmw/mwworld/ptr.hpp
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#ifndef GAME_MWWORLD_PTR_H
|
||||||
|
#define GAME_MWWORLD_PTR_H
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include <boost/any.hpp>
|
||||||
|
|
||||||
|
#include <components/esm_store/cell_store.hpp>
|
||||||
|
|
||||||
|
#include "refdata.hpp"
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
/// \brief Pointer to a LiveCellRef
|
||||||
|
|
||||||
|
class Ptr
|
||||||
|
{
|
||||||
|
boost::any mPtr;
|
||||||
|
ESM::CellRef *mCellRef;
|
||||||
|
RefData *mRefData;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Ptr() : mCellRef (0), mRefData (0) {}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Ptr (ESMS::LiveCellRef<T, RefData> *liveCellRef)
|
||||||
|
{
|
||||||
|
mPtr = liveCellRef;
|
||||||
|
mCellRef = &liveCellRef->ref;
|
||||||
|
mRefData = &liveCellRef->mData;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
ESMS::LiveCellRef<T, RefData> *get() const
|
||||||
|
{
|
||||||
|
return boost::any_cast<const ESMS::LiveCellRef<T, RefData>*> (mPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESM::CellRef& getCellRef() const
|
||||||
|
{
|
||||||
|
assert (mCellRef);
|
||||||
|
return *mCellRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
RefData& getRefData() const
|
||||||
|
{
|
||||||
|
assert (mRefData);
|
||||||
|
return *mRefData;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -26,7 +26,7 @@ namespace
|
||||||
iter->mData.setLocals (*script);
|
iter->mData.setLocals (*script);
|
||||||
|
|
||||||
scriptList.push_back (
|
scriptList.push_back (
|
||||||
std::make_pair (iter->base->script, &iter->mData.getLocals()));
|
std::make_pair (iter->base->script, MWWorld::Ptr (&*iter)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "../mwrender/mwscene.hpp"
|
#include "../mwrender/mwscene.hpp"
|
||||||
|
|
||||||
#include "refdata.hpp"
|
#include "refdata.hpp"
|
||||||
|
#include "ptr.hpp"
|
||||||
|
|
||||||
namespace Render
|
namespace Render
|
||||||
{
|
{
|
||||||
|
@ -32,7 +33,7 @@ namespace MWWorld
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef std::vector<std::pair<std::string, MWScript::Locals *> > ScriptList;
|
typedef std::vector<std::pair<std::string, Ptr> > ScriptList;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue