diff --git a/apps/openmw/mwlua/types/activator.cpp b/apps/openmw/mwlua/types/activator.cpp index f598cc91b0..936d438361 100644 --- a/apps/openmw/mwlua/types/activator.cpp +++ b/apps/openmw/mwlua/types/activator.cpp @@ -23,13 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - activator["record"] = sol::overload( - [](const Object& obj) -> const ESM::Activator* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Activator* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(activator); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Activator"); record[sol::meta_function::to_string] = [](const ESM::Activator& rec) { return "ESM3_Activator[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/apparatus.cpp b/apps/openmw/mwlua/types/apparatus.cpp index 956e4a7e64..d4be3776bf 100644 --- a/apps/openmw/mwlua/types/apparatus.cpp +++ b/apps/openmw/mwlua/types/apparatus.cpp @@ -30,13 +30,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - apparatus["record"] = sol::overload( - [](const Object& obj) -> const ESM::Apparatus* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Apparatus* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(apparatus); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Apparatus"); record[sol::meta_function::to_string] = [](const ESM::Apparatus& rec) { return "ESM3_Apparatus[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/armor.cpp b/apps/openmw/mwlua/types/armor.cpp index 94e7eae892..e112139ba7 100644 --- a/apps/openmw/mwlua/types/armor.cpp +++ b/apps/openmw/mwlua/types/armor.cpp @@ -37,12 +37,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); - armor["record"] - = sol::overload([](const Object& obj) -> const ESM::Armor* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Armor* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(armor); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Armor"); record[sol::meta_function::to_string] = [](const ESM::Armor& rec) -> std::string { return "ESM3_Armor[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/book.cpp b/apps/openmw/mwlua/types/book.cpp index 3fdd978bfd..defc70d50c 100644 --- a/apps/openmw/mwlua/types/book.cpp +++ b/apps/openmw/mwlua/types/book.cpp @@ -32,12 +32,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); - book["record"] - = sol::overload([](const Object& obj) -> const ESM::Book* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Book* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(book); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Book"); record[sol::meta_function::to_string] = [](const ESM::Book& rec) { return "ESM3_Book[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/clothing.cpp b/apps/openmw/mwlua/types/clothing.cpp index 3775c3a657..c5169440cb 100644 --- a/apps/openmw/mwlua/types/clothing.cpp +++ b/apps/openmw/mwlua/types/clothing.cpp @@ -36,13 +36,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - clothing["record"] = sol::overload( - [](const Object& obj) -> const ESM::Clothing* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Clothing* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(clothing); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Clothing"); record[sol::meta_function::to_string] = [](const ESM::Clothing& rec) -> std::string { return "ESM3_Clothing[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/container.cpp b/apps/openmw/mwlua/types/container.cpp index c1d675f63b..76616eef54 100644 --- a/apps/openmw/mwlua/types/container.cpp +++ b/apps/openmw/mwlua/types/container.cpp @@ -48,13 +48,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - container["record"] = sol::overload( - [](const Object& obj) -> const ESM::Container* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Container* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(container); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Container"); record[sol::meta_function::to_string] = [](const ESM::Container& rec) -> std::string { return "ESM3_Container[" + rec.mId.toDebugString() + "]"; diff --git a/apps/openmw/mwlua/types/creature.cpp b/apps/openmw/mwlua/types/creature.cpp index 234a32078f..3691b7912d 100644 --- a/apps/openmw/mwlua/types/creature.cpp +++ b/apps/openmw/mwlua/types/creature.cpp @@ -23,13 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - creature["record"] = sol::overload( - [](const Object& obj) -> const ESM::Creature* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Creature* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(creature); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Creature"); record[sol::meta_function::to_string] = [](const ESM::Creature& rec) { return "ESM3_Creature[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/door.cpp b/apps/openmw/mwlua/types/door.cpp index a7a780cba9..cf2880886e 100644 --- a/apps/openmw/mwlua/types/door.cpp +++ b/apps/openmw/mwlua/types/door.cpp @@ -44,12 +44,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); - door["record"] - = sol::overload([](const Object& obj) -> const ESM::Door* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Door* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(door); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Door"); record[sol::meta_function::to_string] = [](const ESM::Door& rec) -> std::string { return "ESM3_Door[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/ingredient.cpp b/apps/openmw/mwlua/types/ingredient.cpp index 0a9de4d170..8534526922 100644 --- a/apps/openmw/mwlua/types/ingredient.cpp +++ b/apps/openmw/mwlua/types/ingredient.cpp @@ -24,13 +24,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - ingredient["record"] = sol::overload( - [](const Object& obj) -> const ESM::Ingredient* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordID) -> const ESM::Ingredient* { - return store->find(ESM::RefId::stringRefId(recordID)); - }); + addRecordFunctionBinding(ingredient); + sol::usertype record = context.mLua->sol().new_usertype(("ESM3_Ingredient")); record[sol::meta_function::to_string] = [](const ESM::Ingredient& rec) { return "ESM3_Ingredient[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/light.cpp b/apps/openmw/mwlua/types/light.cpp index c18add7790..512eda3e33 100644 --- a/apps/openmw/mwlua/types/light.cpp +++ b/apps/openmw/mwlua/types/light.cpp @@ -23,12 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); - light["record"] - = sol::overload([](const Object& obj) -> const ESM::Light* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Light* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(light); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Light"); record[sol::meta_function::to_string] = [](const ESM::Light& rec) -> std::string { return "ESM3_Light[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/lockpick.cpp b/apps/openmw/mwlua/types/lockpick.cpp index 333d137d20..133f228bb5 100644 --- a/apps/openmw/mwlua/types/lockpick.cpp +++ b/apps/openmw/mwlua/types/lockpick.cpp @@ -23,13 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - 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(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(lockpick); + 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.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/misc.cpp b/apps/openmw/mwlua/types/misc.cpp index 19214ddb3c..e25bf85b36 100644 --- a/apps/openmw/mwlua/types/misc.cpp +++ b/apps/openmw/mwlua/types/misc.cpp @@ -23,13 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - 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(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(miscellaneous); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Miscellaneous"); record[sol::meta_function::to_string] diff --git a/apps/openmw/mwlua/types/npc.cpp b/apps/openmw/mwlua/types/npc.cpp index a0a20dcd26..0691aed27d 100644 --- a/apps/openmw/mwlua/types/npc.cpp +++ b/apps/openmw/mwlua/types/npc.cpp @@ -25,12 +25,8 @@ namespace MWLua { addNpcStatsBindings(npc, context); - const MWWorld::Store* store = &MWBase::Environment::get().getWorld()->getStore().get(); - npc["record"] - = sol::overload([](const Object& obj) -> const ESM::NPC* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::NPC* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(npc); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_NPC"); record[sol::meta_function::to_string] = [](const ESM::NPC& rec) { return "ESM3_NPC[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/potion.cpp b/apps/openmw/mwlua/types/potion.cpp index 4b6c23bd35..43bb29308d 100644 --- a/apps/openmw/mwlua/types/potion.cpp +++ b/apps/openmw/mwlua/types/potion.cpp @@ -21,13 +21,7 @@ namespace MWLua { void addPotionBindings(sol::table potion, const Context& context) { - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - potion["record"] - = sol::overload([](const Object& obj) -> const ESM::Potion* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Potion* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(potion); auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); sol::usertype record = context.mLua->sol().new_usertype("ESM3_Potion"); diff --git a/apps/openmw/mwlua/types/probe.cpp b/apps/openmw/mwlua/types/probe.cpp index 06200f9538..f1d72c6bcb 100644 --- a/apps/openmw/mwlua/types/probe.cpp +++ b/apps/openmw/mwlua/types/probe.cpp @@ -23,12 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - 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(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(probe); + 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.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/repair.cpp b/apps/openmw/mwlua/types/repair.cpp index ca5d9bd223..a1c04eca5a 100644 --- a/apps/openmw/mwlua/types/repair.cpp +++ b/apps/openmw/mwlua/types/repair.cpp @@ -23,13 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - repair["record"] - = sol::overload([](const Object& obj) -> const ESM::Repair* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Repair* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(repair); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Repair"); record[sol::meta_function::to_string] = [](const ESM::Repair& rec) { return "ESM3_Repair[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/static.cpp b/apps/openmw/mwlua/types/static.cpp index ff1cc5a812..b69735e896 100644 --- a/apps/openmw/mwlua/types/static.cpp +++ b/apps/openmw/mwlua/types/static.cpp @@ -23,13 +23,8 @@ namespace MWLua { auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - stat["record"] - = sol::overload([](const Object& obj) -> const ESM::Static* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Static* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(stat); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Static"); record[sol::meta_function::to_string] = [](const ESM::Static& rec) -> std::string { return "ESM3_Static[" + rec.mId.toDebugString() + "]"; }; diff --git a/apps/openmw/mwlua/types/types.hpp b/apps/openmw/mwlua/types/types.hpp index 2ce6d3e9a2..8716c73eee 100644 --- a/apps/openmw/mwlua/types/types.hpp +++ b/apps/openmw/mwlua/types/types.hpp @@ -5,6 +5,11 @@ #include +#include "apps/openmw/mwbase/environment.hpp" +#include "apps/openmw/mwbase/world.hpp" +#include "apps/openmw/mwworld/esmstore.hpp" +#include "apps/openmw/mwworld/store.hpp" + #include "../context.hpp" namespace MWLua @@ -45,6 +50,16 @@ namespace MWLua void addClothingBindings(sol::table clothing, const Context& context); void addStaticBindings(sol::table stat, const Context& context); void addLightBindings(sol::table light, const Context& context); + + template + void addRecordFunctionBinding(sol::table table) + { + const MWWorld::Store& store = MWBase::Environment::get().getWorld()->getStore().get(); + + table["record"] = sol::overload([](const Object& obj) -> const T* { return obj.ptr().get()->mBase; }, + [&store]( + const std::string& recordId) -> const T* { return store.find(ESM::RefId::stringRefId(recordId)); }); + } } #endif // MWLUA_TYPES_H diff --git a/apps/openmw/mwlua/types/weapon.cpp b/apps/openmw/mwlua/types/weapon.cpp index bfd2167824..de8ec1d392 100644 --- a/apps/openmw/mwlua/types/weapon.cpp +++ b/apps/openmw/mwlua/types/weapon.cpp @@ -40,13 +40,8 @@ namespace MWLua auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS(); - const MWWorld::Store* store - = &MWBase::Environment::get().getWorld()->getStore().get(); - weapon["record"] - = sol::overload([](const Object& obj) -> const ESM::Weapon* { return obj.ptr().get()->mBase; }, - [store](const std::string& recordId) -> const ESM::Weapon* { - return store->find(ESM::RefId::stringRefId(recordId)); - }); + addRecordFunctionBinding(weapon); + sol::usertype record = context.mLua->sol().new_usertype("ESM3_Weapon"); record[sol::meta_function::to_string] = [](const ESM::Weapon& rec) -> std::string { return "ESM3_Weapon[" + rec.mId.toDebugString() + "]"; };