From d7ad06b1938e4f58ca4826e795b59409ce342956 Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 18:13:21 +0000 Subject: [PATCH] bugfix(player): Add null checks for player template access --- Generals/Code/GameEngine/Source/Common/RTS/Player.cpp | 3 ++- .../GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp | 3 ++- .../GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp | 3 ++- GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp | 3 ++- .../GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp | 3 ++- .../GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp index 53861564982..946f2fe2823 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -1767,7 +1767,8 @@ void Player::transferAssetsFromThat(Player *that) std::list objsToTransfer; // let's not transfer beacons - const ThingTemplate *beaconTemplate = TheThingFactory->findTemplate( that->getPlayerTemplate()->getBeaconTemplate() ); + const PlayerTemplate *thatPlayerTemplate = that->getPlayerTemplate(); + const ThingTemplate *beaconTemplate = thatPlayerTemplate ? TheThingFactory->findTemplate( thatPlayerTemplate->getBeaconTemplate() ) : nullptr; // transfer all his units. for (PlayerTeamList::iterator it = that->m_playerTeamPrototypes.begin(); diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp index 9d7f4cd7e72..5a25e103b20 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp @@ -1883,7 +1883,8 @@ void ControlBar::evaluateContextUI() switchToContext( CB_CONTEXT_COMMAND, drawToEvaluateFor ); } - else if (obj->getControllingPlayer()->getPlayerTemplate()->getBeaconTemplate().compare(obj->getTemplate()->getName()) == 0) + else if (obj->getControllingPlayer()->getPlayerTemplate() + && obj->getControllingPlayer()->getPlayerTemplate()->getBeaconTemplate().compare(obj->getTemplate()->getName()) == 0) { switchToContext( CB_CONTEXT_BEACON, drawToEvaluateFor ); } diff --git a/Generals/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp b/Generals/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp index 4f9217ddedd..e44caba3786 100644 --- a/Generals/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp @@ -3084,7 +3084,8 @@ GameMessageDisposition CommandTranslator::translateGameMessage(const GameMessage (TheGlobalData->m_netMinPlayers==0 || TheGameInfo->isMultiPlayer())) { Int count; - const ThingTemplate *thing = TheThingFactory->findTemplate( ThePlayerList->getLocalPlayer()->getPlayerTemplate()->getBeaconTemplate() ); + const PlayerTemplate *localPlayerTemplate = ThePlayerList->getLocalPlayer()->getPlayerTemplate(); + const ThingTemplate *thing = localPlayerTemplate ? TheThingFactory->findTemplate( localPlayerTemplate->getBeaconTemplate() ) : nullptr; ThePlayerList->getLocalPlayer()->countObjectsByThingTemplate( 1, &thing, false, &count ); DEBUG_LOG(("MSG_META_PLACE_BEACON - Player already has %d beacons active", count)); if (count < TheMultiplayerSettings->getMaxBeaconsPerPlayer()) diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp index ac562460148..d52518461dd 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -2136,7 +2136,8 @@ void Player::transferAssetsFromThat(Player *that) std::list objsToTransfer; // let's not transfer beacons - const ThingTemplate *beaconTemplate = TheThingFactory->findTemplate( that->getPlayerTemplate()->getBeaconTemplate() ); + const PlayerTemplate *thatPlayerTemplate = that->getPlayerTemplate(); + const ThingTemplate *beaconTemplate = thatPlayerTemplate ? TheThingFactory->findTemplate( thatPlayerTemplate->getBeaconTemplate() ) : nullptr; // transfer all his units. for (PlayerTeamList::iterator it = that->m_playerTeamPrototypes.begin(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp index f07e61c8caf..00cdb319232 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp @@ -1908,7 +1908,8 @@ void ControlBar::evaluateContextUI() switchToContext( CB_CONTEXT_COMMAND, drawToEvaluateFor ); } - else if (obj->getControllingPlayer()->getPlayerTemplate()->getBeaconTemplate().compare(obj->getTemplate()->getName()) == 0) + else if (obj->getControllingPlayer()->getPlayerTemplate() + && obj->getControllingPlayer()->getPlayerTemplate()->getBeaconTemplate().compare(obj->getTemplate()->getName()) == 0) { switchToContext( CB_CONTEXT_BEACON, drawToEvaluateFor ); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp index bd223c90e50..fe6da12547f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/CommandXlat.cpp @@ -3298,7 +3298,8 @@ GameMessageDisposition CommandTranslator::translateGameMessage(const GameMessage (TheGlobalData->m_netMinPlayers == 0 || TheGameInfo->isMultiPlayer())) { Int count; - const ThingTemplate* thing = TheThingFactory->findTemplate(ThePlayerList->getLocalPlayer()->getPlayerTemplate()->getBeaconTemplate()); + const PlayerTemplate* localPlayerTemplate = ThePlayerList->getLocalPlayer()->getPlayerTemplate(); + const ThingTemplate* thing = localPlayerTemplate ? TheThingFactory->findTemplate(localPlayerTemplate->getBeaconTemplate()) : nullptr; ThePlayerList->getLocalPlayer()->countObjectsByThingTemplate(1, &thing, false, &count); DEBUG_LOG(("MSG_META_PLACE_BEACON - Player already has %d beacons active", count)); if (count < TheMultiplayerSettings->getMaxBeaconsPerPlayer())