From ce76b15d43910862e312f67265dc9500c9056089 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 2 Mar 2026 22:28:33 +0100 Subject: [PATCH 1/4] Added check on 'thisPlayer'. --- .../Source/GameLogic/System/GameLogicDispatch.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index a057812bec..3930c058dd 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -350,8 +350,11 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) #endif Player *thisPlayer = ThePlayerList->getNthPlayer( msg->getPlayerIndex() ); - DEBUG_ASSERTCRASH( thisPlayer, ("logicMessageDispatcher: Processing message from unknown player (player index '%d')", - msg->getPlayerIndex()) ); + if (thisPlayer == nullptr) + { + DEBUG_CRASH(("logicMessageDispatcher: Processing message from unknown player (player index '%d')", msg->getPlayerIndex())); + return; + } AIGroupPtr currentlySelectedGroup = nullptr; @@ -2041,7 +2044,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) ScienceType science = (ScienceType)msg->getArgument( 0 )->integer; // sanity - if( science == SCIENCE_INVALID || thisPlayer == nullptr ) + if( science == SCIENCE_INVALID ) break; thisPlayer->attemptToPurchaseScience(science); From 03918d2968ff0330e4c548dddb1ef89947cc8f65 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 2 Mar 2026 22:36:28 +0100 Subject: [PATCH 2/4] Removed redundant player pointer checks. --- .../GameLogic/System/GameLogicDispatch.cpp | 54 +++---------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index 3930c058dd..de383d5157 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -1586,13 +1586,6 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) case GameMessage::MSG_CREATE_SELECTED_GROUP: { Bool createNewGroup = msg->getArgument( 0 )->boolean; - Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex()); - - if (player == nullptr) { - DEBUG_CRASH(("GameLogicDispatch - MSG_CREATE_SELECTED_GROUP had an invalid player number")); - break; - } - Bool firstObject = TRUE; for (Int i = 1; i < msg->getArgumentCount(); ++i) { @@ -1601,7 +1594,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) continue; } - selectObject(obj, createNewGroup && firstObject, player->getPlayerMask()); + selectObject(obj, createNewGroup && firstObject, thisPlayer->getPlayerMask()); firstObject = FALSE; } @@ -1612,13 +1605,6 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) //--------------------------------------------------------------------------------------------- case GameMessage::MSG_REMOVE_FROM_SELECTED_GROUP: { - Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex()); - - if (player == nullptr) { - DEBUG_CRASH(("GameLogicDispatch - MSG_CREATE_SELECTED_GROUP had an invalid player number")); - break; - } - for (Int i = 0; i < msg->getArgumentCount(); ++i) { ObjectID objID = msg->getArgument(i)->objectID; Object *objToRemove = findObjectByID(objID); @@ -1626,7 +1612,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) continue; } - deselectObject(objToRemove, player->getPlayerMask()); + deselectObject(objToRemove, thisPlayer->getPlayerMask()); } break; @@ -1636,11 +1622,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) //--------------------------------------------------------------------------------------------- case GameMessage::MSG_DESTROY_SELECTED_GROUP: { - Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex()); - if (player != nullptr) - { - player->setCurrentlySelectedAIGroup(nullptr); - } + thisPlayer->setCurrentlySelectedAIGroup(nullptr); break; @@ -1929,13 +1911,9 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) case GameMessage::MSG_CREATE_TEAM8: case GameMessage::MSG_CREATE_TEAM9: { - Int playerIndex = msg->getPlayerIndex(); - Player *player = ThePlayerList->getNthPlayer(playerIndex); - DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for create team message")); - // TheSuperHackers @tweak Stubbjax 17/08/2025 The local player processes this message in CommandXlat for immediate assignment. - if (player && !player->isLocalPlayer()) - player->processCreateTeamGameMessage(msg->getType() - GameMessage::MSG_CREATE_TEAM0, msg); + if (!thisPlayer->isLocalPlayer()) + thisPlayer->processCreateTeamGameMessage(msg->getType() - GameMessage::MSG_CREATE_TEAM0, msg); break; } @@ -1951,16 +1929,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) case GameMessage::MSG_SELECT_TEAM8: case GameMessage::MSG_SELECT_TEAM9: { - Int playerIndex = msg->getPlayerIndex(); - Player *player = ThePlayerList->getNthPlayer(playerIndex); - DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for select team message")); - - if (player == nullptr) - { - break; - } - - player->processSelectTeamGameMessage(msg->getType() - GameMessage::MSG_SELECT_TEAM0, msg); + thisPlayer->processSelectTeamGameMessage(msg->getType() - GameMessage::MSG_SELECT_TEAM0, msg); break; } @@ -1975,16 +1944,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) case GameMessage::MSG_ADD_TEAM8: case GameMessage::MSG_ADD_TEAM9: { - Int playerIndex = msg->getPlayerIndex(); - Player *player = ThePlayerList->getNthPlayer(playerIndex); - DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for add team message")); - - if (player == nullptr) - { - break; - } - - player->processAddTeamGameMessage(msg->getType() - GameMessage::MSG_ADD_TEAM0, msg); + thisPlayer->processAddTeamGameMessage(msg->getType() - GameMessage::MSG_ADD_TEAM0, msg); break; } From c0d0f24fb97192ea3d5b799adfc2b1c76903d35c Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 2 Mar 2026 22:36:53 +0100 Subject: [PATCH 3/4] Changed 'msg->getPlayerIndex' to 'thisPlayer->getPlayerIndex'. --- .../GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index de383d5157..b4ec522745 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -1836,7 +1836,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) Int i=0; for (; igetPlayerCount(); ++i) { - if (i != msg->getPlayerIndex()) + if (i != thisPlayer->getPlayerIndex()) { Player *otherPlayer = ThePlayerList->getNthPlayer(i); if (thisPlayer->getRelationship(otherPlayer->getDefaultTeam()) == ALLIES && @@ -1984,7 +1984,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) UnsignedInt newCRC = msg->getArgument(0)->integer; //DEBUG_LOG(("Received CRC of %8.8X from %ls on frame %d", newCRC, //thisPlayer->getPlayerDisplayName().str(), m_frame)); - m_cachedCRCs[msg->getPlayerIndex()] = newCRC; // to mask problem: = (oldCRC < newCRC)?newCRC:oldCRC; + m_cachedCRCs[thisPlayer->getPlayerIndex()] = newCRC; // to mask problem: = (oldCRC < newCRC)?newCRC:oldCRC; } else if (TheRecorder && TheRecorder->isPlaybackMode()) { From 7c8b814f2a213051be95f0318c36dbb4894461bc Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sat, 7 Mar 2026 20:34:08 +0100 Subject: [PATCH 4/4] Removed two more instances of 'msg->getPlayerIndex'. --- .../GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index 0296ca8536..e48287c86d 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -410,7 +410,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) if (commandName.isNotEmpty() /*&& msg->getType() != GameMessage::MSG_FRAME_TICK*/) { DEBUG_LOG(("Frame %d: GameLogic::logicMessageDispatcher() saw a %s from player %d (%ls)", getFrame(), commandName.str(), - msg->getPlayerIndex(), thisPlayer->getPlayerDisplayName().str())); + thisPlayer->getPlayerIndex(), thisPlayer->getPlayerDisplayName().str())); } #endif #endif // DEBUG_LOGGING @@ -1987,11 +1987,10 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) #endif } - //UnsignedInt oldCRC = m_cachedCRCs[msg->getPlayerIndex()]; UnsignedInt newCRC = msg->getArgument(0)->integer; //DEBUG_LOG(("Received CRC of %8.8X from %ls on frame %d", newCRC, //thisPlayer->getPlayerDisplayName().str(), m_frame)); - m_cachedCRCs[thisPlayer->getPlayerIndex()] = newCRC; // to mask problem: = (oldCRC < newCRC)?newCRC:oldCRC; + m_cachedCRCs[thisPlayer->getPlayerIndex()] = newCRC; } else if (TheRecorder && TheRecorder->isPlaybackMode()) {