1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-27 21:35:24 +00:00
OpenMW/apps/openmw/mwlua/object.hpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

107 lines
2.9 KiB
C++
Raw Normal View History

2020-12-18 23:21:10 +01:00
#ifndef MWLUA_OBJECT_H
#define MWLUA_OBJECT_H
2022-05-16 17:04:41 +02:00
#include <map>
2021-01-29 01:54:54 +01:00
#include <typeindex>
#include <sol/sol.hpp>
#include <components/esm3/cellref.hpp>
2020-12-18 23:21:10 +01:00
#include "../mwbase/environment.hpp"
2020-12-18 23:21:10 +01:00
#include "../mwworld/ptr.hpp"
#include "../mwworld/worldmodel.hpp"
2020-12-18 23:21:10 +01:00
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 const ObjectId& getId(const MWWorld::Ptr& ptr)
{
return ptr.getCellRef().getRefNum();
}
std::string idToString(const ObjectId& id);
2021-01-29 01:54:54 +01:00
std::string ptrToString(const MWWorld::Ptr& ptr);
2021-04-17 11:50:20 +02:00
bool isMarker(const MWWorld::Ptr& ptr);
2020-12-18 23:21:10 +01:00
// 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:
Object(ObjectId id)
2020-12-18 23:21:10 +01:00
: mId(id)
{
}
virtual ~Object() {}
ObjectId id() const { return mId; }
std::string toString() const;
// Updates and returns the underlying Ptr. Throws an exception if object is not available.
const MWWorld::Ptr& ptr() const;
// Returns `true` if calling `ptr()` is safe.
bool isValid() const;
virtual sol::object getObject(lua_State* lua, ObjectId id) const = 0; // returns LObject or GOBject
virtual sol::object getCell(lua_State* lua, MWWorld::CellStore* store) const = 0; // returns LCell or GCell
2020-12-18 23:21:10 +01:00
protected:
const ObjectId mId;
mutable MWWorld::Ptr mPtr;
mutable size_t mLastUpdate = 0;
2020-12-18 23:21:10 +01:00
};
// Used only in local scripts
struct LCell
{
MWWorld::CellStore* mStore;
};
2020-12-18 23:21:10 +01:00
class LObject : public Object
{
using Object::Object;
sol::object getObject(lua_State* lua, ObjectId id) const final { return sol::make_object<LObject>(lua, id); }
sol::object getCell(lua_State* lua, MWWorld::CellStore* store) const final
{
return sol::make_object(lua, LCell{ store });
}
2020-12-18 23:21:10 +01:00
};
// Used only in global scripts
struct GCell
{
MWWorld::CellStore* mStore;
};
2020-12-18 23:21:10 +01:00
class GObject : public Object
{
using Object::Object;
sol::object getObject(lua_State* lua, ObjectId id) const final { return sol::make_object<GObject>(lua, id); }
sol::object getCell(lua_State* lua, MWWorld::CellStore* store) const final
{
return sol::make_object(lua, GCell{ store });
}
2020-12-18 23:21:10 +01:00
};
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;
};
2020-12-18 23:21:10 +01:00
}
#endif // MWLUA_OBJECT_H