//=============================================================================
// KFSeqAct_ShowPath
//=============================================================================
// Action that creates a trail path to any actor.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2016 Tripwire Interactive LLC
//=============================================================================
class KFSeqAct_ShowPath extends SequenceAction;

enum eVolumeCheckType
{
	VCT_None,
	VCT_InVolume,
	VCT_NotInVolume
};

var transient bool bPathActive;
var transient KFReplicatedShowPathActor ReplicatedPathActor;

/**
 * Leave at VCT_None to always show the path to all human players.
 * If this is set to VCT_InVolume, it will only show the path to players inside the linked volume.
 * If this is set to VCT_NotInVolume, it will only show the path to players NOT in the linked volume.
 */
var() eVolumeCheckType VolumeCheckType;

/** Team number to display path to. 0 = Survivors, 255 = Zeds */
var() byte TeamToDisplayPathTo;

var() ParticleSystem TrailParticleSystem;

event Activated()
{
	local SeqVar_Object ObjVar;
	local Actor Target;
	local Volume Volume;

	// Check for a start/stop
	if( InputLinks[0].bHasImpulse )
	{
		bPathActive = true;
	}
	else if( InputLinks[1].bHasImpulse )
	{
		bPathActive = false;
		if( ReplicatedPathActor != none && !ReplicatedPathActor.bDeleteMe )
		{
			ReplicatedPathActor.Destroy();
		}
		ReplicatedPathActor = none;
	}

	if( bPathActive )
	{
		// Grab our destination actor
		foreach LinkedVariables( class'SeqVar_Object', ObjVar, "Destination Actor" )
		{
			Target = Actor( ObjVar.GetObjectValue() );
			break;
		}

		// Sanity check
		if( Target == none )
		{
			bPathActive = false;
			return;
		}

		// Grab our destination actor
		if( VolumeCheckType != VCT_None )
		{
			foreach LinkedVariables( class'SeqVar_Object', ObjVar, "Volume" )
			{
				Volume = Volume( ObjVar.GetObjectValue() );
				break;
			}
		}

		// Spawn our replicated actor and set its target
		ReplicatedPathActor = class'WorldInfo'.static.GetWorldInfo().Spawn( class'KFReplicatedShowPathActor', none );
		if( ReplicatedPathActor != none )
		{
			if (TrailParticleSystem != none)
			{
				ReplicatedPathActor.SetEmitterTemplate(TrailParticleSystem);
			}
			ReplicatedPathActor.SetPathTarget( Target, Volume, (VolumeCheckType != VCT_None && Volume == none) ? VCT_None : VolumeCheckType, TeamToDisplayPathTo );
		}
		else
		{
			bPathActive = false;
		}
	}
}

defaultproperties
{
	ObjCategory="Killing Floor"
	ObjName="Display Path To Actor"

	InputLinks(0)=(LinkDesc="Start")
	InputLinks(1)=(LinkDesc="Stop")
	VariableLinks.Empty()
	VariableLinks(0)=(ExpectedType=class'SeqVar_Object',LinkDesc="Destination Actor",MaxVars=1)
	VariableLinks(1)=(ExpectedType=class'SeqVar_Object',LinkDesc="Volume",MaxVars=1)

	VolumeCheckType=VCT_None
	TeamToDisplayPathTo=0
	bCallHandler=false
}