11#include " types.hpp"
22
33#include " modelproperty.hpp"
4+ #include " usertypeutil.hpp"
45
56#include < components/esm3/loadacti.hpp>
67#include < components/lua/luastate.hpp>
@@ -15,14 +16,40 @@ namespace sol
1516 {
1617 };
1718}
18- namespace
19+
20+ namespace MWLua
1921{
22+ namespace
23+ {
24+ template <class T , bool readOnly>
25+ void addUserType (sol::state_view& lua, std::string_view name)
26+ {
27+ sol::usertype<T> record = lua.new_usertype <T>(name);
28+
29+ record[sol::meta_function::to_string]
30+ = [](const T& rec) -> std::string { return " ESM3_Activator[" + rec.mId .toDebugString () + " ]" ; };
31+ record[" id" ] = sol::readonly_property ([](const T& rec) -> ESM::RefId { return rec.mId ; });
32+
33+ Types::addProperty (record, " name" , &ESM::Activator::mName );
34+ if constexpr (readOnly)
35+ addModelProperty (record);
36+ else
37+ addMutableModelProperty (record);
38+ Types::addProperty (record, " mwscript" , &ESM::Activator::mScript );
39+ }
40+ }
41+
2042 // Populates a activator struct from a Lua table.
2143 ESM::Activator tableToActivator (const sol::table& rec)
2244 {
2345 ESM::Activator activator;
2446 if (rec[" template" ] != sol::nil)
25- activator = LuaUtil::cast<ESM::Activator>(rec[" template" ]);
47+ {
48+ if (rec[" template" ].is <MutableRecord<ESM::Activator>>())
49+ activator = rec[" template" ].get <MutableRecord<ESM::Activator>>().find ();
50+ else
51+ activator = LuaUtil::cast<ESM::Activator>(rec[" template" ]);
52+ }
2653 else
2754 activator.blank ();
2855 if (rec[" name" ] != sol::nil)
@@ -36,23 +63,17 @@ namespace
3663 }
3764 return activator;
3865 }
39- }
4066
41- namespace MWLua
42- {
67+ void addMutableActivatorType (sol::state_view& lua)
68+ {
69+ addUserType<MutableRecord<ESM::Activator>, false >(lua, " ESM3_MutableActivator" );
70+ }
71+
4372 void addActivatorBindings (sol::table activator, const Context& context)
4473 {
4574 activator[" createRecordDraft" ] = tableToActivator;
4675 addRecordFunctionBinding<ESM::Activator>(activator, context);
47-
48- sol::usertype<ESM::Activator> record = context.sol ().new_usertype <ESM::Activator>(" ESM3_Activator" );
49- record[sol::meta_function::to_string]
50- = [](const ESM::Activator& rec) { return " ESM3_Activator[" + rec.mId .toDebugString () + " ]" ; };
51- record[" id" ]
52- = sol::readonly_property ([](const ESM::Activator& rec) -> std::string { return rec.mId .serializeText (); });
53- record[" name" ] = sol::readonly_property ([](const ESM::Activator& rec) -> std::string { return rec.mName ; });
54- addModelProperty (record);
55- record[" mwscript" ]
56- = sol::readonly_property ([](const ESM::Activator& rec) -> ESM::RefId { return rec.mScript ; });
76+ sol::state_view lua = context.sol ();
77+ addUserType<ESM::Activator, true >(lua, " ESM3_Activator" );
5778 }
5879}
0 commit comments