mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-06 00:55:50 +00:00
83 lines
1.8 KiB
C++
83 lines
1.8 KiB
C++
#ifndef MWLUA_OBJECT_H
|
|
#define MWLUA_OBJECT_H
|
|
|
|
#include <map>
|
|
#include <stdexcept>
|
|
#include <typeindex>
|
|
|
|
#include <sol/sol.hpp>
|
|
|
|
#include <components/esm3/cellref.hpp>
|
|
|
|
#include "../mwworld/ptr.hpp"
|
|
|
|
namespace MWLua
|
|
{
|
|
// ObjectId is a unique identifier of a game object.
|
|
// It can change only if the order of content files was change.
|
|
using ObjectId = ESM::RefNum;
|
|
inline ObjectId getId(const MWWorld::Ptr& ptr)
|
|
{
|
|
return ptr.getCellRef().getRefNum();
|
|
}
|
|
|
|
// Lua scripts can't use MWWorld::Ptr directly, because lifetime of a script can be longer than lifetime of Ptr.
|
|
// `GObject` and `LObject` are intended to be passed to Lua as a userdata.
|
|
// It automatically updates the underlying Ptr when needed.
|
|
class Object : public MWWorld::SafePtr
|
|
{
|
|
public:
|
|
using SafePtr::SafePtr;
|
|
const MWWorld::Ptr& ptr() const
|
|
{
|
|
const MWWorld::Ptr& res = ptrOrEmpty();
|
|
if (res.isEmpty())
|
|
throw std::runtime_error("Object is not available: " + id().toString());
|
|
return res;
|
|
}
|
|
};
|
|
|
|
// Used only in local scripts
|
|
struct LCell
|
|
{
|
|
MWWorld::CellStore* mStore;
|
|
};
|
|
class LObject : public Object
|
|
{
|
|
using Object::Object;
|
|
};
|
|
|
|
// Used only in global scripts
|
|
struct GCell
|
|
{
|
|
MWWorld::CellStore* mStore;
|
|
};
|
|
class GObject : public Object
|
|
{
|
|
using Object::Object;
|
|
};
|
|
|
|
using ObjectIdList = std::shared_ptr<std::vector<ObjectId>>;
|
|
template <typename Obj>
|
|
struct ObjectList
|
|
{
|
|
ObjectIdList mIds;
|
|
};
|
|
using GObjectList = ObjectList<GObject>;
|
|
using LObjectList = ObjectList<LObject>;
|
|
|
|
template <typename Obj>
|
|
struct Inventory
|
|
{
|
|
Obj mObj;
|
|
};
|
|
|
|
template <typename Obj>
|
|
struct Owner
|
|
{
|
|
Obj mObj;
|
|
};
|
|
}
|
|
|
|
#endif // MWLUA_OBJECT_H
|