//=============================================================================
// KFProj_Bullet_DragonsBreath
//=============================================================================
// Shotgun pellet class for the the Mossberg 500
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================

class KFProj_FlareGun extends KFProj_Bullet
	hidedropdown;

/** Time before particle system parameter is set */
var float FlameDisperalDelay;
/** Last hit normal from Touch() or HitWall() */
var vector LastHitNormal;
/** Residual / splash flame chance */
var float ResidualFlameChance;

/**
 * Spawns any effects needed for the flight of this projectile
 */
simulated function SpawnFlightEffects()
{
	Super.SpawnFlightEffects();

	if ( WorldInfo.NetMode != NM_DedicatedServer && WorldInfo.GetDetailMode() > DM_Low  )
	{
		SetTimer(FlameDisperalDelay, false, nameof(MidFlightFXTimer));
	}
}

simulated function MidFlightFXTimer()
{
	if (ProjEffects!=None)
	{
		ProjEffects.SetFloatParameter('Spread', 1.0);
	}
}

simulated protected function StopFlightEffects()
{
	Super.StopFlightEffects();
	ClearTimer(nameof(MidFlightFXTimer));
}

simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
	LastHitNormal = HitNormal;
	Super.ProcessTouch(Other, HitLocation, HitNormal);
}

/**
 * Explode this Projectile
 */
simulated function TriggerExplosion(Vector HitLocation, Vector HitNormal, Actor HitActor)
{
	LastHitNormal = HitNormal;
	Super.TriggerExplosion(HitLocation, HitNormal, HitActor);
}

/** 
 * Chance of spawning splash flames.  Need to use StopSimulating,
 * because TriggerExplosion() is not always called for this projectile.
 *
 * @note: Normally, we would just do this in TriggerExplosion, but bullets don't call TriggerExplosion
 * when ExplosionTemplate==None.  This is highly odd because code was added to TriggerExplosion() that runs
 * even when ExplosionTemplate==None.  Instead of trying to untangle things... here is a workaround
 */
simulated protected function StopSimulating()
{
	local vector FlameSpawnVel;

	// Can use physics mode as a way of doing this only once
	if ( Role == ROLE_Authority && Physics == PHYS_Falling && FRand() < ResidualFlameChance )
	{
		FlameSpawnVel = 0.25f * CalculateResidualFlameVelocity( LastHitNormal, Normal( Velocity ), VSize( Velocity ) );
		SpawnResidualFlame( class'KFProj_FlareGunSplash', Location + (LastHitNormal * 10.f), FlameSpawnVel );
	}

	Super.StopSimulating();
}

defaultproperties
{
	Physics=PHYS_Falling

	Speed=5000
	MaxSpeed=5000
	TerminalVelocity=5000

	bWarnAIWhenFired=true

	DamageRadius=0
	GravityScale=0.05 //0.35//0.15
	TossZ=0
	FlameDisperalDelay=0.25
	ResidualFlameChance=0.33 

	Begin Object Class=PointLightComponent Name=PointLight0
	    LightColor=(R=250,G=160,B=100,A=255)
		Brightness=1.5f
		Radius=350.f
		FalloffExponent=3.0f
		CastShadows=False
		CastStaticShadows=FALSE
		CastDynamicShadows=False
		bCastPerObjectShadows=false
		bEnabled=true
		LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
	End Object
	ProjFlightLight=PointLight0
	ProjFlightLightPriority=LPP_High

	ImpactEffects=KFImpactEffectInfo'WEP_FlareGun_ARCH.Wep_Flaregun_bullet_impact'
	ProjFlightTemplate=ParticleSystem'WEP_Flaregun_EMIT.FX_Flaregun_Projectile_01'

	bAmbientSoundZedTimeOnly=false
    AmbientSoundPlayEvent=AkEvent'WW_WEP_Flare_Gun.Play_WEP_Flare_Gun_Whistle'
    AmbientSoundStopEvent=AkEvent'WW_WEP_Flare_Gun.Stop_WEP_Flare_Gun_Whistle'
}

