Skip to content

Commit 1ebce07

Browse files
authored
[GEN][ZH] Prevent game crash when a player is selected in Replay playback (#1212)
This is a hack in GameLogic::logicMessageDispatcher() for Retail compatible builds
1 parent 762b7af commit 1ebce07

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1969,6 +1969,14 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
19691969

19701970
} // end switch
19711971

1972+
#if RETAIL_COMPATIBLE_CRC
1973+
// TheSuperHackers @bugfix xezon 28/06/2025 This hack avoids crashing when players are selected during Replay playback.
1974+
// It can read data from an already deleted AIGroup and return this function when its member size is 0, signifying that
1975+
// it is indeed deleted.
1976+
if (currentlySelectedGroup && currentlySelectedGroup->getCount() == 0)
1977+
return;
1978+
#endif
1979+
19721980
/**/ /// @todo: multiplayer semantics
19731981
if (currentlySelectedGroup && TheRecorder->isPlaybackMode() && TheGlobalData->m_useCameraInReplay && TheControlBar->getObserverLookAtPlayer() == thisPlayer /*&& !TheRecorder->isMultiplayer()*/)
19741982
{

GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1997,6 +1997,14 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
19971997

19981998
} // end switch
19991999

2000+
#if RETAIL_COMPATIBLE_CRC
2001+
// TheSuperHackers @bugfix xezon 28/06/2025 This hack avoids crashing when players are selected during Replay playback.
2002+
// It can read data from an already deleted AIGroup and return this function when its member size is 0, signifying that
2003+
// it is indeed deleted.
2004+
if (currentlySelectedGroup && currentlySelectedGroup->getCount() == 0)
2005+
return;
2006+
#endif
2007+
20002008
/**/ /// @todo: multiplayer semantics
20012009
if (currentlySelectedGroup && TheRecorder->isPlaybackMode() && TheGlobalData->m_useCameraInReplay && TheControlBar->getObserverLookAtPlayer() == thisPlayer /*&& !TheRecorder->isMultiplayer()*/)
20022010
{

0 commit comments

Comments
 (0)