diff --git a/AI/Wrappers/LegacyCpp/AIAICallback.cpp b/AI/Wrappers/LegacyCpp/AIAICallback.cpp index 1cff0ad99c6..aecb421c3d0 100644 --- a/AI/Wrappers/LegacyCpp/AIAICallback.cpp +++ b/AI/Wrappers/LegacyCpp/AIAICallback.cpp @@ -1675,13 +1675,15 @@ int CAIAICallback::HandleCommand(int commandId, void* data) { cppCmdData->rayLen, cppCmdData->srcUID, cppCmdData->hitUID, - cppCmdData->flags + cppCmdData->flags, + cppCmdData->hitFID }; ret = sAICallback->Clb_Engine_handleCommand(teamId, COMMAND_TO_ID_ENGINE, -1, COMMAND_TRACE_RAY, &cCmdData); cppCmdData->rayLen = cCmdData.rayLen; cppCmdData->hitUID = cCmdData.hitUID; + cppCmdData->hitFID = cCmdData.hitFID; break; } diff --git a/rts/ExternalAI/AICallback.cpp b/rts/ExternalAI/AICallback.cpp index bc0555f286a..edee19dad3e 100644 --- a/rts/ExternalAI/AICallback.cpp +++ b/rts/ExternalAI/AICallback.cpp @@ -1452,20 +1452,31 @@ int CAICallback::HandleCommand(int commandId, void* data) if (CHECK_UNITID(cmdData->srcUID)) { const CUnit* srcUnit = uh->units[cmdData->srcUID]; - const CUnit* hitUnit = NULL; - bool haveHit = false; - bool visible = true; if (srcUnit != NULL) { - const float realLen = helper->TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, 0.0f, srcUnit, hitUnit, cmdData->flags); + const CUnit* hitUnit = NULL; + const CFeature* hitFeature = NULL; + const float realLen = helper->TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, 0.0f, srcUnit, hitUnit, cmdData->flags, &hitFeature); + + bool visible = false; if (hitUnit != NULL) { - haveHit = true; - visible = (hitUnit->losStatus[teamHandler->AllyTeam(team)] & LOS_INLOS); + bool isUnitVisible = (hitUnit->losStatus[teamHandler->AllyTeam(team)] & LOS_INLOS); + if (isUnitVisible) { + visible = true; + cmdData->hitUID = hitUnit->id; + } + } + + if (hitFeature != NULL) { + bool isFeatureVisible = hitFeature->IsInLosForAllyTeam(teamHandler->AllyTeam(team)); + if (isFeatureVisible) { + visible = true; + cmdData->hitFID = hitFeature->id; + } } - cmdData->rayLen = ( visible)? realLen: cmdData->rayLen; - cmdData->hitUID = (haveHit && visible)? hitUnit->id: cmdData->hitUID; + cmdData->rayLen = visible? realLen: cmdData->rayLen; } } diff --git a/rts/ExternalAI/AICheats.cpp b/rts/ExternalAI/AICheats.cpp index ddc1d42046b..5777ba4a66c 100644 --- a/rts/ExternalAI/AICheats.cpp +++ b/rts/ExternalAI/AICheats.cpp @@ -10,6 +10,7 @@ #include "Sim/Misc/QuadField.h" #include "Sim/Units/UnitHandler.h" #include "Sim/Units/UnitLoader.h" +#include "Sim/Features/Feature.h" #include "Sim/Misc/GlobalSynced.h" #include "Sim/Misc/TeamHandler.h" #include "Game/GameServer.h" @@ -395,10 +396,12 @@ int CAICheats::HandleCommand(int commandId, void *data) if (CHECK_UNITID(cmdData->srcUID)) { const CUnit* srcUnit = uh->units[cmdData->srcUID]; const CUnit* hitUnit = NULL; + const CFeature* hitFeature = NULL; if (srcUnit != NULL) { - cmdData->rayLen = helper->TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, 0.0f, srcUnit, hitUnit, cmdData->flags); + cmdData->rayLen = helper->TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, 0.0f, srcUnit, hitUnit, cmdData->flags, &hitFeature); cmdData->hitUID = (hitUnit != NULL)? hitUnit->id: -1; + cmdData->hitFID = (hitFeature != NULL)? hitFeature->id: -1; } } diff --git a/rts/ExternalAI/AILegacySupport.h b/rts/ExternalAI/AILegacySupport.h index 3f0ae04076f..7c69b96664d 100644 --- a/rts/ExternalAI/AILegacySupport.h +++ b/rts/ExternalAI/AILegacySupport.h @@ -123,6 +123,7 @@ struct AIHCTraceRay int srcUID; int hitUID; int flags; + int hitFID; }; struct AIHCPause diff --git a/rts/ExternalAI/Interface/AISCommands.h b/rts/ExternalAI/Interface/AISCommands.h index 0cee8ffd669..07db6da26bf 100644 --- a/rts/ExternalAI/Interface/AISCommands.h +++ b/rts/ExternalAI/Interface/AISCommands.h @@ -1114,6 +1114,7 @@ struct STraceRayCommand { int srcUID; int hitUID; int flags; + int hitFID; }; // COMMAND_TRACE_RAY /** diff --git a/rts/ExternalAI/SSkirmishAICallbackImpl.cpp b/rts/ExternalAI/SSkirmishAICallbackImpl.cpp index 1b6b5e34748..f9a9dff743d 100644 --- a/rts/ExternalAI/SSkirmishAICallbackImpl.cpp +++ b/rts/ExternalAI/SSkirmishAICallbackImpl.cpp @@ -561,13 +561,15 @@ EXPORT(int) skirmishAiCallback_Engine_handleCommand(int teamId, int toId, int co cCmdData->rayLen, cCmdData->srcUID, cCmdData->hitUID, - cCmdData->flags + cCmdData->flags, + cCmdData->hitFID, }; wrapper_HandleCommand(clb, clbCheat, AIHCTraceRayId, &cppCmdData); cCmdData->rayLen = cppCmdData.rayLen; cCmdData->hitUID = cppCmdData.hitUID; + cCmdData->hitFID = cppCmdData.hitFID; } break; case COMMAND_PAUSE: {