#ifndef MWLUA_OBJECT_H #define MWLUA_OBJECT_H #include #include #include #include #include #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>; template struct ObjectList { ObjectIdList mIds; }; using GObjectList = ObjectList; using LObjectList = ObjectList; template struct Inventory { Obj mObj; }; template struct Owner { Obj mObj; }; } #endif // MWLUA_OBJECT_H