diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index d83ebfc4a9..5c8a3ff909 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -266,8 +266,8 @@ namespace MWLua playerScripts->onFrame(frameDuration); mProcessingInputEvents = false; - for (const std::string& message : mUIMessages) - windowManager->messageBox(message); + for (const auto& [message, mode] : mUIMessages) + windowManager->messageBox(message, mode); mUIMessages.clear(); for (auto& [msg, color] : mInGameConsoleMessages) windowManager->printToConsole(msg, "#" + color.toHex()); diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index d245b3035b..3238365ad5 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -13,6 +13,7 @@ #include #include "../mwbase/luamanager.hpp" +#include "../mwbase/windowmanager.hpp" #include "engineevents.hpp" #include "globalscripts.hpp" @@ -106,7 +107,11 @@ namespace MWLua // Used only in Lua bindings void addCustomLocalScript(const MWWorld::Ptr&, int scriptId, std::string_view initData); - void addUIMessage(std::string_view message) { mUIMessages.emplace_back(message); } + void addUIMessage( + std::string_view message, MWGui::ShowInDialogueMode mode = MWGui::ShowInDialogueMode_IfPossible) + { + mUIMessages.emplace_back(message, mode); + } void addInGameConsoleMessage(const std::string& msg, const Misc::Color& color) { mInGameConsoleMessages.push_back({ msg, color }); @@ -218,7 +223,7 @@ namespace MWLua }; std::vector mActionQueue; std::optional mTeleportPlayerAction; - std::vector mUIMessages; + std::vector> mUIMessages; std::vector> mInGameConsoleMessages; std::optional mDelayedUiModeChangedArg; diff --git a/apps/openmw/mwlua/uibindings.cpp b/apps/openmw/mwlua/uibindings.cpp index ad92c80cde..6bbda4c762 100644 --- a/apps/openmw/mwlua/uibindings.cpp +++ b/apps/openmw/mwlua/uibindings.cpp @@ -90,7 +90,21 @@ namespace MWLua }; api["_isHudVisible"] = []() -> bool { return MWBase::Environment::get().getWindowManager()->isHudVisible(); }; api["showMessage"] - = [luaManager = context.mLuaManager](std::string_view message) { luaManager->addUIMessage(message); }; + = [luaManager = context.mLuaManager](std::string_view message, const sol::optional& options) { + MWGui::ShowInDialogueMode mode = MWGui::ShowInDialogueMode_IfPossible; + if (options.has_value()) + { + auto showInDialogue = options->get>("showInDialogue"); + if (showInDialogue.has_value()) + { + if (*showInDialogue) + mode = MWGui::ShowInDialogueMode_Only; + else + mode = MWGui::ShowInDialogueMode_Never; + } + } + luaManager->addUIMessage(message, mode); + }; api["CONSOLE_COLOR"] = LuaUtil::makeStrictReadOnly(context.mLua->tableFromPairs({ { "Default", Misc::Color::fromHex(MWBase::WindowManager::sConsoleColor_Default.substr(1)) }, { "Error", Misc::Color::fromHex(MWBase::WindowManager::sConsoleColor_Error.substr(1)) }, diff --git a/files/data/scripts/omw/mechanics/playercontroller.lua b/files/data/scripts/omw/mechanics/playercontroller.lua index 333e097404..870f24415c 100644 --- a/files/data/scripts/omw/mechanics/playercontroller.lua +++ b/files/data/scripts/omw/mechanics/playercontroller.lua @@ -74,10 +74,10 @@ local function skillLevelUpHandler(skillid, source, params) message = '#{sBookSkillMessage}\n'..message end - ui.showMessage(message) + ui.showMessage(message, { showInDialogue = false }) if levelStat.progress >= core.getGMST('iLevelUpTotal') then - ui.showMessage('#{sLevelUpMsg}') + ui.showMessage('#{sLevelUpMsg}', { showInDialogue = false }) end if not source or source == I.SkillProgression.SKILL_INCREASE_SOURCES.Usage then skillStat.progress = 0 end diff --git a/files/lua_api/openmw/ui.lua b/files/lua_api/openmw/ui.lua index a99b1e782e..c2587db821 100644 --- a/files/lua_api/openmw/ui.lua +++ b/files/lua_api/openmw/ui.lua @@ -39,6 +39,14 @@ -- Shows given message at the bottom of the screen. -- @function [parent=#ui] showMessage -- @param #string msg +-- @param #table options An optional table with additional optional arguments. Can contain: +-- +-- * `showInDialogue` - If true, this message will only be shown in the dialogue window. If false, it will always be shown in a message box. +-- When omitted, the message will be displayed in the dialogue window if it is open and will be shown at the bottom of the screen otherwise. +-- @usage local params = { +-- showInDialogue=false +-- }; +-- ui.showMessage("Hello world", params) --- -- Predefined colors for console output