diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 21fb2a6ca5..2985d89579 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/lockpick types/probe types/apparatus + types/types types/door types/actor types/container types/weapon types/npc types/creature types/activator types/book types/lockpick types/probe types/apparatus types/misc ) add_openmw_dir (mwsound diff --git a/apps/openmw/mwlua/types/misc.cpp b/apps/openmw/mwlua/types/misc.cpp new file mode 100644 index 0000000000..7546561dad --- /dev/null +++ b/apps/openmw/mwlua/types/misc.cpp @@ -0,0 +1,34 @@ +#include "types.hpp" + +#include + +#include + +#include "../luabindings.hpp" + +namespace sol +{ + template <> + struct is_automagical : std::false_type {}; +} + +namespace MWLua +{ + void addMiscellaneousBindings(sol::table miscellaneous, const Context& context) + { + const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); + miscellaneous["record"] = sol::overload( + [](const Object& obj) -> const ESM::Miscellaneous* { return obj.ptr().get()->mBase; }, + [store](const std::string& recordId) -> const ESM::Miscellaneous* { return store->find(recordId); }); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Miscellaneous"); + record[sol::meta_function::to_string] = [](const ESM::Miscellaneous& rec) { return "ESM3_Miscellaneous[" + rec.mId + "]"; }; + record["id"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> std::string { return rec.mId; }); + record["name"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> std::string { return rec.mName; }); + record["model"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> std::string { return rec.mModel; }); + record["mwscript"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> std::string { return rec.mScript; }); + record["icon"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> std::string { return rec.mIcon; }); + record["isKey"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> bool { return rec.mData.mIsKey; }); + record["value"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> int { return rec.mData.mValue; }); + record["weight"] = sol::readonly_property([](const ESM::Miscellaneous& rec) -> float { return rec.mData.mWeight; }); + } +} diff --git a/apps/openmw/mwlua/types/types.cpp b/apps/openmw/mwlua/types/types.cpp index a7f2322f20..23ce976d4f 100644 --- a/apps/openmw/mwlua/types/types.cpp +++ b/apps/openmw/mwlua/types/types.cpp @@ -163,7 +163,7 @@ namespace MWLua addType(ObjectTypeName::Clothing, {ESM::REC_CLOT}, ObjectTypeName::Item); addType(ObjectTypeName::Ingredient, {ESM::REC_INGR}, ObjectTypeName::Item); addType(ObjectTypeName::Light, {ESM::REC_LIGH}, ObjectTypeName::Item); - addType(ObjectTypeName::MiscItem, {ESM::REC_MISC}, ObjectTypeName::Item); + addMiscellaneousBindings(addType(ObjectTypeName::MiscItem, {ESM::REC_MISC}, ObjectTypeName::Item), context); 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); diff --git a/apps/openmw/mwlua/types/types.hpp b/apps/openmw/mwlua/types/types.hpp index 655aca12e6..464359152e 100644 --- a/apps/openmw/mwlua/types/types.hpp +++ b/apps/openmw/mwlua/types/types.hpp @@ -35,6 +35,7 @@ namespace MWLua void addLockpickBindings(sol::table lockpick, const Context& context); void addProbeBindings(sol::table probe, const Context& context); void addApparatusBindings(sol::table apparatus, const Context& context); + void addMiscellaneousBindings(sol::table miscellaneous, const Context& context); } #endif // MWLUA_TYPES_H diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index b6a303cd74..34f7f8b442 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -650,7 +650,22 @@ -- @param openmw.core#GameObject object -- @return #boolean +--- +-- Returns the read-only @{#MiscellaneousRecord} of a miscellaneous item +-- @function [parent=#Miscellaneous] record +-- @param #any objectOrRecordId +-- @return #MiscellaneousRecord +--- +-- @type MiscellaneousRecord +-- @field #string id The record ID of the miscellaneous item +-- @field #string name The name of the miscellaneous item +-- @field #string model VFS path to the model +-- @field #string mwscript MWScript on this miscellaneous item (can be empty) +-- @field #string icon VFS path to the icon +-- @field #number weight +-- @field #number value +-- @field #boolean isKey --- @{#Potion} functions -- @field [parent=#types] #Potion Potion