11#include " types.hpp"
22
3- #include " modelproperty .hpp"
3+ #include " usertypeutil .hpp"
44
55#include < components/esm3/loadlock.hpp>
66#include < components/lua/luastate.hpp>
77#include < components/lua/util.hpp>
88#include < components/misc/resourcehelpers.hpp>
9- #include < components/resource/resourcesystem.hpp>
10-
11- #include " apps/openmw/mwbase/environment.hpp"
129
1310namespace sol
1411{
@@ -20,28 +17,63 @@ namespace sol
2017
2118namespace MWLua
2219{
23- void addLockpickBindings (sol::table lockpick, const Context& context)
20+ namespace
2421 {
25- auto vfs = MWBase::Environment::get ().getResourceSystem ()->getVFS ();
22+ template <class T >
23+ void addUserType (sol::state_view& lua, std::string_view name)
24+ {
25+ sol::usertype<T> record = lua.new_usertype <T>(name);
2626
27+ record[sol::meta_function::to_string]
28+ = [](const T& rec) -> std::string { return " ESM3_Lockpick[" + rec.mId .toDebugString () + " ]" ; };
29+ record[" id" ] = sol::readonly_property ([](const T& rec) -> ESM::RefId { return rec.mId ; });
30+
31+ Types::addProperty (record, " name" , &ESM::Lockpick::mName );
32+ Types::addModelProperty (record);
33+ Types::addProperty (record, " mwscript" , &ESM::Lockpick::mScript );
34+ Types::addIconProperty (record);
35+ Types::addProperty (record, " maxCondition" , &ESM::Lockpick::mData , &ESM::Lockpick::Data::mUses );
36+ Types::addProperty (record, " value" , &ESM::Lockpick::mData , &ESM::Lockpick::Data::mValue );
37+ Types::addProperty (record, " weight" , &ESM::Lockpick::mData , &ESM::Lockpick::Data::mWeight );
38+ Types::addProperty (record, " quality" , &ESM::Lockpick::mData , &ESM::Lockpick::Data::mQuality );
39+ }
40+ }
41+
42+ ESM::Lockpick tableToLockpick (const sol::table& rec)
43+ {
44+ auto pick = Types::initFromTemplate<ESM::Lockpick>(rec);
45+ if (rec[" name" ] != sol::nil)
46+ pick.mName = rec[" name" ];
47+ if (rec[" model" ] != sol::nil)
48+ pick.mModel = Misc::ResourceHelpers::meshPathForESM3 (rec[" model" ].get <std::string_view>());
49+ if (rec[" mwscript" ] != sol::nil)
50+ {
51+ std::string_view scriptId = rec[" mwscript" ].get <std::string_view>();
52+ pick.mScript = ESM::RefId::deserializeText (scriptId);
53+ }
54+ if (rec[" icon" ] != sol::nil)
55+ pick.mIcon = rec[" icon" ];
56+ if (rec[" maxCondition" ] != sol::nil)
57+ pick.mData .mUses = rec[" maxCondition" ];
58+ if (rec[" value" ] != sol::nil)
59+ pick.mData .mValue = rec[" value" ];
60+ if (rec[" weight" ] != sol::nil)
61+ pick.mData .mWeight = rec[" weight" ].get <Misc::FiniteFloat>();
62+ if (rec[" quality" ] != sol::nil)
63+ pick.mData .mQuality = rec[" quality" ].get <Misc::FiniteFloat>();
64+ return pick;
65+ }
66+
67+ void addMutableLockpickType (sol::state_view& lua)
68+ {
69+ addUserType<MutableRecord<ESM::Lockpick>>(lua, " ESM3_MutableLockpick" );
70+ }
71+
72+ void addLockpickBindings (sol::table lockpick, const Context& context)
73+ {
2774 addRecordFunctionBinding<ESM::Lockpick>(lockpick, context);
2875
29- sol::usertype<ESM::Lockpick> record = context.sol ().new_usertype <ESM::Lockpick>(" ESM3_Lockpick" );
30- record[sol::meta_function::to_string]
31- = [](const ESM::Lockpick& rec) { return " ESM3_Lockpick[" + rec.mId .toDebugString () + " ]" ; };
32- record[" id" ]
33- = sol::readonly_property ([](const ESM::Lockpick& rec) -> std::string { return rec.mId .serializeText (); });
34- record[" name" ] = sol::readonly_property ([](const ESM::Lockpick& rec) -> std::string { return rec.mName ; });
35- addModelProperty (record);
36- record[" mwscript" ] = sol::readonly_property ([](const ESM::Lockpick& rec) -> ESM::RefId { return rec.mScript ; });
37- record[" icon" ] = sol::readonly_property ([vfs](const ESM::Lockpick& rec) -> std::string {
38- return Misc::ResourceHelpers::correctIconPath (VFS::Path::toNormalized (rec.mIcon ), *vfs);
39- });
40- record[" maxCondition" ]
41- = sol::readonly_property ([](const ESM::Lockpick& rec) -> int { return rec.mData .mUses ; });
42- record[" value" ] = sol::readonly_property ([](const ESM::Lockpick& rec) -> int { return rec.mData .mValue ; });
43- record[" weight" ] = sol::readonly_property ([](const ESM::Lockpick& rec) -> float { return rec.mData .mWeight ; });
44- record[" quality" ]
45- = sol::readonly_property ([](const ESM::Lockpick& rec) -> float { return rec.mData .mQuality ; });
76+ sol::state_view lua = context.sol ();
77+ addUserType<ESM::Lockpick>(lua, " ESM3_Lockpick" );
4678 }
4779}
0 commit comments