Skip to content

Commit da74846

Browse files
Caball009xezon
authored andcommitted
fix(logic): Add nullptr check to msgPlayer in GameLogic::logicMessageDispatcher (#2383)
1 parent 52ffb5c commit da74846

File tree

2 files changed

+32
-108
lines changed

2 files changed

+32
-108
lines changed

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

Lines changed: 16 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,11 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
347347
#endif
348348

349349
Player *msgPlayer = ThePlayerList->getNthPlayer( msg->getPlayerIndex() );
350-
DEBUG_ASSERTCRASH( msgPlayer, ("logicMessageDispatcher: Processing message from unknown player (player index '%d')",
351-
msg->getPlayerIndex()) );
350+
if (msgPlayer == nullptr)
351+
{
352+
DEBUG_CRASH(("logicMessageDispatcher: Processing message from unknown player (player index '%d')", msg->getPlayerIndex()));
353+
return;
354+
}
352355

353356
AIGroupPtr currentlySelectedGroup = nullptr;
354357

@@ -404,7 +407,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
404407
if (commandName.isNotEmpty() /*&& msg->getType() != GameMessage::MSG_FRAME_TICK*/)
405408
{
406409
DEBUG_LOG(("Frame %d: GameLogic::logicMessageDispatcher() saw a %s from player %d (%ls)", getFrame(), commandName.str(),
407-
msg->getPlayerIndex(), msgPlayer->getPlayerDisplayName().str()));
410+
msgPlayer->getPlayerIndex(), msgPlayer->getPlayerDisplayName().str()));
408411
}
409412
#endif
410413
#endif // DEBUG_LOGGING
@@ -1634,13 +1637,6 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16341637
case GameMessage::MSG_CREATE_SELECTED_GROUP:
16351638
{
16361639
Bool createNewGroup = msg->getArgument( 0 )->boolean;
1637-
Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex());
1638-
1639-
if (player == nullptr) {
1640-
DEBUG_CRASH(("GameLogicDispatch - MSG_CREATE_SELECTED_GROUP had an invalid player number"));
1641-
break;
1642-
}
1643-
16441640
Bool firstObject = TRUE;
16451641

16461642
for (Int i = 1; i < msg->getArgumentCount(); ++i) {
@@ -1649,7 +1645,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16491645
continue;
16501646
}
16511647

1652-
selectObject(obj, createNewGroup && firstObject, player->getPlayerMask());
1648+
selectObject(obj, createNewGroup && firstObject, msgPlayer->getPlayerMask());
16531649
firstObject = FALSE;
16541650
}
16551651

@@ -1660,21 +1656,14 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16601656
//---------------------------------------------------------------------------------------------
16611657
case GameMessage::MSG_REMOVE_FROM_SELECTED_GROUP:
16621658
{
1663-
Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex());
1664-
1665-
if (player == nullptr) {
1666-
DEBUG_CRASH(("GameLogicDispatch - MSG_CREATE_SELECTED_GROUP had an invalid player number"));
1667-
break;
1668-
}
1669-
16701659
for (Int i = 0; i < msg->getArgumentCount(); ++i) {
16711660
ObjectID objID = msg->getArgument(i)->objectID;
16721661
Object *objToRemove = findObjectByID(objID);
16731662
if (!objToRemove) {
16741663
continue;
16751664
}
16761665

1677-
deselectObject(objToRemove, player->getPlayerMask());
1666+
deselectObject(objToRemove, msgPlayer->getPlayerMask());
16781667
}
16791668

16801669
break;
@@ -1684,11 +1673,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16841673
//---------------------------------------------------------------------------------------------
16851674
case GameMessage::MSG_DESTROY_SELECTED_GROUP:
16861675
{
1687-
Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex());
1688-
if (player != nullptr)
1689-
{
1690-
player->setCurrentlySelectedAIGroup(nullptr);
1691-
}
1676+
msgPlayer->setCurrentlySelectedAIGroup(nullptr);
16921677

16931678
break;
16941679

@@ -1902,7 +1887,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
19021887
Int i=0;
19031888
for (; i<ThePlayerList->getPlayerCount(); ++i)
19041889
{
1905-
if (i != msg->getPlayerIndex())
1890+
if (i != msgPlayer->getPlayerIndex())
19061891
{
19071892
Player *otherPlayer = ThePlayerList->getNthPlayer(i);
19081893
if (msgPlayer->getRelationship(otherPlayer->getDefaultTeam()) == ALLIES &&
@@ -1984,13 +1969,9 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
19841969
case GameMessage::MSG_CREATE_TEAM8:
19851970
case GameMessage::MSG_CREATE_TEAM9:
19861971
{
1987-
Int playerIndex = msg->getPlayerIndex();
1988-
Player *player = ThePlayerList->getNthPlayer(playerIndex);
1989-
DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for create team message"));
1990-
19911972
// TheSuperHackers @tweak Stubbjax 17/08/2025 The local player processes this message in CommandXlat for immediate assignment.
1992-
if (player && !player->isLocalPlayer())
1993-
player->processCreateTeamGameMessage(msg->getType() - GameMessage::MSG_CREATE_TEAM0, msg);
1973+
if (!msgPlayer->isLocalPlayer())
1974+
msgPlayer->processCreateTeamGameMessage(msg->getType() - GameMessage::MSG_CREATE_TEAM0, msg);
19941975

19951976
break;
19961977
}
@@ -2006,16 +1987,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20061987
case GameMessage::MSG_SELECT_TEAM8:
20071988
case GameMessage::MSG_SELECT_TEAM9:
20081989
{
2009-
Int playerIndex = msg->getPlayerIndex();
2010-
Player *player = ThePlayerList->getNthPlayer(playerIndex);
2011-
DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for select team message"));
2012-
2013-
if (player == nullptr)
2014-
{
2015-
break;
2016-
}
2017-
2018-
player->processSelectTeamGameMessage(msg->getType() - GameMessage::MSG_SELECT_TEAM0, msg);
1990+
msgPlayer->processSelectTeamGameMessage(msg->getType() - GameMessage::MSG_SELECT_TEAM0, msg);
20191991
break;
20201992
}
20211993

@@ -2030,16 +2002,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20302002
case GameMessage::MSG_ADD_TEAM8:
20312003
case GameMessage::MSG_ADD_TEAM9:
20322004
{
2033-
Int playerIndex = msg->getPlayerIndex();
2034-
Player *player = ThePlayerList->getNthPlayer(playerIndex);
2035-
DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for add team message"));
2036-
2037-
if (player == nullptr)
2038-
{
2039-
break;
2040-
}
2041-
2042-
player->processAddTeamGameMessage(msg->getType() - GameMessage::MSG_ADD_TEAM0, msg);
2005+
msgPlayer->processAddTeamGameMessage(msg->getType() - GameMessage::MSG_ADD_TEAM0, msg);
20432006
break;
20442007
}
20452008

@@ -2075,11 +2038,10 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20752038
#endif
20762039
}
20772040

2078-
//UnsignedInt oldCRC = m_cachedCRCs[msg->getPlayerIndex()];
20792041
UnsignedInt newCRC = msg->getArgument(0)->integer;
20802042
//DEBUG_LOG(("Received CRC of %8.8X from %ls on frame %d", newCRC,
20812043
//msgPlayer->getPlayerDisplayName().str(), m_frame));
2082-
m_cachedCRCs[msg->getPlayerIndex()] = newCRC; // to mask problem: = (oldCRC < newCRC)?newCRC:oldCRC;
2044+
m_cachedCRCs[msgPlayer->getPlayerIndex()] = newCRC;
20832045
}
20842046
else if (TheRecorder && TheRecorder->isPlaybackMode())
20852047
{
@@ -2099,7 +2061,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20992061
ScienceType science = (ScienceType)msg->getArgument( 0 )->integer;
21002062

21012063
// sanity
2102-
if( science == SCIENCE_INVALID || msgPlayer == nullptr )
2064+
if( science == SCIENCE_INVALID )
21032065
break;
21042066

21052067
msgPlayer->attemptToPurchaseScience(science);

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

Lines changed: 16 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,11 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
350350
#endif
351351

352352
Player *msgPlayer = ThePlayerList->getNthPlayer( msg->getPlayerIndex() );
353-
DEBUG_ASSERTCRASH( msgPlayer, ("logicMessageDispatcher: Processing message from unknown player (player index '%d')",
354-
msg->getPlayerIndex()) );
353+
if (msgPlayer == nullptr)
354+
{
355+
DEBUG_CRASH(("logicMessageDispatcher: Processing message from unknown player (player index '%d')", msg->getPlayerIndex()));
356+
return;
357+
}
355358

356359
AIGroupPtr currentlySelectedGroup = nullptr;
357360

@@ -407,7 +410,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
407410
if (commandName.isNotEmpty() /*&& msg->getType() != GameMessage::MSG_FRAME_TICK*/)
408411
{
409412
DEBUG_LOG(("Frame %d: GameLogic::logicMessageDispatcher() saw a %s from player %d (%ls)", getFrame(), commandName.str(),
410-
msg->getPlayerIndex(), msgPlayer->getPlayerDisplayName().str()));
413+
msgPlayer->getPlayerIndex(), msgPlayer->getPlayerDisplayName().str()));
411414
}
412415
#endif
413416
#endif // DEBUG_LOGGING
@@ -1667,13 +1670,6 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16671670
case GameMessage::MSG_CREATE_SELECTED_GROUP:
16681671
{
16691672
Bool createNewGroup = msg->getArgument( 0 )->boolean;
1670-
Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex());
1671-
1672-
if (player == nullptr) {
1673-
DEBUG_CRASH(("GameLogicDispatch - MSG_CREATE_SELECTED_GROUP had an invalid player number"));
1674-
break;
1675-
}
1676-
16771673
Bool firstObject = TRUE;
16781674

16791675
for (Int i = 1; i < msg->getArgumentCount(); ++i) {
@@ -1682,7 +1678,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16821678
continue;
16831679
}
16841680

1685-
selectObject(obj, createNewGroup && firstObject, player->getPlayerMask());
1681+
selectObject(obj, createNewGroup && firstObject, msgPlayer->getPlayerMask());
16861682
firstObject = FALSE;
16871683
}
16881684

@@ -1693,21 +1689,14 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
16931689
//---------------------------------------------------------------------------------------------
16941690
case GameMessage::MSG_REMOVE_FROM_SELECTED_GROUP:
16951691
{
1696-
Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex());
1697-
1698-
if (player == nullptr) {
1699-
DEBUG_CRASH(("GameLogicDispatch - MSG_CREATE_SELECTED_GROUP had an invalid player number"));
1700-
break;
1701-
}
1702-
17031692
for (Int i = 0; i < msg->getArgumentCount(); ++i) {
17041693
ObjectID objID = msg->getArgument(i)->objectID;
17051694
Object *objToRemove = findObjectByID(objID);
17061695
if (!objToRemove) {
17071696
continue;
17081697
}
17091698

1710-
deselectObject(objToRemove, player->getPlayerMask());
1699+
deselectObject(objToRemove, msgPlayer->getPlayerMask());
17111700
}
17121701

17131702
break;
@@ -1717,11 +1706,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
17171706
//---------------------------------------------------------------------------------------------
17181707
case GameMessage::MSG_DESTROY_SELECTED_GROUP:
17191708
{
1720-
Player *player = ThePlayerList->getNthPlayer(msg->getPlayerIndex());
1721-
if (player != nullptr)
1722-
{
1723-
player->setCurrentlySelectedAIGroup(nullptr);
1724-
}
1709+
msgPlayer->setCurrentlySelectedAIGroup(nullptr);
17251710

17261711
break;
17271712

@@ -1935,7 +1920,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
19351920
Int i=0;
19361921
for (; i<ThePlayerList->getPlayerCount(); ++i)
19371922
{
1938-
if (i != msg->getPlayerIndex())
1923+
if (i != msgPlayer->getPlayerIndex())
19391924
{
19401925
Player *otherPlayer = ThePlayerList->getNthPlayer(i);
19411926
if (msgPlayer->getRelationship(otherPlayer->getDefaultTeam()) == ALLIES &&
@@ -2017,13 +2002,9 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20172002
case GameMessage::MSG_CREATE_TEAM8:
20182003
case GameMessage::MSG_CREATE_TEAM9:
20192004
{
2020-
Int playerIndex = msg->getPlayerIndex();
2021-
Player *player = ThePlayerList->getNthPlayer(playerIndex);
2022-
DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for create team message"));
2023-
20242005
// TheSuperHackers @tweak Stubbjax 17/08/2025 The local player processes this message in CommandXlat for immediate assignment.
2025-
if (player && !player->isLocalPlayer())
2026-
player->processCreateTeamGameMessage(msg->getType() - GameMessage::MSG_CREATE_TEAM0, msg);
2006+
if (!msgPlayer->isLocalPlayer())
2007+
msgPlayer->processCreateTeamGameMessage(msg->getType() - GameMessage::MSG_CREATE_TEAM0, msg);
20272008

20282009
break;
20292010
}
@@ -2039,16 +2020,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20392020
case GameMessage::MSG_SELECT_TEAM8:
20402021
case GameMessage::MSG_SELECT_TEAM9:
20412022
{
2042-
Int playerIndex = msg->getPlayerIndex();
2043-
Player *player = ThePlayerList->getNthPlayer(playerIndex);
2044-
DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for select team message"));
2045-
2046-
if (player == nullptr)
2047-
{
2048-
break;
2049-
}
2050-
2051-
player->processSelectTeamGameMessage(msg->getType() - GameMessage::MSG_SELECT_TEAM0, msg);
2023+
msgPlayer->processSelectTeamGameMessage(msg->getType() - GameMessage::MSG_SELECT_TEAM0, msg);
20522024
break;
20532025
}
20542026

@@ -2063,16 +2035,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
20632035
case GameMessage::MSG_ADD_TEAM8:
20642036
case GameMessage::MSG_ADD_TEAM9:
20652037
{
2066-
Int playerIndex = msg->getPlayerIndex();
2067-
Player *player = ThePlayerList->getNthPlayer(playerIndex);
2068-
DEBUG_ASSERTCRASH(player != nullptr, ("Could not find player for add team message"));
2069-
2070-
if (player == nullptr)
2071-
{
2072-
break;
2073-
}
2074-
2075-
player->processAddTeamGameMessage(msg->getType() - GameMessage::MSG_ADD_TEAM0, msg);
2038+
msgPlayer->processAddTeamGameMessage(msg->getType() - GameMessage::MSG_ADD_TEAM0, msg);
20762039
break;
20772040
}
20782041

@@ -2108,11 +2071,10 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
21082071
#endif
21092072
}
21102073

2111-
//UnsignedInt oldCRC = m_cachedCRCs[msg->getPlayerIndex()];
21122074
UnsignedInt newCRC = msg->getArgument(0)->integer;
21132075
//DEBUG_LOG(("Received CRC of %8.8X from %ls on frame %d", newCRC,
21142076
//msgPlayer->getPlayerDisplayName().str(), m_frame));
2115-
m_cachedCRCs[msg->getPlayerIndex()] = newCRC; // to mask problem: = (oldCRC < newCRC)?newCRC:oldCRC;
2077+
m_cachedCRCs[msgPlayer->getPlayerIndex()] = newCRC;
21162078
}
21172079
else if (TheRecorder && TheRecorder->isPlaybackMode())
21182080
{
@@ -2132,7 +2094,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData )
21322094
ScienceType science = (ScienceType)msg->getArgument( 0 )->integer;
21332095

21342096
// sanity
2135-
if( science == SCIENCE_INVALID || msgPlayer == nullptr )
2097+
if( science == SCIENCE_INVALID )
21362098
break;
21372099

21382100
msgPlayer->attemptToPurchaseScience(science);

0 commit comments

Comments
 (0)