From cc06466f7254da2f125694be5a67c66f0d7bc1d0 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 18 Jun 2026 07:56:38 +0200 Subject: [PATCH] bugfix(logic): Check if time is frozen directly after script engine update. --- Generals/Code/GameEngine/Source/Common/GameEngine.cpp | 9 +-------- .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 6 ++++++ GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp | 9 +-------- .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 6 ++++++ 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Generals/Code/GameEngine/Source/Common/GameEngine.cpp b/Generals/Code/GameEngine/Source/Common/GameEngine.cpp index 3750383655c..7fbb2780709 100644 --- a/Generals/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/Generals/Code/GameEngine/Source/Common/GameEngine.cpp @@ -749,20 +749,13 @@ void GameEngine::update() } const Bool canUpdate = canUpdateGameLogic(FramePacer::IgnoreFrozenTime | FramePacer::IgnoreHaltedGame); - const Bool canUpdateLogic = canUpdate && !TheFramePacer->isGameHalted() && !TheFramePacer->isTimeFrozen(); - const Bool canUpdateScript = canUpdate && !TheFramePacer->isGameHalted(); + const Bool canUpdateLogic = canUpdate && !TheFramePacer->isGameHalted(); if (canUpdateLogic) { TheGameClient->step(); TheGameLogic->UPDATE(); } - else if (canUpdateScript) - { - // TheSuperHackers @info Still update the Script Engine to allow - // for scripted camera movements while the time is frozen. - TheScriptEngine->UPDATE(); - } } } diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index be7d76d2894..4d6085d2072 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3193,6 +3193,12 @@ void GameLogic::update() TheScriptEngine->UPDATE(); } + // TheSuperHackers @info Update 'is time frozen' because it may have changed after the script engine update. + TheFramePacer->setTimeFrozen(TheGameEngine->isTimeFrozen()); + + if (TheFramePacer->isTimeFrozen()) + return; + // Note - TerrainLogic update needs to happen after ScriptEngine update, but before object updates. jba. // This way changes in bridges are noted in the script engine before being cleared in TerrainLogic->update { diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp index 74781f946a5..f1499b847c9 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp @@ -916,20 +916,13 @@ void GameEngine::update() } const Bool canUpdate = canUpdateGameLogic(FramePacer::IgnoreFrozenTime | FramePacer::IgnoreHaltedGame); - const Bool canUpdateLogic = canUpdate && !TheFramePacer->isGameHalted() && !TheFramePacer->isTimeFrozen(); - const Bool canUpdateScript = canUpdate && !TheFramePacer->isGameHalted(); + const Bool canUpdateLogic = canUpdate && !TheFramePacer->isGameHalted(); if (canUpdateLogic) { TheGameClient->step(); TheGameLogic->UPDATE(); } - else if (canUpdateScript) - { - // TheSuperHackers @info Still update the Script Engine to allow - // for scripted camera movements while the time is frozen. - TheScriptEngine->UPDATE(); - } } } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 622aeb5da10..8aed266edaf 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3732,6 +3732,12 @@ void GameLogic::update() TheScriptEngine->UPDATE(); } + // TheSuperHackers @info Update 'is time frozen' because it may have changed after the script engine update. + TheFramePacer->setTimeFrozen(TheGameEngine->isTimeFrozen()); + + if (TheFramePacer->isTimeFrozen()) + return; + // Note - TerrainLogic update needs to happen after ScriptEngine update, but before object updates. jba. // This way changes in bridges are noted in the script engine before being cleared in TerrainLogic->update {