From 1b37d5d2ad934c4a07186d5ba6ccded91db8f05d Mon Sep 17 00:00:00 2001 From: Kindi <2538602-Kuyondo@users.noreply.gitlab.com> Date: Tue, 24 May 2022 11:48:13 +0000 Subject: [PATCH] Lua API for Lockpick and Probe records --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwlua/types/lockpick.cpp | 35 +++++++++++++++++++++++++++ apps/openmw/mwlua/types/probe.cpp | 35 +++++++++++++++++++++++++++ apps/openmw/mwlua/types/types.cpp | 6 ++--- apps/openmw/mwlua/types/types.hpp | 2 ++ files/lua_api/openmw/types.lua | 36 ++++++++++++++++++++++++++++ 6 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 apps/openmw/mwlua/types/lockpick.cpp create mode 100644 apps/openmw/mwlua/types/probe.cpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 20ea6f7452..0ccb517a33 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -62,7 +62,7 @@ add_openmw_dir (mwlua luamanagerimp object worldview userdataserializer eventqueue luabindings localscripts playerscripts objectbindings cellbindings asyncbindings settingsbindings camerabindings uibindings inputbindings nearbybindings postprocessingbindings stats debugbindings - types/types types/door types/actor types/container types/weapon types/npc types/creature types/activator types/book + types/types types/door types/actor types/container types/weapon types/npc types/creature types/activator types/book types/lockpick types/probe ) add_openmw_dir (mwsound diff --git a/apps/openmw/mwlua/types/lockpick.cpp b/apps/openmw/mwlua/types/lockpick.cpp new file mode 100644 index 0000000000..71c7ec5646 --- /dev/null +++ b/apps/openmw/mwlua/types/lockpick.cpp @@ -0,0 +1,35 @@ +#include "types.hpp" + +#include + +#include + +#include "../luabindings.hpp" + +namespace sol +{ + template <> + struct is_automagical : std::false_type {}; +} + +namespace MWLua +{ + void addLockpickBindings(sol::table lockpick, const Context& context) + { + const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); + lockpick["record"] = sol::overload( + [](const Object& obj) -> const ESM::Lockpick* { return obj.ptr().get()->mBase;}, + [store](const std::string& recordId) -> const ESM::Lockpick* { return store->find(recordId);}); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Lockpick"); + record[sol::meta_function::to_string] = [](const ESM::Lockpick& rec) { return "ESM3_Lockpick[" + rec.mId + "]";}; + record["id"] = sol::readonly_property([](const ESM::Lockpick& rec) -> std::string { return rec.mId;}); + record["name"] = sol::readonly_property([](const ESM::Lockpick& rec) -> std::string { return rec.mName;}); + record["model"] = sol::readonly_property([](const ESM::Lockpick& rec) -> std::string { return rec.mModel;}); + record["mwscript"] = sol::readonly_property([](const ESM::Lockpick& rec) -> std::string { return rec.mScript;}); + record["icon"] = sol::readonly_property([](const ESM::Lockpick& rec) -> std::string { return rec.mIcon;}); + record["maxCondition"] = sol::readonly_property([](const ESM::Lockpick& rec) -> int { return rec.mData.mUses;}); + record["value"] = sol::readonly_property([](const ESM::Lockpick& rec) -> int { return rec.mData.mValue;}); + record["weight"] = sol::readonly_property([](const ESM::Lockpick& rec) -> float { return rec.mData.mWeight;}); + record["quality"] = sol::readonly_property([](const ESM::Lockpick& rec) -> float { return rec.mData.mQuality;}); + } +} diff --git a/apps/openmw/mwlua/types/probe.cpp b/apps/openmw/mwlua/types/probe.cpp new file mode 100644 index 0000000000..771824fce1 --- /dev/null +++ b/apps/openmw/mwlua/types/probe.cpp @@ -0,0 +1,35 @@ +#include "types.hpp" + +#include + +#include + +#include "../luabindings.hpp" + +namespace sol +{ + template <> + struct is_automagical : std::false_type {}; +} + +namespace MWLua +{ + void addProbeBindings(sol::table probe, const Context& context) + { + const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); + probe["record"] = sol::overload( + [](const Object& obj) -> const ESM::Probe* { return obj.ptr().get()->mBase;}, + [store](const std::string& recordId) -> const ESM::Probe* { return store->find(recordId);}); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Probe"); + record[sol::meta_function::to_string] = [](const ESM::Probe& rec) { return "ESM3_Probe[" + rec.mId + "]";}; + record["id"] = sol::readonly_property([](const ESM::Probe& rec) -> std::string { return rec.mId;}); + record["name"] = sol::readonly_property([](const ESM::Probe& rec) -> std::string { return rec.mName;}); + record["model"] = sol::readonly_property([](const ESM::Probe& rec) -> std::string { return rec.mModel;}); + record["mwscript"] = sol::readonly_property([](const ESM::Probe& rec) -> std::string { return rec.mScript;}); + record["icon"] = sol::readonly_property([](const ESM::Probe& rec) -> std::string { return rec.mIcon;}); + record["maxCondition"] = sol::readonly_property([](const ESM::Probe& rec) -> int { return rec.mData.mUses;}); + record["value"] = sol::readonly_property([](const ESM::Probe& rec) -> int { return rec.mData.mValue;}); + record["weight"] = sol::readonly_property([](const ESM::Probe& rec) -> float { return rec.mData.mWeight;}); + record["quality"] = sol::readonly_property([](const ESM::Probe& rec) -> float { return rec.mData.mQuality;}); + } +} diff --git a/apps/openmw/mwlua/types/types.cpp b/apps/openmw/mwlua/types/types.cpp index 5330526edb..f52d09ba7e 100644 --- a/apps/openmw/mwlua/types/types.cpp +++ b/apps/openmw/mwlua/types/types.cpp @@ -166,13 +166,13 @@ namespace MWLua addType(ObjectTypeName::MiscItem, {ESM::REC_MISC}, ObjectTypeName::Item); addType(ObjectTypeName::Potion, {ESM::REC_ALCH}, ObjectTypeName::Item); addWeaponBindings(addType(ObjectTypeName::Weapon, {ESM::REC_WEAP}, ObjectTypeName::Item), context); + addBookBindings(addType(ObjectTypeName::Book, {ESM::REC_BOOK}, ObjectTypeName::Item), context); + addLockpickBindings(addType(ObjectTypeName::Lockpick, {ESM::REC_LOCK}, ObjectTypeName::Item), context); + addProbeBindings(addType(ObjectTypeName::Probe, {ESM::REC_PROB}, ObjectTypeName::Item), context); addType(ObjectTypeName::Apparatus, {ESM::REC_APPA}, ObjectTypeName::Item); - addType(ObjectTypeName::Lockpick, {ESM::REC_LOCK}, ObjectTypeName::Item); - addType(ObjectTypeName::Probe, {ESM::REC_PROB}, ObjectTypeName::Item); addType(ObjectTypeName::Repair, {ESM::REC_REPA}, ObjectTypeName::Item); addActivatorBindings(addType(ObjectTypeName::Activator, {ESM::REC_ACTI}), context); - addBookBindings(addType(ObjectTypeName::Book, {ESM::REC_BOOK}), context); addContainerBindings(addType(ObjectTypeName::Container, {ESM::REC_CONT}), context); addDoorBindings(addType(ObjectTypeName::Door, {ESM::REC_DOOR}), context); addType(ObjectTypeName::Static, {ESM::REC_STAT}); diff --git a/apps/openmw/mwlua/types/types.hpp b/apps/openmw/mwlua/types/types.hpp index f92644f443..9145752c58 100644 --- a/apps/openmw/mwlua/types/types.hpp +++ b/apps/openmw/mwlua/types/types.hpp @@ -32,6 +32,8 @@ namespace MWLua void addWeaponBindings(sol::table weapon, const Context& context); void addNpcBindings(sol::table npc, const Context& context); void addCreatureBindings(sol::table creature, const Context& context); + void addLockpickBindings(sol::table lockpick, const Context& context); + void addProbeBindings(sol::table probe, const Context& context); } #endif // MWLUA_TYPES_H diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index d9a4d36439..b77c3ec054 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -762,6 +762,24 @@ -- @param openmw.core#GameObject object -- @return #boolean +--- +-- Returns the read-only @{#LockpickRecord} of a lockpick +-- @function [parent=#Lockpick] record +-- @param #any objectOrRecordId +-- @return #LockpickRecord + +--- +-- @type LockpickRecord +-- @field #string id The record ID of the lockpick +-- @field #string name The name of the lockpick +-- @field #string model VFS path to the model +-- @field #string mwscript MWScript on this lockpick (can be empty) +-- @field #string icon VFS path to the icon +-- @field #number maxCondition The maximum number of uses of this lockpick +-- @field #number weight +-- @field #number value +-- @field #number quality The quality of the lockpick + --- @{#Probe} functions -- @field [parent=#types] #Probe Probe @@ -776,6 +794,24 @@ -- @param openmw.core#GameObject object -- @return #boolean +--- +-- Returns the read-only @{#ProbeRecord} of a probe +-- @function [parent=#Probe] record +-- @param #any objectOrRecordId +-- @return #ProbeRecord + +--- +-- @type ProbeRecord +-- @field #string id The record ID of the probe +-- @field #string name The name of the probe +-- @field #string model VFS path to the model +-- @field #string mwscript MWScript on this probe (can be empty) +-- @field #string icon VFS path to the icon +-- @field #number maxCondition The maximum number of uses of this probe +-- @field #number weight +-- @field #number value +-- @field #number quality The quality of the probe + --- @{#Repair} functions -- @field [parent=#types] #Repair Repair