235 lines
5.4 KiB
Ucode
235 lines
5.4 KiB
Ucode
/*
|
|
--------------------------------------------------------------
|
|
Condition_ActorHealth
|
|
--------------------------------------------------------------
|
|
|
|
A Condition which tracks the health state of specified Actor(s)
|
|
and is marked complete when it drops below a specified threshold.
|
|
|
|
Author : Alex Quick
|
|
|
|
--------------------------------------------------------------
|
|
*/
|
|
|
|
class ObjCondition_ActorHealth extends KF_ObjectiveCondition
|
|
editinlinenew;
|
|
|
|
enum EHealthMethod
|
|
{
|
|
Health_Empty,
|
|
Health_Full,
|
|
};
|
|
|
|
var () edfindable private Actor TargetActor;
|
|
|
|
var bool bAcquiredPawn;
|
|
/* if we are defending a pawn, this is the minimum health that pawn can drop to before we fail */
|
|
var () float MinHealthPct;
|
|
/* tag for actors that are spawned at runtime which we must also defend */
|
|
var () Name TargetPawnTag;
|
|
|
|
var () EHealthMethod HealthCondition;
|
|
|
|
var float CurrentHealth,HealthMax;
|
|
|
|
var const name InitialHealthActorName,HealthActorName;
|
|
|
|
function PostBeginPlay(KF_StoryObjective MyOwner)
|
|
{
|
|
Super.PostBeginPlay(MyOwner);
|
|
|
|
// Ditch any reference to this actor ASAP.
|
|
if(TargetActor != none)
|
|
{
|
|
SetTargetActor(HealthActorName,TargetActor);
|
|
SetTargetActor(InitialHealthActorName,TargetActor);
|
|
TargetActor = none;
|
|
}
|
|
}
|
|
|
|
|
|
function Reset()
|
|
{
|
|
Super.Reset();
|
|
CurrentHealth = 0;
|
|
HealthMax = 0;
|
|
bAcquiredPawn = false;
|
|
}
|
|
|
|
function ConditionActivated(pawn ActivatingPlayer)
|
|
{
|
|
local Actor InitialActor;
|
|
|
|
Super.ConditionActivated(ActivatingPlayer);
|
|
|
|
InitialActor = GetTargetActor(InitialHealthActorName) ;
|
|
|
|
if(InitialActor != none &&
|
|
!InitialActor.bPendingDelete)
|
|
{
|
|
SetTargetActor(HealthActorName,InitialActor);
|
|
}
|
|
}
|
|
|
|
function bool ConditionIsRelevant()
|
|
{
|
|
local Actor MyTargetActor;
|
|
|
|
MyTargetActor = GetTargetActor(HealthActorName);
|
|
|
|
if(MyTargetActor != none &&
|
|
KF_StoryNPC(MyTargetActor) != none)
|
|
{
|
|
return KF_StoryNPC(MyTargetActor).bActive ;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function ConditionTick(float DeltaTime)
|
|
{
|
|
local KFDoorMover DoorActor;
|
|
local Pawn PawnActor;
|
|
local Actor MyTargetActor;
|
|
|
|
UpdatePawnList();
|
|
|
|
MyTargetActor = GetTargetActor(HealthActorName);
|
|
|
|
if(MyTargetActor != none &&
|
|
!MyTargetActor.bDeleteMe &&
|
|
!MyTargetActor.bPendingDelete)
|
|
{
|
|
PawnActor = Pawn(MyTargetActor);
|
|
DoorActor = KFDoorMover(MyTargetActor);
|
|
|
|
if(DoorActor != none && DoorActor.MyTrigger != none )
|
|
{
|
|
HealthMax = DoorActor.MyTrigger.MaxWeldStrength ;
|
|
CurrentHealth = DoorActor.MyTrigger.WeldStrength ;
|
|
}
|
|
else
|
|
if(PawnActor != none)
|
|
{
|
|
HealthMax = PawnActor.HealthMax;
|
|
CurrentHealth = PawnActor.Health;
|
|
}
|
|
else
|
|
{
|
|
HealthMax = 100.f;
|
|
CurrentHealth = float(MyTargetActor != none && !MyTargetActor.bHidden && !MyTargetActor.bPendingDelete) * 100.f ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CurrentHealth = 0;
|
|
}
|
|
|
|
Super.ConditionTick(DeltaTime);
|
|
}
|
|
|
|
|
|
function UpdatePawnList()
|
|
{
|
|
local Controller C;
|
|
local Actor MyTargetActor;
|
|
|
|
MyTargetActor = GetTargetActor(HealthActorName);
|
|
|
|
if(bAcquiredPawn ||
|
|
TargetpawnTag == '' ||
|
|
(MyTargetActor != none &&
|
|
MyTargetActor.Tag == TargetPawnTag))
|
|
{
|
|
return;
|
|
}
|
|
|
|
for ( C= GetObjOwner().Level.ControllerList; C!=None; C=C.NextController )
|
|
{
|
|
if(C.Pawn != none &&
|
|
!C.Pawn.bDeleteMe &&
|
|
!C.Pawn.bPendingDelete &&
|
|
C.Pawn.Health > 0 &&
|
|
C.Pawn.Tag == TargetpawnTag)
|
|
{
|
|
SetTargetActor(HealthActorName,C.Pawn);
|
|
bAcquiredPawn = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function vector GetLocation(optional out Actor LocActor)
|
|
{
|
|
local Actor MyTargetActor;
|
|
local Actor HUDWorldLocActor;
|
|
|
|
if(ConditionIsActive())
|
|
{
|
|
MyTargetActor = GetTargetActor(HealthActorName);
|
|
|
|
if(MyTargetActor != none &&
|
|
!MyTargetActor.bPendingDelete)
|
|
{
|
|
LocActor = MyTargetActor;
|
|
return MyTargetActor.Location ;
|
|
}
|
|
|
|
HUDWorldLocActor = GetTargetActor(WorldLocActorName);
|
|
if( HUDWorldLocActor != none)
|
|
{
|
|
LocActor = HUDWorldLocActor ;
|
|
return HUDWorldLocActor.Location ;
|
|
}
|
|
}
|
|
|
|
|
|
return vect(0,0,0); // force not to display.
|
|
}
|
|
|
|
|
|
|
|
/* returns the percentage of completion for this condition */
|
|
function float GetCompletionPct()
|
|
{
|
|
local float Pct;
|
|
|
|
if(HealthMax == 0)
|
|
{
|
|
return 0.f;
|
|
}
|
|
|
|
if(HealthCondition == Health_Empty)
|
|
{
|
|
Pct = 1.f - FClamp(CurrentHealth / HealthMax,0.f,1.f) ;
|
|
}
|
|
else
|
|
{
|
|
Pct = FClamp(CurrentHealth / HealthMax,0.f,1.f) ;
|
|
}
|
|
|
|
return Pct;
|
|
}
|
|
|
|
function string GetDataString()
|
|
{
|
|
if(HUD_Screen.Screen_CountStyle == 1)
|
|
{
|
|
return Int(Round((1.f-GetCompletionPct())*100))$"%" ;
|
|
}
|
|
else
|
|
{
|
|
return Int(Round((GetCompletionPct())*100))$"%" ;
|
|
}
|
|
}
|
|
|
|
|
|
DefaultProperties
|
|
{
|
|
InitialHealthActorName = "InitialHealthActor"
|
|
HealthActorName = "HealthActor"
|
|
}
|
|
|
|
|