From 773669e69bc42b3f25df4d9612b4d71fd2e6da60 Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Thu, 25 May 2023 01:39:51 +0200 Subject: [PATCH] Add Lua script to handler ESM4 doors with Flag_AutomaticDoor --- apps/openmw/mwlua/types/door.cpp | 2 + apps/openmw/mwlua/worldview.cpp | 2 +- files/data/CMakeLists.txt | 1 + files/data/builtin.omwscripts | 1 + .../omw/mechanics/playercontroller.lua | 46 +++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 files/data/scripts/omw/mechanics/playercontroller.lua diff --git a/apps/openmw/mwlua/types/door.cpp b/apps/openmw/mwlua/types/door.cpp index e537f7c377..f13952a6b5 100644 --- a/apps/openmw/mwlua/types/door.cpp +++ b/apps/openmw/mwlua/types/door.cpp @@ -106,5 +106,7 @@ namespace MWLua record["model"] = sol::readonly_property([vfs](const ESM4::Door& rec) -> std::string { return Misc::ResourceHelpers::correctMeshPath(rec.mModel, vfs); }); + record["isAutomatic"] = sol::readonly_property( + [](const ESM4::Door& rec) -> bool { return rec.mDoorFlags & ESM4::Door::Flag_AutomaticDoor; }); } } diff --git a/apps/openmw/mwlua/worldview.cpp b/apps/openmw/mwlua/worldview.cpp index f5699dff89..6d8c01c56d 100644 --- a/apps/openmw/mwlua/worldview.cpp +++ b/apps/openmw/mwlua/worldview.cpp @@ -47,7 +47,7 @@ namespace MWLua return &mActivatorsInScene; if (cls.isActor()) return &mActorsInScene; - if (cls.isDoor()) + if (ptr.mRef->getType() == ESM::REC_DOOR || ptr.mRef->getType() == ESM::REC_DOOR4) return &mDoorsInScene; if (typeid(cls) == typeid(MWClass::Container)) return &mContainersInScene; diff --git a/files/data/CMakeLists.txt b/files/data/CMakeLists.txt index bc6d4b0055..eb61f3c118 100644 --- a/files/data/CMakeLists.txt +++ b/files/data/CMakeLists.txt @@ -74,6 +74,7 @@ set(BUILTIN_DATA_FILES scripts/omw/console/player.lua scripts/omw/console/global.lua scripts/omw/console/local.lua + scripts/omw/mechanics/playercontroller.lua scripts/omw/playercontrols.lua scripts/omw/settings/player.lua scripts/omw/settings/global.lua diff --git a/files/data/builtin.omwscripts b/files/data/builtin.omwscripts index 46a1f3f32f..cbc94496cd 100644 --- a/files/data/builtin.omwscripts +++ b/files/data/builtin.omwscripts @@ -7,6 +7,7 @@ PLAYER: scripts/omw/settings/player.lua # Mechanics GLOBAL: scripts/omw/activationhandlers.lua +PLAYER: scripts/omw/mechanics/playercontroller.lua PLAYER: scripts/omw/playercontrols.lua PLAYER: scripts/omw/camera/camera.lua NPC,CREATURE: scripts/omw/ai.lua diff --git a/files/data/scripts/omw/mechanics/playercontroller.lua b/files/data/scripts/omw/mechanics/playercontroller.lua new file mode 100644 index 0000000000..19e62d02c7 --- /dev/null +++ b/files/data/scripts/omw/mechanics/playercontroller.lua @@ -0,0 +1,46 @@ +local core = require('openmw.core') +local nearby = require('openmw.nearby') +local self = require('openmw.self') +local types = require('openmw.types') + +local cell = nil +local autodoors = {} + +local function onCellChange() + autodoors = {} + for _, door in ipairs(nearby.doors) do + if door.type == types.ESM4Door and types.ESM4Door.record(door).isAutomatic then + autodoors[#autodoors + 1] = door + end + end +end + +local autodoorActivationDist = 300 + +local lastAutoActivation = 0 +local function processAutomaticDoors() + if core.getRealTime() - lastAutoActivation < 2 then + return + end + for _, door in ipairs(autodoors) do + if door.enabled and (door.position - self.position):length() < autodoorActivationDist then + print('Automatic activation of', door) + door:activateBy(self) + lastAutoActivation = core.getRealTime() + end + end +end + +local function onUpdate() + if self.cell ~= cell then + cell = self.cell + onCellChange() + end + processAutomaticDoors() +end + +return { + engineHandlers = { + onUpdate = onUpdate, + }, +}