class ScrnRPGFire extends LAWFire;

var     bool        bFiringLastRound;
var name FireLastAnim;

function DoFireEffect()
{
    local Vector StartProj, HitLocation, HitNormal, StartTrace, X,Y,Z;
    local Rotator R, Aim;
    local Actor Other;
    local int p, SpawnCount;

	Instigator.MakeNoise(1.0);
	Weapon.GetViewAxes(X,Y,Z);

	StartTrace = Instigator.Location + Instigator.EyePosition();
	StartProj = StartTrace + X*ProjSpawnOffset.X;
	if ( !Weapon.WeaponCentered() && !KFWeap.bAimingRifle )
		StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y + Z*ProjSpawnOffset.Z;
	Other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false);
	
	if (Other != None)
	{
		StartProj = HitLocation;
	}

	Aim = AdjustAim(StartProj, AimError);

	Aim.Pitch += 250;
    
	SpawnCount = Max(1, ProjPerFire * int(Load));

    switch (SpreadStyle)
    {
    case SS_Random:
        X = Vector(Aim);
        for (p = 0; p < SpawnCount; p++)
        {
            R.Yaw = Spread * (FRand()-0.5);
            R.Pitch = Spread * (FRand()-0.5);
            R.Roll = Spread * (FRand()-0.5);
			SpawnProjectile(StartProj, Rotator(X >> R));
        }
        break;
    }

	if (Instigator != none )
	{
		if( Instigator.Physics != PHYS_Falling  )
		{
			Instigator.AddVelocity(KickMomentum >> Instigator.GetViewRotation());
		}
		else if( Instigator.Physics == PHYS_Falling
			&& Instigator.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z)
		{
			Instigator.AddVelocity((KickMomentum * LowGravKickMomentumScale) >> Instigator.GetViewRotation());
		}
	}
}

function ModeDoFire()
{
	bFiringLastRound = Weapon.AmmoAmount(0) <= AmmoPerFire;
    super.ModeDoFire();
}

function ServerPlayFiring()
{
	Super(KFShotgunFire).ServerPlayFiring();
    if (bFiringLastRound)
    {
        Weapon.PlayAnim(FireLastAnim, FireAnimRate, TweenTime);
    } 
}

function PlayFiring()
{
	Super(KFShotgunFire).PlayFiring();
    if (bFiringLastRound)
    {
        Weapon.PlayAnim(FireLastAnim, FireAnimRate, TweenTime);
    }     
    if ( ScrnRPG(Weapon) != none)
    {
        ScrnRPG(Weapon).HideRocket();
    }
}

defaultproperties
{
     FireLastAnim="Fire"
     maxVerticalRecoilAngle=200
     maxHorizontalRecoilAngle=200
     FireSoundRef="ScrnWeaponPack_SND.ScrnRPG7.fire_m"
     StereoFireSoundRef="ScrnWeaponPack_SND.ScrnRPG7.fire_s"
     FireAnimRate=0.940000
     ReloadAnimRate=0.940000
     AmmoClass=Class'ScrnWeaponPack.ScrnRPGAmmo'
     ShakeRotTime=1.000000
     ShakeOffsetMag=(X=0.000000,Y=0.000000,Z=0.000000)
     ProjectileClass=Class'ScrnWeaponPack.ScrnRPGProj'
     FlashEmitterClass=Class'ScrnWeaponPack.ScrnRPGMuzzleFlash'
}
