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 c21fbcf112..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)); @@ -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..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; @@ -126,12 +126,8 @@ namespace LuaUtil::InputTrigger return std::nullopt; return it->first; } - std::optional operator[](std::string_view key) - { - Id id = safeIdByKey(key); - return mInfo[id]; - } - void insert(Info info); + std::optional operator[](std::string_view key); + void insert(const Info& info); void registerHandler(std::string_view key, const LuaUtil::Callback& callback); void activate(std::string_view key); void clear() diff --git a/files/data/scripts/omw/playercontrols.lua b/files/data/scripts/omw/playercontrols.lua index f14724f0a2..ec7d0d238e 100644 --- a/files/data/scripts/omw/playercontrols.lua +++ b/files/data/scripts/omw/playercontrols.lua @@ -195,9 +195,11 @@ end)) local startUse = false input.registerActionHandler('Use', async:callback(function(value) - if value then startUse = true end + 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 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