1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-06 00:55:50 +00:00
OpenMW/apps/openmw/mwlua/object.hpp
2024-02-05 18:48:53 +01:00

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