From e6a049f341ecdc8ac651294293226b800ec1a772 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Tue, 11 Aug 2026 12:41:38 +1000 Subject: [PATCH 1/2] bugfix: Attacking infantry no longer attempt to path to their targets when force-evacuated from a vehicle --- .../GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp | 3 +++ .../GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp index 284df0b2abb..314c5fee168 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp @@ -672,6 +672,9 @@ void OpenContain::scatterToNearbyPosition(Object* rider) // set position of the object at center of building and move them toward pos rider->setPosition( theContainer->getPosition() ); ai->ignoreObstacle(theContainer); +#if !RETAIL_COMPATIBLE_CRC + ai->friend_setGoalObject(nullptr); +#endif ai->aiMoveToPosition( &pos, CMD_FROM_AI ); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp index 7ed6622ebf7..baea90bf2c5 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp @@ -768,6 +768,9 @@ void OpenContain::scatterToNearbyPosition(Object* rider) // set position of the object at center of building and move them toward pos rider->setPosition( theContainer->getPosition() ); ai->ignoreObstacle(theContainer); +#if !RETAIL_COMPATIBLE_CRC + ai->friend_setGoalObject(nullptr); +#endif ai->aiMoveToPosition( &pos, CMD_FROM_AI ); } From 04f2396226336826f72aa0f75cb6ca0b9ddbb368 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Tue, 11 Aug 2026 14:10:39 +1000 Subject: [PATCH 2/2] bugfix: Clear temporary states when the AIStateMachine is cleared --- Generals/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp | 7 +++++++ .../Code/GameEngine/Source/GameLogic/AI/AIStates.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp b/Generals/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp index 7ce23ef377e..385ae65a089 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp @@ -1016,6 +1016,13 @@ void AIStateMachine::clear() m_goalWaypoint = nullptr; m_goalSquad = nullptr; +#if !RETAIL_COMPATIBLE_CRC + if (m_temporaryState) + m_temporaryState->onExit(EXIT_RESET); + + m_temporaryState = nullptr; +#endif + AIUpdateInterface* ai = getOwner()->getAI(); if (ai) ai->friend_notifyStateMachineChanged(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp index f78e882cc0c..93474df91f7 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIStates.cpp @@ -1021,6 +1021,13 @@ void AIStateMachine::clear() m_goalWaypoint = nullptr; m_goalSquad = nullptr; +#if !RETAIL_COMPATIBLE_CRC + if (m_temporaryState) + m_temporaryState->onExit(EXIT_RESET); + + m_temporaryState = nullptr; +#endif + AIUpdateInterface* ai = getOwner()->getAI(); if (ai) ai->friend_notifyStateMachineChanged();