From 4d6667920493fb3711ac275dbd281efd75166215 Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Sat, 21 Oct 2023 13:04:02 +0200 Subject: [PATCH] Queue Lua handler `uiModeChanged` --- apps/openmw/mwlua/luamanagerimp.cpp | 16 +++++++++++++++- apps/openmw/mwlua/luamanagerimp.hpp | 1 + apps/openmw/mwlua/playerscripts.hpp | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index fc686dcbb3..63a2838250 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -246,6 +246,13 @@ namespace MWLua reloadAllScriptsImpl(); mReloadAllScriptsRequested = false; } + + if (mDelayedUiModeChangedArg) + { + if (playerScripts) + playerScripts->uiModeChanged(*mDelayedUiModeChangedArg, true); + mDelayedUiModeChangedArg = std::nullopt; + } } void LuaManager::applyDelayedActions() @@ -275,6 +282,7 @@ namespace MWLua mGlobalScripts.removeAllScripts(); mGlobalScriptsStarted = false; mNewGameStarted = false; + mDelayedUiModeChangedArg = std::nullopt; if (!mPlayer.isEmpty()) { mPlayer.getCellRef().unsetRefNum(); @@ -325,9 +333,15 @@ namespace MWLua { if (mPlayer.isEmpty()) return; + ObjectId argId = arg.isEmpty() ? ObjectId() : getId(arg); + if (mApplyingDelayedActions) + { + mDelayedUiModeChangedArg = argId; + return; + } PlayerScripts* playerScripts = dynamic_cast(mPlayer.getRefData().getLuaScripts()); if (playerScripts) - playerScripts->uiModeChanged(arg, mApplyingDelayedActions); + playerScripts->uiModeChanged(argId, false); } void LuaManager::objectAddedToScene(const MWWorld::Ptr& ptr) diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index 9f4c0096b5..a725761dbd 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -204,6 +204,7 @@ namespace MWLua std::optional mTeleportPlayerAction; std::vector mUIMessages; std::vector> mInGameConsoleMessages; + std::optional mDelayedUiModeChangedArg; LuaUtil::LuaStorage mGlobalStorage{ mLua.sol() }; LuaUtil::LuaStorage mPlayerStorage{ mLua.sol() }; diff --git a/apps/openmw/mwlua/playerscripts.hpp b/apps/openmw/mwlua/playerscripts.hpp index e8cad4968c..2d3aa9bc78 100644 --- a/apps/openmw/mwlua/playerscripts.hpp +++ b/apps/openmw/mwlua/playerscripts.hpp @@ -66,9 +66,9 @@ namespace MWLua } // `arg` is either forwarded from MWGui::pushGuiMode or empty - void uiModeChanged(const MWWorld::Ptr& arg, bool byLuaAction) + void uiModeChanged(ObjectId arg, bool byLuaAction) { - if (arg.isEmpty()) + if (arg.isZeroOrUnset()) callEngineHandlers(mUiModeChanged, byLuaAction); else callEngineHandlers(mUiModeChanged, byLuaAction, LObject(arg));