From 8c6a1ae8c08831a1c35fea82eca3e21715d2f68b Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 3 Feb 2024 12:02:44 +0100 Subject: [PATCH 1/5] Allow menu scripts to send global events while a game is loaded --- apps/openmw/mwlua/corebindings.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwlua/corebindings.cpp b/apps/openmw/mwlua/corebindings.cpp index 8c881f9f75..8d8e97ed07 100644 --- a/apps/openmw/mwlua/corebindings.cpp +++ b/apps/openmw/mwlua/corebindings.cpp @@ -1,6 +1,7 @@ #include "corebindings.hpp" #include +#include #include #include @@ -133,7 +134,14 @@ namespace MWLua sol::table api(context.mLua->sol(), sol::create); for (auto& [k, v] : LuaUtil::getMutableFromReadOnly(initCorePackage(context))) api[k] = v; - api["sendGlobalEvent"] = sol::nil; + api["sendGlobalEvent"] = [context](std::string eventName, const sol::object& eventData) { + if (MWBase::Environment::get().getStateManager()->getState() == MWBase::StateManager::State_NoGame) + { + throw std::logic_error("Can't send global events when no game is loaded"); + } + context.mLuaEvents->addGlobalEvent( + { std::move(eventName), LuaUtil::serialize(eventData, context.mSerializer) }); + }; api["sound"] = sol::nil; api["vfx"] = sol::nil; return LuaUtil::makeReadOnly(api); From 02accd7a495723d985f8b239970558414117546f Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 3 Feb 2024 15:12:24 +0100 Subject: [PATCH 2/5] Fix statemanager cleanup setting game state to ended by accident --- apps/openmw/mwbase/luamanager.hpp | 1 + apps/openmw/mwlua/luamanagerimp.cpp | 6 ++++++ apps/openmw/mwlua/luamanagerimp.hpp | 1 + apps/openmw/mwstate/statemanagerimp.cpp | 11 +++++++---- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwbase/luamanager.hpp b/apps/openmw/mwbase/luamanager.hpp index c70194a0a1..e865756408 100644 --- a/apps/openmw/mwbase/luamanager.hpp +++ b/apps/openmw/mwbase/luamanager.hpp @@ -56,6 +56,7 @@ namespace MWBase virtual void newGameStarted() = 0; virtual void gameLoaded() = 0; virtual void gameEnded() = 0; + virtual void noGame() = 0; virtual void objectAddedToScene(const MWWorld::Ptr& ptr) = 0; virtual void objectRemovedFromScene(const MWWorld::Ptr& ptr) = 0; virtual void objectTeleported(const MWWorld::Ptr& ptr) = 0; diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index d4366cac50..9029d7509e 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -379,6 +379,12 @@ namespace MWLua mMenuScripts.stateChanged(); } + void LuaManager::noGame() + { + clear(); + mMenuScripts.stateChanged(); + } + void LuaManager::uiModeChanged(const MWWorld::Ptr& arg) { if (mPlayer.isEmpty()) diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index 1ed9ed233e..a9657e4d61 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -70,6 +70,7 @@ namespace MWLua void newGameStarted() override; void gameLoaded() override; void gameEnded() override; + void noGame() override; void objectAddedToScene(const MWWorld::Ptr& ptr) override; void objectRemovedFromScene(const MWWorld::Ptr& ptr) override; void inputEvent(const InputEvent& event) override; diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp index e02b6053ad..5927544f35 100644 --- a/apps/openmw/mwstate/statemanagerimp.cpp +++ b/apps/openmw/mwstate/statemanagerimp.cpp @@ -62,16 +62,19 @@ void MWState::StateManager::cleanup(bool force) MWBase::Environment::get().getInputManager()->clear(); MWBase::Environment::get().getMechanicsManager()->clear(); - mState = State_NoGame; mCharacterManager.setCurrentCharacter(nullptr); mTimePlayed = 0; mLastSavegame.clear(); - MWMechanics::CreatureStats::cleanup(); - endGame(); + mState = State_NoGame; + MWBase::Environment::get().getLuaManager()->noGame(); + } + else + { + // TODO: do we need this cleanup? + MWBase::Environment::get().getLuaManager()->clear(); } - MWBase::Environment::get().getLuaManager()->clear(); } std::map MWState::StateManager::buildContentFileIndexMap(const ESM::ESMReader& reader) const From 5d0537e57c2726ddddc766b967239b54fc41f472 Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 3 Feb 2024 15:16:42 +0100 Subject: [PATCH 3/5] Document core.sendGlobalEvent behavior in menu scripts --- files/lua_api/openmw/core.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index db60346e7c..33f21a6cce 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -19,7 +19,7 @@ -- @function [parent=#core] quit --- --- Send an event to global scripts. +-- Send an event to global scripts. Note: in menu scripts, errors if the game is not running (check @{openmw.menu#menu.getState}) -- @function [parent=#core] sendGlobalEvent -- @param #string eventName -- @param eventData From 72136e7e921077e5cb9b5d3bba9b0b38edcdf74c Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 3 Feb 2024 15:39:04 +0100 Subject: [PATCH 4/5] Remove debug log --- files/data/scripts/omw/settings/menu.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/files/data/scripts/omw/settings/menu.lua b/files/data/scripts/omw/settings/menu.lua index 6d6d07a20b..781d1cdd27 100644 --- a/files/data/scripts/omw/settings/menu.lua +++ b/files/data/scripts/omw/settings/menu.lua @@ -421,7 +421,6 @@ local menuGroups = {} local menuPages = {} local function resetPlayerGroups() - print('MENU reset player groups') local playerGroupsSection = storage.playerSection(common.groupSectionKey) for pageKey, page in pairs(groups) do for groupKey, group in pairs(page) do From 891f3583feece6e49829ca3c2f1c1c06439701c7 Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 3 Feb 2024 15:39:28 +0100 Subject: [PATCH 5/5] Only reset settings when there is no game, not on game end / player death --- files/data/scripts/omw/settings/menu.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/data/scripts/omw/settings/menu.lua b/files/data/scripts/omw/settings/menu.lua index 781d1cdd27..88913143e8 100644 --- a/files/data/scripts/omw/settings/menu.lua +++ b/files/data/scripts/omw/settings/menu.lua @@ -502,7 +502,7 @@ return { if menu.getState() == menu.STATE.Running then updatePlayerGroups() updateGlobalGroups() - else + elseif menu.getState() == menu.STATE.NoGame then resetPlayerGroups() end end,