// Written by Marco.
class ExtProj_CrackerGrenade extends KFProj_FragGrenade
	hidedropdown;

var() byte NumCrackers;

simulated function PostBeginPlay()
{
	Super.PostBeginPlay();
	SetTimer(FuseTime+FRand()*0.25, true, 'ExplodeTimer');
}

simulated function ExplodeTimer()
{
	local Actor HitActor;
	local vector HitLocation, HitNormal;

	if (WorldInfo.NetMode!=NM_Client && InstigatorController==none)
	{
		Destroy();
		return;
	}
	GetExplodeEffectLocation(HitLocation, HitNormal, HitActor);
	if (--NumCrackers==0)
		TriggerExplosion(HitLocation, HitNormal, HitActor);
	else SmallExplosion(HitLocation, HitNormal, HitActor);
}

simulated function SmallExplosion(Vector HitLocation, Vector HitNormal, Actor HitActor)
{
	local vector NudgedHitLocation, ExplosionDirection;

	Velocity = VRand()*(900.f*FRand());
	SetPhysics(PHYS_Falling);
	if (ExplosionTemplate != None)
	{
		// using a hitlocation slightly away from the impact point is nice for certain things
		NudgedHitLocation = HitLocation + (HitNormal * 32.f);

		ExplosionActor = Spawn(ExplosionActorClass, self,, NudgedHitLocation, rotator(HitNormal));
		if (ExplosionActor != None)
		{
			ExplosionActor.RemoteRole = ROLE_None;
			ExplosionActor.Instigator = Instigator;
			ExplosionActor.InstigatorController = InstigatorController;

			PrepareExplosionTemplate();

			// If the locations are zero (probably because this exploded in the air) set defaults
			if (IsZero(HitLocation))
				HitLocation = Location;

			if (IsZero(HitNormal))
			{
				HitNormal = vect(0,0,1);
			}

			// these are needed for the decal tracing later in GameExplosionActor.Explode()
			ExplosionTemplate.HitActor = HitActor;
			ExplosionTemplate.HitLocation = HitLocation;// NudgedHitLocation
			ExplosionTemplate.HitNormal = HitNormal;

			// If desired, attach to mover if we hit one
			if (bAttachExplosionToHitMover && InterpActor(HitActor) != None)
			{
				ExplosionActor.Attachee = HitActor;
				ExplosionTemplate.bAttachExplosionEmitterToAttachee = TRUE;
				ExplosionActor.SetBase(HitActor);
			}

			// directional?
			if (ExplosionTemplate.bDirectionalExplosion)
			{
				ExplosionDirection = GetExplosionDirection(HitNormal);
				//DrawDebugLine(ExplosionActor.Location, ExplosionActor.Location+ExplosionDirection*64, 255, 255, 0, TRUE);
			}

			// @todo: make this function responsible for setting explosion instance parameters, and take instance parameters
			// out of GearExplosion (e.g. Attachee)
			PrepareExplosionActor(ExplosionActor);

			ExplosionActor.Explode(ExplosionTemplate, ExplosionDirection);		// go bewm
		}
	}
}

simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
}

simulated function Explode(vector HitLocation, vector HitNormal);

defaultproperties
{
	bCanDisintegrate=false
	FuseTime=0.35
	NumCrackers=6
	bNetTemporary=true
}