Skip to content

Commit a192af0

Browse files
committed
Merge branch 'activeload' into 'master'
Add activators to openmw.content See merge request OpenMW/openmw!5192
2 parents 940ceb3 + 08d0749 commit a192af0

File tree

4 files changed

+58
-15
lines changed

4 files changed

+58
-15
lines changed

apps/openmw/mwlua/contentbindings.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "contentbindings.hpp"
22

3+
#include <components/esm3/loadacti.hpp>
34
#include <components/esm3/loaddoor.hpp>
45
#include <components/esm3/loadstat.hpp>
56
#include <components/lua/util.hpp>
@@ -144,6 +145,15 @@ namespace MWLua
144145
});
145146
}
146147

148+
sol::table initActivatorBindings(sol::state_view& lua, MWWorld::Store<ESM::Activator>& store)
149+
{
150+
addRecordStoreBindings<ESM::Activator>(lua, &MWLua::tableToActivator);
151+
addMutableActivatorType(lua);
152+
sol::table api(lua, sol::create);
153+
api["records"] = MutableStore<ESM::Activator>{ store };
154+
return LuaUtil::makeReadOnly(api);
155+
}
156+
147157
sol::table initDoorBindings(sol::state_view& lua, MWWorld::Store<ESM::Door>& store)
148158
{
149159
addRecordStoreBindings<ESM::Door>(lua, &MWLua::tableToDoor);
@@ -168,6 +178,7 @@ namespace MWLua
168178
auto lua = context.sol();
169179
sol::table api(lua, sol::create);
170180
MWWorld::ESMStore& esmStore = *MWBase::Environment::get().getESMStore();
181+
api["activators"] = initActivatorBindings(lua, esmStore.getWritable<ESM::Activator>());
171182
api["doors"] = initDoorBindings(lua, esmStore.getWritable<ESM::Door>());
172183
api["globals"] = initGlobalVariableBindings(lua, esmStore.getWritable<ESM::Global>());
173184
api["statics"] = initStaticBindings(lua, esmStore.getWritable<ESM::Static>());
Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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
}

apps/openmw/mwlua/types/types.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ namespace MWLua
2929

3030
// used in initTypesPackage
3131
void addActivatorBindings(sol::table activator, const Context& context);
32+
ESM::Activator tableToActivator(const sol::table& rec);
33+
void addMutableActivatorType(sol::state_view& lua);
3234
void addBookBindings(sol::table book, const Context& context);
3335
void addContainerBindings(sol::table container, const Context& context);
3436
void addDoorBindings(sol::table door, const Context& context);

files/lua_api/openmw/content.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@
66
-- @usage local content = require('openmw.content')
77

88

9+
--- @{#ActivatorContent}: Activator manipulation.
10+
-- @field [parent=#content] #ActivatorContent activators
11+
12+
---
13+
-- A mutable list of all @{openmw.types#ActivatorRecord}s.
14+
-- @field [parent=#ActivatorContent] #list<openmw.types#ActivatorRecord> records
15+
-- @usage
16+
-- content.activators.records.MyActivator = { mwscript = 'float', model = 'meshes/w/w_chitin_arrow.nif', name = 'Quest marker' }
17+
918
--- @{#DoorContent}: Door manipulation.
1019
-- @field [parent=#content] #DoorContent doors
1120

0 commit comments

Comments
 (0)