rott/kf_sources/KFStoryGame/Classes/ObjCondition_LineOfSight.uc
2026-07-14 20:27:09 +07:00

69 lines
1.7 KiB
Ucode

/*
--------------------------------------------------------------
Condition_LineOfSight
--------------------------------------------------------------
A Condition which is marked complete when a living human player
looks at / has an unobstructed line of sight to it.
Author : Alex Quick
--------------------------------------------------------------
*/
class ObjCondition_LineOfSight extends KF_ObjectiveCondition
editinlinenew;
var () float MinDotProduct;
var () float MinDistance;
var () bool bPerformLineCheck;
var bool bHasLOS;
function Reset()
{
Super.Reset();
bHasLOS = false;
}
function ConditionTick(float DeltaTime)
{
local Controller C;
local float Dist;
for ( C=GetObjOwner().Level.ControllerList; C!=None; C=C.NextController )
{
if(KFPlayerController_Story(C) != none && C.Pawn != none)
{
if(KFPlayerController_Story(C).IsLookingAtLocation(GetLocation(),MinDotProduct) && C.Pawn != none)
{
Dist = VSize(C.Pawn.Location - GetLocation());
if( Dist <= MinDistance)
{
bHasLOS = (!bPerformLineCheck || GetObjOwner().FastTrace(PlayerController(C).CalcViewLocation, GetLocation())); //EyePostion() is returning a funny value sometimes. Not sure why. C.Pawn./*EyePosition()*/Location
if(bHasLOS)
{
SetTargetActor(InstigatorName,C.Pawn);
break;
}
}
}
}
}
Super.ConditionTick(DeltaTime);
}
/* returns the percentage of completion for this condition */
function float GetCompletionPct()
{
return float(bHasLOS) ;
}
DefaultProperties
{
bPerformLineCheck=true
MinDistance = 1000
}