mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-31 14:15:35 +00:00
[Lua] Split obj.inventory into Actor.inventory(obj) and Container.content(obj)
This commit is contained in:
parent
d251c4e2a1
commit
43bed7f0d2
8 changed files with 33 additions and 18 deletions
|
@ -60,7 +60,7 @@ add_openmw_dir (mwlua
|
|||
luamanagerimp actions object worldview userdataserializer eventqueue query
|
||||
luabindings localscripts playerscripts objectbindings cellbindings asyncbindings settingsbindings
|
||||
camerabindings uibindings inputbindings nearbybindings
|
||||
types/types types/door types/actor
|
||||
types/types types/door types/actor types/container
|
||||
)
|
||||
|
||||
add_openmw_dir (mwsound
|
||||
|
|
|
@ -391,6 +391,7 @@ namespace MWLua
|
|||
{
|
||||
assert(mInitialized);
|
||||
assert(flag != ESM::LuaScriptCfg::sGlobal);
|
||||
assert(ptr.getType() != ESM::REC_STAT);
|
||||
std::shared_ptr<LocalScripts> scripts;
|
||||
if (flag == ESM::LuaScriptCfg::sPlayer)
|
||||
{
|
||||
|
|
|
@ -118,6 +118,9 @@ namespace MWLua
|
|||
using GObjectList = ObjectList<GObject>;
|
||||
using LObjectList = ObjectList<LObject>;
|
||||
|
||||
template <typename Obj>
|
||||
struct Inventory { Obj mObj; };
|
||||
|
||||
}
|
||||
|
||||
#endif // MWLUA_OBJECT_H
|
||||
|
|
|
@ -12,15 +12,6 @@
|
|||
#include "luamanagerimp.hpp"
|
||||
#include "types/types.hpp"
|
||||
|
||||
namespace MWLua
|
||||
{
|
||||
template <typename ObjectT>
|
||||
struct Inventory
|
||||
{
|
||||
ObjectT mObj;
|
||||
};
|
||||
}
|
||||
|
||||
namespace sol
|
||||
{
|
||||
template <>
|
||||
|
@ -149,6 +140,8 @@ namespace MWLua
|
|||
throw std::runtime_error("Unknown script: " + std::string(path));
|
||||
if (!(cfg[*scriptId].mFlags & ESM::LuaScriptCfg::sCustom))
|
||||
throw std::runtime_error("Script without CUSTOM tag can not be added dynamically: " + std::string(path));
|
||||
if (object.ptr().getType() == ESM::REC_STAT)
|
||||
throw std::runtime_error("Attaching scripts to Static is not allowed: " + std::string(path));
|
||||
luaManager->addCustomLocalScript(object.ptr(), *scriptId);
|
||||
};
|
||||
objectT["hasScript"] = [lua=context.mLua](const GObject& object, std::string_view path)
|
||||
|
@ -200,7 +193,6 @@ namespace MWLua
|
|||
using InventoryT = Inventory<ObjectT>;
|
||||
sol::usertype<InventoryT> inventoryT = context.mLua->sol().new_usertype<InventoryT>(prefix + "Inventory");
|
||||
|
||||
objectT["inventory"] = sol::readonly_property([](const ObjectT& o) { return InventoryT{o}; });
|
||||
inventoryT[sol::meta_function::to_string] =
|
||||
[](const InventoryT& inv) { return "Inventory[" + inv.mObj.toString() + "]"; };
|
||||
|
||||
|
|
|
@ -83,7 +83,11 @@ namespace MWLua
|
|||
return MWBase::Environment::get().getWorld()->isSwimming(o.ptr());
|
||||
};
|
||||
|
||||
actor["getEquipment"] = [context](const Object& o)
|
||||
actor["inventory"] = sol::overload(
|
||||
[](const LObject& o) { return Inventory<LObject>{o}; },
|
||||
[](const GObject& o) { return Inventory<GObject>{o}; }
|
||||
);
|
||||
actor["equipment"] = [context](const Object& o)
|
||||
{
|
||||
const MWWorld::Ptr& ptr = o.ptr();
|
||||
sol::table equipment(context.mLua->sol(), sol::create);
|
||||
|
@ -109,12 +113,8 @@ namespace MWLua
|
|||
MWWorld::InventoryStore& store = ptr.getClass().getInventoryStore(ptr);
|
||||
return store.isEquipped(item.ptr());
|
||||
};
|
||||
actor["setEquipment"] = [context](const sol::object& luaObj, const sol::table& equipment)
|
||||
actor["setEquipment"] = [context](const SelfObject& obj, const sol::table& equipment)
|
||||
{
|
||||
if (!luaObj.is<GObject>() && !luaObj.is<SelfObject>())
|
||||
throw std::runtime_error("Incorrect type of the first argument. "
|
||||
"Can be either self (in local scripts) or game object (in global scripts)");
|
||||
const Object& obj = luaObj.as<Object>();
|
||||
if (!obj.ptr().getClass().hasInventoryStore(obj.ptr()))
|
||||
{
|
||||
if (!equipment.empty())
|
||||
|
|
18
apps/openmw/mwlua/types/container.cpp
Normal file
18
apps/openmw/mwlua/types/container.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include "types.hpp"
|
||||
|
||||
#include "../luabindings.hpp"
|
||||
|
||||
namespace MWLua
|
||||
{
|
||||
|
||||
static const MWWorld::Ptr& containerPtr(const Object& o) { return verifyType(ESM::REC_CONT, o.ptr()); }
|
||||
|
||||
void addContainerBindings(sol::table container, const Context& context)
|
||||
{
|
||||
container["content"] = sol::overload(
|
||||
[](const LObject& o) { containerPtr(o); return Inventory<LObject>{o}; },
|
||||
[](const GObject& o) { containerPtr(o); return Inventory<GObject>{o}; }
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -173,7 +173,7 @@ namespace MWLua
|
|||
addType(ObjectTypeName::Repair, {ESM::REC_REPA}, ObjectTypeName::Item);
|
||||
|
||||
addType(ObjectTypeName::Activator, {ESM::REC_ACTI});
|
||||
addType(ObjectTypeName::Container, {ESM::REC_CONT});
|
||||
addContainerBindings(addType(ObjectTypeName::Container, {ESM::REC_CONT}), context);
|
||||
addDoorBindings(addType(ObjectTypeName::Door, {ESM::REC_DOOR}), context);
|
||||
addType(ObjectTypeName::Static, {ESM::REC_STAT});
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ namespace MWLua
|
|||
sol::table initTypesPackage(const Context& context);
|
||||
|
||||
// used in initTypesPackage
|
||||
void addContainerBindings(sol::table door, const Context& context);
|
||||
void addDoorBindings(sol::table door, const Context& context);
|
||||
void addActorBindings(sol::table actor, const Context& context);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue