diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index 934f607b6c..f945699efa 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -410,6 +410,18 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) //--------------------------------------------------------------------------------------------- case GameMessage::MSG_NEW_GAME: { +#if !RETAIL_COMPATIBLE_CRC + // TheSuperHackers @fix stephanmeesters 11/03/2026 + // Make sure we're ready to start a new game. This prevents an issue where an infinite disconnect screen + // can be force-triggered in an online match by using cheats. + if ( isInGame() || isClearingGameData() || isLoadingMap() ) + { + DEBUG_CRASH( ("Called MSG_NEW_GAME while game is not ready (inGame=%d, clearingData=%d, loadingMap=%d)", + isInGame(), isClearingGameData(), isLoadingMap()) ); + break; + } +#endif + //DEBUG_ASSERTCRASH(msg->getArgumentCount() == 1 || msg->getArgumentCount() == 2, ("%d arguments to MSG_NEW_GAME", msg->getArgumentCount())); GameMode gameMode = (GameMode)msg->getArgument( 0 )->integer; Int rankPoints = 0; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index a057812bec..b3b68e8744 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -419,6 +419,18 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) //--------------------------------------------------------------------------------------------- case GameMessage::MSG_NEW_GAME: { +#if !RETAIL_COMPATIBLE_CRC + // TheSuperHackers @fix stephanmeesters 11/03/2026 + // Make sure we're ready to start a new game. This prevents an issue where an infinite disconnect screen + // can be force-triggered in an online match by using cheats. + if ( isInGame() || isClearingGameData() || isLoadingMap() ) + { + DEBUG_CRASH( ("Called MSG_NEW_GAME while game is not ready (inGame=%d, clearingData=%d, loadingMap=%d)", + isInGame(), isClearingGameData(), isLoadingMap()) ); + break; + } +#endif + //DEBUG_ASSERTCRASH(msg->getArgumentCount() == 1 || msg->getArgumentCount() == 2, ("%d arguments to MSG_NEW_GAME", msg->getArgumentCount())); GameMode gameMode = (GameMode)msg->getArgument( 0 )->integer; Int rankPoints = 0;