diff --git a/apps/openmw/mwlua/engineevents.cpp b/apps/openmw/mwlua/engineevents.cpp index 13d3f033e7..c7418ad356 100644 --- a/apps/openmw/mwlua/engineevents.cpp +++ b/apps/openmw/mwlua/engineevents.cpp @@ -22,8 +22,6 @@ namespace MWLua { } - void operator()(const OnNewGame&) const { mGlobalScripts.newGameStarted(); } - void operator()(const OnActive& event) const { MWWorld::Ptr ptr = getPtr(event.mObject); diff --git a/apps/openmw/mwlua/engineevents.hpp b/apps/openmw/mwlua/engineevents.hpp index 78892ae19b..b20ba2a3e8 100644 --- a/apps/openmw/mwlua/engineevents.hpp +++ b/apps/openmw/mwlua/engineevents.hpp @@ -19,9 +19,6 @@ namespace MWLua { } - struct OnNewGame - { - }; struct OnActive { ESM::RefNum mObject; @@ -44,7 +41,7 @@ namespace MWLua { MWWorld::CellStore& mCell; }; - using Event = std::variant; + using Event = std::variant; void clear() { mQueue.clear(); } void addToQueue(Event e) { mQueue.push_back(std::move(e)); } diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index e4828167c4..b2a1e4ea2d 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -194,6 +194,14 @@ namespace MWLua if (mPlayer.isEmpty()) return; // The game is not started yet. + if (mNewGameStarted) + { + mNewGameStarted = false; + // Run onNewGame handler in synchronizedUpdate (at the beginning of the frame), so it + // can teleport the player to the starting location before the first frame is rendered. + mGlobalScripts.newGameStarted(); + } + // We apply input events in `synchronizedUpdate` rather than in `update` in order to reduce input latency. mProcessingInputEvents = true; PlayerScripts* playerScripts = dynamic_cast(mPlayer.getRefData().getLuaScripts()); @@ -237,6 +245,7 @@ namespace MWLua mWorldView.clear(); mGlobalScripts.removeAllScripts(); mGlobalScriptsStarted = false; + mNewGameStarted = false; if (!mPlayer.isEmpty()) { mPlayer.getCellRef().unsetRefNum(); @@ -273,7 +282,7 @@ namespace MWLua mInputEvents.clear(); mGlobalScripts.addAutoStartedScripts(); mGlobalScriptsStarted = true; - mEngineEvents.addToQueue(EngineEvents::OnNewGame{}); + mNewGameStarted = true; } void LuaManager::gameLoaded() diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index e73a850d63..74976f1127 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -141,6 +141,7 @@ namespace MWLua bool mInitialized = false; bool mGlobalScriptsStarted = false; bool mProcessingInputEvents = false; + bool mNewGameStarted = false; LuaUtil::ScriptsConfiguration mConfiguration; LuaUtil::LuaState mLua; LuaUi::ResourceManager mUiResourceManager;