1
0
KF2-Dev-Scripts/KFGame/Classes/KFSeqAct_StartScriptedPawn.uc
2020-12-13 18:01:13 +03:00

179 lines
5.3 KiB
Ucode

//=============================================================================
// KFSeqAct_StartScriptedPawn
//=============================================================================
// Action that activates a scripted pawn
//=============================================================================
// Killing Floor 2
// Copyright (C) 2018 Tripwire Interactive LLC
//=============================================================================
class KFSeqAct_StartScriptedPawn extends SeqAct_Latent;
// Whether pawn should be spawned in an inactive state
var() bool bSpawnInactivePawn;
static event int GetObjClassVersion()
{
return Super.GetObjClassVersion() + 1;
}
event VersionUpdated(int OldVersion, int NewVersion)
{
local SeqVarLink UpdatedLink;
if (OldVersion == 1 && NewVersion == 2)
{
UpdatedLink.ExpectedType = class'SeqVar_Object';
UpdatedLink.LinkDesc = "KF Scripted Pawn Start";
UpdatedLink.PropertyName = '';
UpdatedLink.MaxVars = 1;
VariableLinks[0] = UpdatedLink;
UpdatedLink.ExpectedType = class'SequenceVariable';
UpdatedLink.LinkDesc = "Set Initial Health From";
UpdatedLink.PropertyName = '';
UpdatedLink.MaxVars = 1;
VariableLinks[1] = UpdatedLink;
UpdatedLink.ExpectedType = class'SequenceVariable';
UpdatedLink.LinkDesc = "Set Maximum Health From";
UpdatedLink.PropertyName = '';
UpdatedLink.MaxVars = 1;
VariableLinks[2] = UpdatedLink;
}
}
event Activated()
{
local SequenceVariable SeqVar;
local SeqVar_Object ObjVar;
local KFScriptedPawnSpawner PawnStart, ReferencePawnStart;
if (InputLinks[0].bHasImpulse)
{
// Grab our pawn start
foreach LinkedVariables(class'SeqVar_Object', ObjVar, "KF Scripted Pawn Spawner")
{
PawnStart = KFScriptedPawnSpawner(ObjVar.GetObjectValue());
break;
}
// Sanity
if (PawnStart == none)
{
return;
}
// Grab our health
foreach LinkedVariables(class'SequenceVariable', SeqVar, "Set Initial Health From")
{
if (SeqVar_Float(SeqVar) != none)
{
PawnStart.PawnHealth = SeqVar_Float(SeqVar).FloatValue;
break;
}
else if (SeqVar_Object(SeqVar) != none)
{
ReferencePawnStart = KFScriptedPawnSpawner(SeqVar_Object(SeqVar).GetObjectValue());
if (ReferencePawnStart != none)
{
if (ReferencePawnStart.Pawn != none)
{
PawnStart.ReferencePawn = ReferencePawnStart.Pawn;
PawnStart.bUseReferencePawnHealth = true;
break;
}
}
}
`warn(self$"::Activated - 'Set Initial Health From' not set to a valid object (Float or KFScriptedPawnSpawner)");
break;
}
// Grab our health
foreach LinkedVariables(class'SequenceVariable', SeqVar, "Set Maximum Health From")
{
if (SeqVar_Float(SeqVar) != none)
{
PawnStart.PawnHealthMax = SeqVar_Float(SeqVar).FloatValue;
break;
}
else if (SeqVar_Object(SeqVar) != none)
{
if (ReferencePawnStart == none)
{
ReferencePawnStart = KFScriptedPawnSpawner(SeqVar_Object(SeqVar).GetObjectValue());
}
if (ReferencePawnStart != none)
{
if (ReferencePawnStart.Pawn != none)
{
PawnStart.ReferencePawn = ReferencePawnStart.Pawn;
PawnStart.bUseReferencePawnHealthMax = true;
break;
}
}
}
`warn(self$"::Activated - 'Set Maximum Health From' not set to a valid object (Float or KFScriptedPawnSpawner)");
break;
}
PawnStart.StartPawn(bSpawnInactivePawn);
// Because we want to pulse an output sometime in the future, this needs to be a latent action.
// However, for latent actions to stay active, they need latent actors, and their latent actors
// need to reference them. There are several ways to accomplish this, but some require native code
// (which I want to avoid) and some require using Kismet differently than we currently do
// (which I want to avoid). This is the slightly hacky way to get this action to stay active
// until the pawn finishes its route, at which point an output is pulsed depending on the success
// of the pawn.
LatentActors.AddItem(PawnStart);
PawnStart.LatentActions.AddItem(self);
bAborted = false;
}
}
function CheckPawnFinished(Pawn P)
{
local SeqVar_Object ObjVar;
local KFScriptedPawnSpawner PawnStart;
foreach LinkedVariables(class'SeqVar_Object', ObjVar, "KF Scripted Pawn Spawner")
{
PawnStart = KFScriptedPawnSpawner(ObjVar.GetObjectValue());
break;
}
if (PawnStart != none)
{
if (PawnStart.Pawn == P)
{
if (!PawnStart.Pawn.IsAliveAndWell())
{
bAborted = true;
}
PawnStart.LatentActions.RemoveItem(self);
// Removing latent actors is what causes this latent action to end and be deactivated
LatentActors.RemoveItem(PawnStart);
}
}
}
DefaultProperties
{
ObjCategory="Killing Floor"
ObjName="Spawn Scripted Pawn"
InputLinks(0)=(LinkDesc="Start")
VariableLinks(0)=(ExpectedType=class'SeqVar_Object',LinkDesc="KF Scripted Pawn Spawner",PropertyName="",MaxVars=1)
VariableLinks(1)=(ExpectedType=class'SequenceVariable',LinkDesc="Set Initial Health From",PropertyName="",MaxVars=1)
VariableLinks(2)=(ExpectedType=class'SequenceVariable',LinkDesc="Set Maximum Health From",PropertyName="",MaxVars=1)
OutputLinks(0)=(LinkDesc="Finish")
OutputLinks(1)=(LinkDesc="Fail")
bCallHandler=false
bAutoActivateOutputLinks=false
}