bool CAI_ScriptConditions::IsInFOV( CBaseEntity *pViewer, CBaseEntity *pViewed, float fov, bool bTrueCone ) { CBaseCombatCharacter *pCombatantViewer = (pViewer) ? pViewer->MyCombatCharacterPointer() : NULL; if ( fov < 360 && pCombatantViewer /*&& pViewed*/ ) { Vector vLookDir; Vector vActorDir; // Halve the fov. As expressed here, fov is the full size of the viewcone. float flFovDotResult; flFovDotResult = cos( DEG2RAD( fov / 2 ) ); float fDotPr = 1; if( bTrueCone ) { // 3D Check vLookDir = pCombatantViewer->EyeDirection3D( ); vActorDir = pViewed->EyePosition() - pViewer->EyePosition(); vActorDir.NormalizeInPlace(); fDotPr = vLookDir.Dot(vActorDir); } else { // 2D Check vLookDir = pCombatantViewer->EyeDirection2D( ); vActorDir = pViewed->EyePosition() - pViewer->EyePosition(); vActorDir.z = 0.0; vActorDir.AsVector2D().NormalizeInPlace(); fDotPr = vLookDir.AsVector2D().Dot(vActorDir.AsVector2D()); } if ( fDotPr < flFovDotResult ) { if( fov < 0 ) { // Designer has requested that the player // NOT be looking at this place. return true; } return false; } } if( fov < 0 ) { return false; } return true; }