diff --git a/apps/openmw/mwlua/debugbindings.cpp b/apps/openmw/mwlua/debugbindings.cpp index 7f64188ff5..aa5ececc22 100644 --- a/apps/openmw/mwlua/debugbindings.cpp +++ b/apps/openmw/mwlua/debugbindings.cpp @@ -44,6 +44,11 @@ namespace MWLua return world->isActorCollisionEnabled(world->getPlayerPtr()); }; + api["toggleMWScript"] = []() { MWBase::Environment::get().getWorld()->toggleScripts(); }; + api["isMWScriptEnabled"] = []() { return MWBase::Environment::get().getWorld()->getScriptsEnabled(); }; + + api["reloadLua"] = []() { MWBase::Environment::get().getLuaManager()->reloadAllScripts(); }; + api["NAV_MESH_RENDER_MODE"] = LuaUtil::makeStrictReadOnly(context.mLua->tableFromPairs({ { "AreaType", MWRender::NavMeshMode::AreaType }, diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index 23aca1fd46..fc686dcbb3 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -239,6 +239,13 @@ namespace MWLua mInGameConsoleMessages.clear(); applyDelayedActions(); + + if (mReloadAllScriptsRequested) + { + // Reloading right after `applyDelayedActions` to guarantee that no delayed actions are currently queued. + reloadAllScriptsImpl(); + mReloadAllScriptsRequested = false; + } } void LuaManager::applyDelayedActions() @@ -477,7 +484,7 @@ namespace MWLua scripts->load(data); } - void LuaManager::reloadAllScripts() + void LuaManager::reloadAllScriptsImpl() { Log(Debug::Info) << "Reload Lua"; diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index 3cbef6d945..9f4c0096b5 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -116,8 +116,9 @@ namespace MWLua void loadLocalScripts(const MWWorld::Ptr& ptr, const ESM::LuaScripts& data) override; void setContentFileMapping(const std::map& mapping) override { mContentFileMapping = mapping; } - // Drops script cache and reloads all scripts. Calls `onSave` and `onLoad` for every script. - void reloadAllScripts() override; + // At the end of the next `synchronizedUpdate` drops script cache and reloads all scripts. + // Calls `onSave` and `onLoad` for every script. + void reloadAllScripts() override { mReloadAllScriptsRequested = true; } void handleConsoleCommand( const std::string& consoleMode, const std::string& command, const MWWorld::Ptr& selectedPtr) override; @@ -149,12 +150,14 @@ namespace MWLua void initConfiguration(); LocalScripts* createLocalScripts(const MWWorld::Ptr& ptr, std::optional autoStartConf = std::nullopt); + void reloadAllScriptsImpl(); bool mInitialized = false; bool mGlobalScriptsStarted = false; bool mProcessingInputEvents = false; bool mApplyingDelayedActions = false; bool mNewGameStarted = false; + bool mReloadAllScriptsRequested = false; LuaUtil::ScriptsConfiguration mConfiguration; LuaUtil::LuaState mLua; LuaUi::ResourceManager mUiResourceManager; diff --git a/files/lua_api/openmw/debug.lua b/files/lua_api/openmw/debug.lua index fba649c16e..52ed79aa00 100644 --- a/files/lua_api/openmw/debug.lua +++ b/files/lua_api/openmw/debug.lua @@ -44,6 +44,19 @@ -- @function [parent=#Debug] isCollisionEnabled -- @return #boolean +--- +-- Toggles MWScripts +-- @function [parent=#Debug] toggleMWScript + +--- +-- Is MWScripts enabled +-- @function [parent=#Debug] isMWScriptEnabled +-- @return #boolean + +--- +-- Reloads all Lua scripts +-- @function [parent=#Debug] reloadLua + --- -- Navigation mesh rendering modes -- @type NAV_MESH_RENDER_MODE