From 5f2cbf810dda4962f0297d0bb60127a4dfe8fb9f Mon Sep 17 00:00:00 2001 From: uramer Date: Tue, 2 Jan 2024 13:38:55 +0100 Subject: [PATCH 1/6] Check if controls are on for Use action --- files/data/scripts/omw/playercontrols.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/data/scripts/omw/playercontrols.lua b/files/data/scripts/omw/playercontrols.lua index f14724f0a2..71a6094aaa 100644 --- a/files/data/scripts/omw/playercontrols.lua +++ b/files/data/scripts/omw/playercontrols.lua @@ -195,7 +195,7 @@ end)) local startUse = false input.registerActionHandler('Use', async:callback(function(value) - if value then startUse = true end + if value and controlsAllowed() then startUse = true end end)) local function processAttacking() if Actor.stance(self) == Actor.STANCE.Spell then From 1d8ee7984f1fef4e8cd2a4b377271bb1a50f7859 Mon Sep 17 00:00:00 2001 From: uramer Date: Tue, 2 Jan 2024 13:45:45 +0100 Subject: [PATCH 2/6] Make input.triggers[] consistent with input.actions[] --- components/lua/inputactions.cpp | 8 ++++++++ components/lua/inputactions.hpp | 6 +----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/components/lua/inputactions.cpp b/components/lua/inputactions.cpp index c21fbcf112..69c91921eb 100644 --- a/components/lua/inputactions.cpp +++ b/components/lua/inputactions.cpp @@ -265,6 +265,14 @@ namespace LuaUtil mHandlers.push_back({}); } + std::optional Registry::operator[](std::string_view key) + { + auto iter = mIds.find(key); + if (iter == mIds.end()) + return std::nullopt; + return mInfo[iter->second]; + } + void Registry::registerHandler(std::string_view key, const LuaUtil::Callback& callback) { Id id = safeIdByKey(key); diff --git a/components/lua/inputactions.hpp b/components/lua/inputactions.hpp index ac3907b55d..abc6cf73fa 100644 --- a/components/lua/inputactions.hpp +++ b/components/lua/inputactions.hpp @@ -126,11 +126,7 @@ namespace LuaUtil::InputTrigger return std::nullopt; return it->first; } - std::optional operator[](std::string_view key) - { - Id id = safeIdByKey(key); - return mInfo[id]; - } + std::optional operator[](std::string_view key); void insert(Info info); void registerHandler(std::string_view key, const LuaUtil::Callback& callback); void activate(std::string_view key); From c1e8e88914572dd0e9b5258ed2cd339157f8fdd5 Mon Sep 17 00:00:00 2001 From: uramer Date: Tue, 2 Jan 2024 13:47:04 +0100 Subject: [PATCH 3/6] Fix input trigger docs --- files/lua_api/openmw/input.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/files/lua_api/openmw/input.lua b/files/lua_api/openmw/input.lua index 563a4ab1f5..0a85602bcc 100644 --- a/files/lua_api/openmw/input.lua +++ b/files/lua_api/openmw/input.lua @@ -402,10 +402,10 @@ --- -- @type TriggerInfo --- @field [parent=#Actioninfo] #string key --- @field [parent=#Actioninfo] #string l10n Localization context containing the name and description keys --- @field [parent=#Actioninfo] #string name Localization key of the trigger's name --- @field [parent=#Actioninfo] #string description Localization key of the trigger's description +-- @field [parent=#TriggerInfo] #string key +-- @field [parent=#TriggerInfo] #string l10n Localization context containing the name and description keys +-- @field [parent=#TriggerInfo] #string name Localization key of the trigger's name +-- @field [parent=#TriggerInfo] #string description Localization key of the trigger's description --- -- Map of all currently registered triggers From e9b48e35c0b36c0a9ba50bd0b844aee37deeb2f9 Mon Sep 17 00:00:00 2001 From: uramer Date: Tue, 2 Jan 2024 13:54:02 +0100 Subject: [PATCH 4/6] Coverity defects --- apps/openmw/mwlua/inputbindings.cpp | 8 ++++---- components/lua/inputactions.cpp | 4 ++-- components/lua/inputactions.hpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwlua/inputbindings.cpp b/apps/openmw/mwlua/inputbindings.cpp index 8763dce28d..33b19f3b4d 100644 --- a/apps/openmw/mwlua/inputbindings.cpp +++ b/apps/openmw/mwlua/inputbindings.cpp @@ -76,7 +76,7 @@ namespace MWLua inputActions[sol::meta_function::pairs] = pairs; } - auto actionInfo = context.mLua->sol().new_usertype("ActionInfo", "key", + context.mLua->sol().new_usertype("ActionInfo", "key", sol::property([](const LuaUtil::InputAction::Info& info) { return info.mKey; }), "name", sol::property([](const LuaUtil::InputAction::Info& info) { return info.mName; }), "description", sol::property([](const LuaUtil::InputAction::Info& info) { return info.mDescription; }), "type", @@ -102,7 +102,7 @@ namespace MWLua inputTriggers[sol::meta_function::pairs] = pairs; } - auto triggerInfo = context.mLua->sol().new_usertype("TriggerInfo", "key", + context.mLua->sol().new_usertype("TriggerInfo", "key", sol::property([](const LuaUtil::InputTrigger::Info& info) { return info.mKey; }), "name", sol::property([](const LuaUtil::InputTrigger::Info& info) { return info.mName; }), "description", sol::property([](const LuaUtil::InputTrigger::Info& info) { return info.mDescription; }), "l10n", @@ -127,7 +127,7 @@ namespace MWLua parsedOptions.mName = options["name"].get(); parsedOptions.mDescription = options["description"].get(); parsedOptions.mDefaultValue = options["defaultValue"].get(); - manager->inputActions().insert(parsedOptions); + manager->inputActions().insert(std::move(parsedOptions)); }; api["bindAction"] = [manager = context.mLuaManager]( std::string_view key, const sol::table& callback, sol::table dependencies) { @@ -164,7 +164,7 @@ namespace MWLua parsedOptions.mL10n = options["l10n"].get(); parsedOptions.mName = options["name"].get(); parsedOptions.mDescription = options["description"].get(); - manager->inputTriggers().insert(parsedOptions); + manager->inputTriggers().insert(std::move(parsedOptions)); }; api["registerTriggerHandler"] = [manager = context.mLuaManager](std::string_view key, const sol::table& callback) { diff --git a/components/lua/inputactions.cpp b/components/lua/inputactions.cpp index 69c91921eb..7c7551ba60 100644 --- a/components/lua/inputactions.cpp +++ b/components/lua/inputactions.cpp @@ -113,7 +113,7 @@ namespace LuaUtil } } - void Registry::insert(Info info) + void Registry::insert(const Info& info) { if (mIds.find(info.mKey) != mIds.end()) throw std::domain_error(Misc::StringUtils::format("Action key \"%s\" is already in use", info.mKey)); @@ -251,7 +251,7 @@ namespace LuaUtil return it->second; } - void Registry::insert(Info info) + void Registry::insert(const Info& info) { if (mIds.find(info.mKey) != mIds.end()) throw std::domain_error(Misc::StringUtils::format("Trigger key \"%s\" is already in use", info.mKey)); diff --git a/components/lua/inputactions.hpp b/components/lua/inputactions.hpp index abc6cf73fa..d05bb71f2c 100644 --- a/components/lua/inputactions.hpp +++ b/components/lua/inputactions.hpp @@ -60,7 +60,7 @@ namespace LuaUtil::InputAction { public: using ConstIterator = std::vector::const_iterator; - void insert(Info info); + void insert(const Info& info); size_t size() const { return mKeys.size(); } std::optional firstKey() const { return mKeys.empty() ? std::nullopt : std::optional(mKeys[0]); } std::optional nextKey(std::string_view key) const; @@ -127,7 +127,7 @@ namespace LuaUtil::InputTrigger return it->first; } std::optional operator[](std::string_view key); - void insert(Info info); + void insert(const Info& info); void registerHandler(std::string_view key, const LuaUtil::Callback& callback); void activate(std::string_view key); void clear() From 9d1a3f243d0c3a514195467d323e0812ebf571f0 Mon Sep 17 00:00:00 2001 From: uramer Date: Tue, 2 Jan 2024 14:31:13 +0100 Subject: [PATCH 5/6] Use the same controls check for startUse and processAttacking --- files/data/scripts/omw/playercontrols.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/data/scripts/omw/playercontrols.lua b/files/data/scripts/omw/playercontrols.lua index 71a6094aaa..289d3144dc 100644 --- a/files/data/scripts/omw/playercontrols.lua +++ b/files/data/scripts/omw/playercontrols.lua @@ -195,7 +195,7 @@ end)) local startUse = false input.registerActionHandler('Use', async:callback(function(value) - if value and controlsAllowed() then startUse = true end + if value and combatAllowed() then startUse = true end end)) local function processAttacking() if Actor.stance(self) == Actor.STANCE.Spell then From e734191b56db15677f1cb9413487a5345e3f6db6 Mon Sep 17 00:00:00 2001 From: uramer Date: Tue, 2 Jan 2024 14:40:03 +0100 Subject: [PATCH 6/6] Add clarifying comment --- files/data/scripts/omw/playercontrols.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/data/scripts/omw/playercontrols.lua b/files/data/scripts/omw/playercontrols.lua index 289d3144dc..ec7d0d238e 100644 --- a/files/data/scripts/omw/playercontrols.lua +++ b/files/data/scripts/omw/playercontrols.lua @@ -198,6 +198,8 @@ input.registerActionHandler('Use', async:callback(function(value) if value and combatAllowed() then startUse = true end end)) local function processAttacking() + -- for spell-casting, set controls.use to true for exactly one frame + -- otherwise spell casting is attempted every frame while Use is true if Actor.stance(self) == Actor.STANCE.Spell then self.controls.use = startUse and 1 or 0 else