@@ -2055,12 +2055,14 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20552055 break ;
20562056 }
20572057
2058-
20592058 // ---------------------------------------------------------------------------------------------
20602059 case GameMessage::MSG_LOGIC_CRC :
20612060 {
20622061 if (TheNetwork)
20632062 {
2063+ if (TheNetwork->sawCRCMismatch ())
2064+ break ;
2065+
20642066 Int slotIndex = -1 ;
20652067 for (Int i=0 ; i<MAX_SLOTS ; ++i)
20662068 {
@@ -2079,29 +2081,44 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20792081#if defined(RTS_DEBUG)
20802082 // don't even put this in release, cause someone might hack it.
20812083 if (!TheDebugIgnoreSyncErrors)
2082- {
2083- #endif
2084- m_shouldValidateCRCs = TRUE ;
2085- #if defined(RTS_DEBUG)
2086- }
20872084#endif
2085+ m_validationModeCRC = CRCMODE_NETWORK ;
20882086 }
20892087
2090- UnsignedInt newCRC = msg->getArgument (0 )->integer ;
2088+ const UnsignedInt newCRC = msg->getArgument (0 )->integer ;
20912089 // DEBUG_LOG(("Received CRC of %8.8X from %ls on frame %d", newCRC,
20922090 // msgPlayer->getPlayerDisplayName().str(), m_frame));
2091+
20932092 m_cachedCRCs[msgPlayer->getPlayerIndex ()] = newCRC;
20942093 }
20952094 else if (TheRecorder && TheRecorder->isPlaybackMode ())
20962095 {
2097- UnsignedInt newCRC = msg->getArgument (0 )->integer ;
2098- // DEBUG_LOG(("Saw CRC of %X from player %d. Our CRC is %X. Arg count is %d",
2096+ if (TheRecorder->sawCRCMismatch ())
2097+ break ;
2098+
2099+ DEBUG_ASSERTCRASH (msg->getArgument (1 )->boolean == msgPlayer->isLocalPlayer (),
2100+ (" CRC message origin is unexpected; playback message argument doesn't match message player index" ));
2101+
2102+ const UnsignedInt newCRC = msg->getArgument (0 )->integer ;
2103+ // DEBUG_LOG(("Saw CRC of %X from player %d. Our CRC is %X. Arg count is %d",
20992104 // newCRC, msgPlayer->getPlayerIndex(), getCRC(), msg->getArgumentCount()));
21002105
2101- TheRecorder->handleCRCMessage (newCRC, msgPlayer->getPlayerIndex (), (msg->getArgument (1 )->boolean ));
2106+ if (msgPlayer->isLocalPlayer ())
2107+ {
2108+ TheRecorder->handlePlaybackCRCMessage (newCRC);
2109+ }
2110+ else
2111+ {
2112+ #if defined(RTS_DEBUG)
2113+ // don't even put this in release, cause someone might hack it.
2114+ if (!TheDebugIgnoreSyncErrors)
2115+ #endif
2116+ m_validationModeCRC = CRCMODE_REPLAY ;
2117+
2118+ TheRecorder->handlePlayerCRCMessage (msgPlayer->getPlayerIndex (), newCRC);
2119+ }
21022120 }
21032121 break ;
2104-
21052122 }
21062123
21072124 // ---------------------------------------------------------------------------------------------
0 commit comments