diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp index 688a0918a5a..d246a79a484 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp @@ -521,7 +521,20 @@ void MissileAIUpdate::doAttackState(Bool turnOK) if(curLoco && curLoco->getPreferredHeight() > 0) { // Am I close enough to the target to ignore my preferred height setting? - Real distanceToTargetSquared = ThePartitionManager->getDistanceSquared( getObject(), getGoalPosition(), FROM_CENTER_2D ); +#if RETAIL_COMPATIBLE_CRC + Real distanceToTargetSquared = ThePartitionManager->getDistanceSquared(getObject(), getGoalPosition(), FROM_CENTER_2D); +#else + // TheSuperHackers @bugfix Stubbjax 23/08/2026 Diving missiles now use their target's position to determine distance + // when applicable rather than the goal position. This allows them to properly determine when to dive on moving targets. + Real distanceToTargetSquared; + if (m_isTrackingTarget && (getGoalObject() != nullptr)) { + distanceToTargetSquared = ThePartitionManager->getDistanceSquared(getObject(), getGoalObject(), FROM_CENTER_2D); + } + else { + distanceToTargetSquared = ThePartitionManager->getDistanceSquared(getObject(), getGoalPosition(), FROM_CENTER_2D); + } +#endif + Real diveDistanceSquared = d->m_diveDistance; if (curLoco && curLoco->getPreferredHeight()) { diveDistanceSquared *= diveDistanceSquared; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp index 78b44dc99ca..e42f3621baa 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/MissileAIUpdate.cpp @@ -551,7 +551,20 @@ void MissileAIUpdate::doAttackState(Bool turnOK) if(curLoco && curLoco->getPreferredHeight() > 0) { // Am I close enough to the target to ignore my preferred height setting? - Real distanceToTargetSquared = ThePartitionManager->getDistanceSquared( getObject(), getGoalPosition(), FROM_CENTER_2D ); +#if RETAIL_COMPATIBLE_CRC + Real distanceToTargetSquared = ThePartitionManager->getDistanceSquared(getObject(), getGoalPosition(), FROM_CENTER_2D); +#else + // TheSuperHackers @bugfix Stubbjax 23/08/2026 Diving missiles now use their target's position to determine distance + // when applicable rather than the goal position. This allows them to properly determine when to dive on moving targets. + Real distanceToTargetSquared; + if (m_isTrackingTarget && (getGoalObject() != nullptr)) { + distanceToTargetSquared = ThePartitionManager->getDistanceSquared(getObject(), getGoalObject(), FROM_CENTER_2D); + } + else { + distanceToTargetSquared = ThePartitionManager->getDistanceSquared(getObject(), getGoalPosition(), FROM_CENTER_2D); + } +#endif + Real diveDistanceSquared = d->m_diveDistance; if (curLoco && curLoco->getPreferredHeight()) { diveDistanceSquared *= diveDistanceSquared;