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 CGameAIRecorder::RecordLuaComment(const Agent &agent, const char* szComment, ...) const { assert(agent.IsValid()); if (m_bIsRecording && agent.IsValid()) { char szBuffer[1024] = {0}; va_list args; va_start(args, szComment); vsnprintf(szBuffer, 1024, szComment, args); va_end(args); IAIRecordable::RecorderEventData data(szBuffer); agent.GetAIObject()->RecordEvent(IAIRecordable::E_LUACOMMENT, &data); } }
bool CVisibleObjectsHelper::IsObjectVisible(const Agent& agent, EntityId objectId) const { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); assert(agent.IsValid()); bool bIsVisible = false; TVisibleObjects::const_iterator itFind = m_VisibleObjects.find(objectId); if (itFind != m_VisibleObjects.end()) { const SVisibleObject &visibleObject = itFind->second; bIsVisible = IsObjectVisible(agent, visibleObject); } return bIsVisible; }
bool CVisibleObjectsHelper::IsObjectVisible(const Agent& agent, const SVisibleObject &visibleObject) const { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); assert(agent.IsValid()); bool bIsVisible = false; if (visibleObject.bIsObservable) { bIsVisible = agent.CanSee(visibleObject.visionId); if (bIsVisible && eVOR_UseMaxViewDist == (visibleObject.rule & eVOR_UseMaxViewDist)) { bIsVisible = CheckObjectViewDist(agent, visibleObject); } } return bIsVisible; }
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); } } } } } } }