bool CVisibleObjectsHelper::CheckObjectViewDist(const Agent& agent, const SVisibleObject &visibleObject) const { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); assert(agent.IsValid()); bool bInViewDist = true; IEntitySystem *pEntitySystem = gEnv->pEntitySystem; assert(pEntitySystem); IEntity *pAIEntity = pEntitySystem->GetEntity(agent.GetEntityID()); IEntity *pObjectEntity = pEntitySystem->GetEntity(visibleObject.entityId); IComponentRender *pObjectRenderProxy = (pAIEntity != NULL && pObjectEntity ? static_cast<IComponentRender *>(pObjectEntity->GetComponent<IComponentRender>().get()) : NULL); if (pObjectRenderProxy != NULL) { IRenderNode *pObjectRenderNode = pObjectRenderProxy->GetRenderNode(); if (pObjectRenderNode != NULL) { const float fDistanceSq = pAIEntity->GetWorldPos().GetSquaredDistance(pObjectEntity->GetWorldPos()); const float fMaxViewDistSq = sqr(pObjectRenderNode->GetMaxViewDist()); bInViewDist = (fDistanceSq <= fMaxViewDistSq); } } return bInViewDist; }
void AIPlayer::CheckBeingAttacked() { for (int i = 0; i < m_SimMailbox.size(); ++i) { const Message* message = m_SimMailbox[i]; switch (message->Type) { case MessageTypes::AI_MSG: { const AIMessage* openMsg = static_cast<const AIMessage*>(message); if (openMsg->TeamID == m_Team) { if (static_cast<AIStateMessages>(openMsg->AIMsg) == AIStateMessages::UNDER_ATTACK) { if (openMsg->SquadID >= m_Squads.size()) continue; Squad* squadUnderAttack = m_Squads[openMsg->SquadID]; Agent* agentUnderAttack = GetAgentPointer(openMsg->EntityID); if (squadUnderAttack->GetSize() == 0) continue; m_Brain.SquadIDUnderAttack = openMsg->SquadID; if (agentUnderAttack != nullptr) { m_Perceptions[PERCEPTION_UNDER_ATTACK] = 1; m_Brain.TimeSinceAttacked = 0; m_Brain.AgentUnderAttack = agentUnderAttack->GetEntityID(); } } } } break; default: Logger::Log("Received unrecognized message", "SSAI", LogSeverity::WARNING_MSG); break; } } }
void CVisibleObjectsHelper::CheckVisibilityToAI(const TActiveVisibleObjects &activeVisibleObjects, const Agent& agent) const { assert(agent.IsValid()); IScriptSystem *pSS = gEnv->pScriptSystem; assert(pSS); IEntity *pAIEntity = gEnv->pEntitySystem->GetEntity(agent.GetEntityID()); TActiveVisibleObjects::const_iterator itObject = activeVisibleObjects.begin(); TActiveVisibleObjects::const_iterator itObjectEnd = activeVisibleObjects.end(); for (; itObject != itObjectEnd; ++itObject) { const SVisibleObject *visibleObject = (*itObject); assert(visibleObject); const bool bVisible = IsObjectVisible(agent, *visibleObject); if (bVisible) { // Callback function if (visibleObject->pFunc) { visibleObject->pFunc(agent, visibleObject->entityId, visibleObject->pFuncArg); } // Notify on seen if (pAIEntity != NULL && eVOR_FlagNotifyOnSeen == (visibleObject->rule & eVOR_FlagNotifyOnSeen)) { IVisionMap& visionMap = *gEnv->pAISystem->GetVisionMap(); const ObservableParams* pObservableParams = visionMap.GetObservableParams(visibleObject->visionId); if (pObservableParams != NULL) { IEntity* pTargetEntity = gEnv->pEntitySystem->GetEntity(pObservableParams->entityId); ITargetTrackManager *pTargetTrackManager = gEnv->pAISystem->GetTargetTrackManager(); if (pTargetEntity != NULL && pTargetTrackManager != NULL) { const tAIObjectID aiOwnerId = pAIEntity->GetAIObjectID(); const tAIObjectID aiTargetId = pTargetEntity->GetAIObjectID(); TargetTrackHelpers::SStimulusEvent eventInfo; eventInfo.vPos = pTargetEntity->GetWorldPos(); eventInfo.eStimulusType = TargetTrackHelpers::eEST_Visual; eventInfo.eTargetThreat = AITHREAT_INTERESTING; pTargetTrackManager->HandleStimulusEventForAgent(aiOwnerId, aiTargetId, "SeeThrownObject", eventInfo); IAIObject* pAIObjectSender = pAIEntity->GetAI(); if (pAIObjectSender) { IAISignalExtraData *pSignalData = gEnv->pAISystem->CreateSignalExtraData(); if (pSignalData) { pSignalData->nID = visibleObject->entityId; } gEnv->pAISystem->SendSignal(SIGNALFILTER_SENDER, 1, "OnSawObjectMove", pAIObjectSender, pSignalData); } } } } } } }