//--------------------------------------------------------- //--------------------------------------------------------- bool CAI_FreePass::ShouldAllowFVisible(bool bBaseResult ) { CBaseEntity * pTarget = GetPassTarget(); AI_EnemyInfo_t *pTargetInfo = GetOuter()->GetEnemies()->Find( pTarget ); if ( !bBaseResult || HasPass() ) return false; bool bIsVisible = true; // Peek logic if ( m_Params.peekTime > 0.1 ) { float lastTimeSeen = (pTargetInfo) ? pTargetInfo->timeLastSeen : AI_INVALID_TIME; float lastTimeDamagedBy = (pTargetInfo) ? pTargetInfo->timeLastReceivedDamageFrom : AI_INVALID_TIME; if ( ( lastTimeSeen == AI_INVALID_TIME || gpGlobals->curtime - lastTimeSeen > m_Params.peekTime ) && ( lastTimeDamagedBy == AI_INVALID_TIME || gpGlobals->curtime - lastTimeDamagedBy > m_Params.peekTimeAfterDamage ) ) { Vector vToTarget; VectorSubtract( pTarget->EyePosition(), GetOuter()->EyePosition(), vToTarget ); vToTarget.z = 0.0f; VectorNormalize( vToTarget ); Vector vecRight( -vToTarget.y, vToTarget.x, 0.0f ); trace_t tr; UTIL_TraceLine( GetOuter()->EyePosition(), pTarget->EyePosition() + (vecRight * m_Params.peekEyeDist - Vector( 0, 0, m_Params.peekEyeDistZ )), MASK_OPAQUE, GetOuter(), COLLISION_GROUP_NONE, &tr ); if ( tr.fraction != 1.0 && tr.m_pEnt != pTarget ) { if ( free_pass_peek_debug.GetBool() ) NDebugOverlay::Line( tr.startpos, tr.endpos - Vector( 0, 0, 2), 0, 255, 0, false, 0.1 ); bIsVisible = false; } if ( bIsVisible ) { UTIL_TraceLine( GetOuter()->EyePosition(), pTarget->EyePosition() + (-vecRight * m_Params.peekEyeDist - Vector( 0, 0, m_Params.peekEyeDistZ )), MASK_OPAQUE, GetOuter(), COLLISION_GROUP_NONE, &tr ); if ( tr.fraction != 1.0 && tr.m_pEnt != pTarget ) { if ( free_pass_peek_debug.GetBool() ) NDebugOverlay::Line( tr.startpos, tr.endpos - Vector( 0, 0, 2), 0, 255, 0, false, 0.1 ); bIsVisible = false; } } } if ( bIsVisible && free_pass_peek_debug.GetBool() ) NDebugOverlay::Line( GetOuter()->EyePosition(), pTarget->EyePosition() - Vector( 0, 0, 2), 255, 0, 0, false, 0.1 ); } return bIsVisible; }
bool Technique::HasPass(const ea::string& name) const { auto i = passIndices.find(name.to_lower()); return i != passIndices.end() ? HasPass(i->second) : false; }
bool Technique::HasPass(const String& name) const { HashMap<String, unsigned>::ConstIterator i = passIndices.Find(name.ToLower()); return i != passIndices.End() ? HasPass(i->second_) : false; }
void CAI_FreePass::Update( ) { CBaseEntity *pTarget = GetPassTarget(); if ( !pTarget || m_Params.duration < 0.1 ) return; //--------------------------------- // // Free pass logic // AI_EnemyInfo_t *pTargetInfo = GetOuter()->GetEnemies()->Find( pTarget ); // This works with old data because need to do before base class so as to not choose as enemy if ( !HasPass() ) { float timePlayerLastSeen = (pTargetInfo) ? pTargetInfo->timeLastSeen : AI_INVALID_TIME; float lastTimeDamagedBy = (pTargetInfo) ? pTargetInfo->timeLastReceivedDamageFrom : AI_INVALID_TIME; if ( timePlayerLastSeen == AI_INVALID_TIME || gpGlobals->curtime - timePlayerLastSeen > .15 ) // If didn't see the player last think { trace_t tr; UTIL_TraceLine( pTarget->EyePosition(), GetOuter()->EyePosition(), MASK_OPAQUE, GetOuter(), COLLISION_GROUP_NONE, &tr ); if ( tr.fraction != 1.0 && tr.m_pEnt != pTarget ) { float dist = (tr.endpos - tr.startpos).Length() * tr.fraction; if ( dist < m_Params.coverDist ) { if ( ( timePlayerLastSeen == AI_INVALID_TIME || gpGlobals->curtime - timePlayerLastSeen > m_Params.timeToTrigger ) && ( lastTimeDamagedBy == AI_INVALID_TIME || gpGlobals->curtime - lastTimeDamagedBy > m_Params.timeToTrigger ) ) { m_FreePassTimeRemaining = m_Params.duration; m_FreePassMoveMonitor.SetMark( pTarget, m_Params.moveTolerance ); } } } } } else { float temp = m_FreePassTimeRemaining; m_FreePassTimeRemaining = 0; CAI_Senses *pSenses = GetOuter()->GetSenses(); bool bCanSee = ( pSenses && pSenses->ShouldSeeEntity( pTarget ) && pSenses->CanSeeEntity( pTarget ) ); m_FreePassTimeRemaining = temp; if ( bCanSee ) { if ( !m_FreePassMoveMonitor.TargetMoved( pTarget ) ) m_FreePassTimeRemaining -= 0.1; else Revoke( true ); } else { m_FreePassTimeRemaining += 0.1 * m_Params.refillRate; if ( m_FreePassTimeRemaining > m_Params.duration ) m_FreePassTimeRemaining = m_Params.duration; m_FreePassMoveMonitor.SetMark( pTarget, m_Params.moveTolerance ); } } }