class BoltRifle expands NaliWeapons;

//1st person
#exec MESH IMPORT MESH=BoltRifle ANIVFILE=MODELS\BoltRifle_a.3d DATAFILE=MODELS\BoltRifle_d.3d X=0 Y=0 Z=0
#exec MESH LODPARAMS MESH=BoltRifle STRENGTH=0
#exec MESH ORIGIN MESH=BoltRifle X=0 Y=0 Z=0 YAW=128

//1st person special overlayer
#exec MESH IMPORT MESH=BoltRifleOV ANIVFILE=MODELS\BoltRifleOV_a.3d DATAFILE=MODELS\BoltRifleOV_d.3d X=0 Y=0 Z=0
#exec MESH LODPARAMS MESH=BoltRifleOV STRENGTH=0
#exec MESH ORIGIN MESH=BoltRifleOV X=0 Y=0 Z=0 YAW=128

//1st person right handed
#exec MESH IMPORT MESH=BoltRifleR ANIVFILE=MODELS\BoltRifle_a.3d DATAFILE=MODELS\BoltRifle_d.3d X=0 Y=0 Z=0 UNMIRROR=1
#exec MESH LODPARAMS MESH=BoltRifleR STRENGTH=0
#exec MESH ORIGIN MESH=BoltRifleR X=0 Y=0 Z=0

//1st person right handed special overlayer
#exec MESH IMPORT MESH=BoltRifleROV ANIVFILE=MODELS\BoltRifleOV_a.3d DATAFILE=MODELS\BoltRifleOV_d.3d X=0 Y=0 Z=0 UNMIRROR=1
#exec MESH LODPARAMS MESH=BoltRifleROV STRENGTH=0
#exec MESH ORIGIN MESH=BoltRifleROV X=0 Y=0 Z=0

//Pickup
#exec MESH IMPORT MESH=BoltRiflePick ANIVFILE=MODELS\BoltRifle_a.3d DATAFILE=MODELS\BoltRifle_d.3d X=0 Y=0 Z=0
//#exec MESH LODPARAMS MESH=BoltRiflePick STRENGTH=0
#exec MESH ORIGIN MESH=BoltRiflePick X=-304 Y=0 Z=0 YAW=128

//3rd person
#exec MESH IMPORT MESH=BoltRifleM ANIVFILE=MODELS\BoltRifle_a.3d DATAFILE=MODELS\BoltRifle_d.3d X=0 Y=0 Z=0
#exec MESH LODPARAMS MESH=BoltRifleM STRENGTH=0
#exec MESH ORIGIN MESH=BoltRifleM X=0 Y=0 Z=-18 YAW=128

//-----------------------------------------------------------------------------------

//Animations
#exec MESH SEQUENCE MESH=BoltRifle SEQ=All STARTFRAME=0 NUMFRAMES=27
#exec MESH SEQUENCE MESH=BoltRifle SEQ=Still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=BoltRifle SEQ=Fire STARTFRAME=0 NUMFRAMES=3 RATE=1.0
#exec MESH SEQUENCE MESH=BoltRifle SEQ=AltFire STARTFRAME=2 NUMFRAMES=16 RATE=5.3
#exec MESH SEQUENCE MESH=BoltRifle SEQ=Select STARTFRAME=18 NUMFRAMES=5 RATE=8.0 GROUP=Select
#exec MESH SEQUENCE MESH=BoltRifle SEQ=Down STARTFRAME=22 NUMFRAMES=5 RATE=16.0

#exec MESH SEQUENCE MESH=BoltRifleOV SEQ=All STARTFRAME=0 NUMFRAMES=27
#exec MESH SEQUENCE MESH=BoltRifleOV SEQ=Still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=BoltRifleOV SEQ=Fire STARTFRAME=0 NUMFRAMES=3 RATE=1.0
#exec MESH SEQUENCE MESH=BoltRifleOV SEQ=AltFire STARTFRAME=2 NUMFRAMES=16 RATE=5.3
#exec MESH SEQUENCE MESH=BoltRifleOV SEQ=Select STARTFRAME=18 NUMFRAMES=5 RATE=8.0 GROUP=Select
#exec MESH SEQUENCE MESH=BoltRifleOV SEQ=Down STARTFRAME=22 NUMFRAMES=5 RATE=16.0

#exec MESH SEQUENCE MESH=BoltRifleR SEQ=All STARTFRAME=0 NUMFRAMES=27
#exec MESH SEQUENCE MESH=BoltRifleR SEQ=Still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=BoltRifleR SEQ=Fire STARTFRAME=0 NUMFRAMES=3 RATE=1.0
#exec MESH SEQUENCE MESH=BoltRifleR SEQ=AltFire STARTFRAME=2 NUMFRAMES=16 RATE=5.3
#exec MESH SEQUENCE MESH=BoltRifleR SEQ=Select STARTFRAME=18 NUMFRAMES=5 RATE=8.0 GROUP=Select
#exec MESH SEQUENCE MESH=BoltRifleR SEQ=Down STARTFRAME=22 NUMFRAMES=5 RATE=16.0

#exec MESH SEQUENCE MESH=BoltRifleROV SEQ=All STARTFRAME=0 NUMFRAMES=27
#exec MESH SEQUENCE MESH=BoltRifleROV SEQ=Still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=BoltRifleROV SEQ=Fire STARTFRAME=0 NUMFRAMES=3 RATE=1.0
#exec MESH SEQUENCE MESH=BoltRifleROV SEQ=AltFire STARTFRAME=2 NUMFRAMES=16 RATE=5.3
#exec MESH SEQUENCE MESH=BoltRifleROV SEQ=Select STARTFRAME=18 NUMFRAMES=5 RATE=8.0 GROUP=Select
#exec MESH SEQUENCE MESH=BoltRifleROV SEQ=Down STARTFRAME=22 NUMFRAMES=5 RATE=16.0

#exec MESH SEQUENCE MESH=BoltRiflePick SEQ=Still STARTFRAME=0 NUMFRAMES=1

#exec MESH SEQUENCE MESH=BoltRifleM SEQ=Still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=BoltRifleM SEQ=Fire STARTFRAME=0 NUMFRAMES=3 RATE=1.0
#exec MESH SEQUENCE MESH=BoltRifleM SEQ=AltFire STARTFRAME=2 NUMFRAMES=16 RATE=5.3

//-----------------------------------------------------------------------------------

//Scale
#exec MESHMAP NEW MESHMAP=BoltRifle MESH=BoltRifle
#exec MESHMAP SCALE MESHMAP=BoltRifle X=0.1088 Y=0.1088 Z=0.2176

#exec MESHMAP NEW MESHMAP=BoltRifleR MESH=BoltRifleR
#exec MESHMAP SCALE MESHMAP=BoltRifleR X=0.1088 Y=0.1088 Z=0.2176

#exec MESHMAP NEW MESHMAP=BoltRifleOV MESH=BoltRifle
#exec MESHMAP SCALE MESHMAP=BoltRifleOV X=0.1088 Y=0.1088 Z=0.2176

#exec MESHMAP NEW MESHMAP=BoltRifleROV MESH=BoltRifleR
#exec MESHMAP SCALE MESHMAP=BoltRifleROV X=0.1088 Y=0.1088 Z=0.2176

#exec MESHMAP NEW MESHMAP=BoltRiflePick MESH=BoltRiflePick
#exec MESHMAP SCALE MESHMAP=BoltRiflePick X=0.1088 Y=0.1088 Z=0.2176

#exec MESHMAP NEW MESHMAP=BoltRifleM MESH=BoltRifleM
#exec MESHMAP SCALE MESHMAP=BoltRifleM X=0.1088 Y=0.1088 Z=0.2176

//-----------------------------------------------------------------------------------

//Skins
#exec TEXTURE IMPORT NAME=Sk_BoltR_01 FILE=SKINS\Sk_BoltR_01.bmp GROUP=Skins FLAGS=2 LODSET=2
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=1 TEXTURE=Sk_BoltR_01
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=1 TEXTURE=Sk_BoltR_01
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=1 TEXTURE=Sk_BoltR_01
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=1 TEXTURE=Sk_BoltR_01

#exec TEXTURE IMPORT NAME=Sk_BoltR_02 FILE=SKINS\Sk_BoltR_02.bmp GROUP=Skins FLAGS=2 LODSET=2
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=2 TEXTURE=Sk_BoltR_02
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=2 TEXTURE=Sk_BoltR_02
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=2 TEXTURE=Sk_BoltR_02
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=2 TEXTURE=Sk_BoltR_02

#exec TEXTURE IMPORT NAME=Sk_BoltR_03 FILE=SKINS\Sk_BoltR_03.bmp GROUP=Skins FLAGS=2 LODSET=2
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=3 TEXTURE=Sk_BoltR_03
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=3 TEXTURE=Sk_BoltR_03
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=3 TEXTURE=Sk_BoltR_03
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=3 TEXTURE=Sk_BoltR_03

#exec TEXTURE IMPORT NAME=Sk_BoltR_04 FILE=SKINS\Sk_BoltR_04.bmp GROUP=Skins FLAGS=2 LODSET=2
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=4 TEXTURE=Sk_BoltR_04
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=4 TEXTURE=Sk_BoltR_04
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=4 TEXTURE=Sk_BoltR_04
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=4 TEXTURE=Sk_BoltR_04

#exec TEXTURE IMPORT NAME=Sk_BoltR_05 FILE=SKINS\Sk_BoltR_05.bmp GROUP=Skins FLAGS=2 LODSET=2
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=5 TEXTURE=Sk_BoltR_05
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=5 TEXTURE=Sk_BoltR_05
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=5 TEXTURE=Sk_BoltR_05
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=5 TEXTURE=Sk_BoltR_05

#exec OBJ LOAD FILE=Textures\NaliEffects.utx PACKAGE=NaliWeaponsII.GFX

#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=6 TEXTURE=Electric01
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=6 TEXTURE=Electric01
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=6 TEXTURE=Electric01
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=6 TEXTURE=Electric01

#exec MESHMAP SETTEXTURE MESHMAP=BoltRifle NUM=7 TEXTURE=Electric02
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleR NUM=7 TEXTURE=Electric02
#exec MESHMAP SETTEXTURE MESHMAP=BoltRiflePick NUM=7 TEXTURE=Electric02
#exec MESHMAP SETTEXTURE MESHMAP=BoltRifleM NUM=7 TEXTURE=Electric02

//--------------------------------------------------------------

//Icons
#exec TEXTURE IMPORT NAME=BoltRIcon FILE=ICONS\BoltRIcon.bmp GROUP=Icons MIPS=OFF

#exec OBJ LOAD FILE=Textures\NaliIcons.utx PACKAGE=NaliWeaponsII.Icons

//-----------------------------------------------------------------------------------

//Sounds
#exec AUDIO IMPORT NAME="BoltRAltFire" FILE=SOUNDS\BoltRAltFire.wav GROUP="BoltR"
#exec AUDIO IMPORT NAME="BoltRSelect" FILE=SOUNDS\BoltRSelect.wav GROUP="BoltR"
#exec AUDIO IMPORT NAME="BoltRFire" FILE=SOUNDS\BoltRFire.wav GROUP="BoltR"
#exec AUDIO IMPORT NAME="BoltRPickup" FILE=SOUNDS\BoltRPickup.wav GROUP="BoltR"
#exec AUDIO IMPORT NAME="BoltRHitSound" FILE=SOUNDS\BoltRHitSound.wav GROUP="BoltR"

#exec OBJ LOAD FILE=..\Sounds\AmbOutside.uax


var() name RandSequence[5];
var(Weapon) vector HitScanOffset;


function PreBeginPlay()
{
	Super.PreBeginPlay();
	if ((Level.Game.IsA('MonsterHunt') && Class'NWMutator'.Default.EnableMonsterHuntMode && Class'NWMutator'.Default.MonsterHuntOnly) || (Class'NWMutator'.Default.EnableMonsterHuntMode && !Class'NWMutator'.Default.MonsterHuntOnly))
	{
		PickupAmmoCount *= Class'NWMutator'.default.ammo_BoltR;
	}
}


function setHand(float Hand)
{
	Super.SetHand(Hand);
	if ( Hand == 1 )
		Mesh = mesh'BoltRifle';
	else
		Mesh = mesh'BoltRifleR';
}


function Fire( float Value )
{
    if ( (AmmoType == None) && (AmmoName != None) )
    {
        // ammocheck
        GiveAmmo(Pawn(Owner));
    }

    if (bInfinity)
    {
	GotoState('NormalFire');
        bPointing=True;
        bCanClientFire = true;
        ClientFire(Value);
        if ( bRapidFire || (FiringSpeed > 0) )
            Pawn(Owner).PlayRecoil(FiringSpeed);

	TraceFire(0.1);
    }
    else if ( AmmoType.UseAmmo(1) )
    {
        GotoState('NormalFire');
        bPointing=True;
        bCanClientFire = true;
        ClientFire(Value);
        if ( bRapidFire || (FiringSpeed > 0) )
            Pawn(Owner).PlayRecoil(FiringSpeed);

        TraceFire(0.1);
    }
}


simulated function PlayFiring()
{

	PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0);
	PlayAnim('Fire', FireRateChange * 6.0, 0.0);
	MultiSkins[7] = Texture'TranslucentInvisible';
}


function AltFire( float Value )
{
local Projectile pj;

    if ( (AmmoType == None) && (AmmoName != None) )
    {
        // ammocheck
        GiveAmmo(Pawn(Owner));
    }

    if (bInfinity)
    {
	GotoState('AltFiring');
        bPointing=True;
        bCanClientFire = true;
        ClientAltFire(Value);

        if ( bRapidFire || (FiringSpeed > 0) )
            Pawn(Owner).PlayRecoil(FiringSpeed);

        pj = ProjectileFire(AltProjectileClass, AltProjectileSpeed, bAltWarnTarget);
	MultiSkins[7] = Texture'TranslucentInvisible';
	
	if (pj.IsA('BoltEMPProj'))
	{
		BoltEMPProj(pj).Kickback = Kickback;
		BoltEMPProj(pj).MoreDamage = MoreDamage;
		BoltEMPProj(pj).HealthGiver = HealthGiver;
		BoltEMPProj(pj).Splasher = Splasher;
	}
		
    }	
    else if (AmmoType.UseAmmo(1))
    {
        GotoState('AltFiring');
        bPointing=True;
        bCanClientFire = true;
        ClientAltFire(Value);

        if ( bRapidFire || (FiringSpeed > 0) )
            Pawn(Owner).PlayRecoil(FiringSpeed);

	pj = ProjectileFire(AltProjectileClass, AltProjectileSpeed, bAltWarnTarget);
	MultiSkins[7] = Texture'TranslucentInvisible';

        if (pj.IsA('BoltEMPProj'))
	{
		BoltEMPProj(pj).Kickback = Kickback;
		BoltEMPProj(pj).MoreDamage = MoreDamage;
		BoltEMPProj(pj).HealthGiver = HealthGiver;
		BoltEMPProj(pj).Splasher = Splasher;
	}
    }
}


simulated function PlayAltFiring()
{

	PlayOwnedSound(AltFireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0);
	PlayAnim('AltFire', FireRateChange * 3.0, 0.0);
}


simulated function TraceFire( float Accuracy )
{
	local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z;
	local actor Other;
	local Pawn PawnOwner, P;
	local Vector DVector, LocPoint;
    	local int NumPoints, NumI, u;
	local BoltTrace Bdc;
	local BoltFlareEnd b;

	PawnOwner = Pawn(Owner);

	Owner.MakeNoise(PawnOwner.SoundDampening);
	GetAxes(PawnOwner.ViewRotation,X,Y,Z);
	StartTrace = PawnOwner.Location + CalcDrawOffset() + HitScanOffset.X * X + HitScanOffset.Y * Y + HitScanOffset.Z * Z;  
	AdjustedAim = PawnOwner.AdjustAim(1000000, StartTrace, 2*AimError, False, False);	
	X = vector(AdjustedAim);
	EndTrace = StartTrace + 30000 * X; 
	Other = PawnOwner.TraceShot(HitLocation,HitNormal,EndTrace,StartTrace);

	if (Other == None)
		HitLocation = EndTrace;

	//Bolt Effect -------------------------------------

	Spawn(class'BoltFlare',,, StartTrace + 64*X);

	DVector = HitLocation - StartTrace;
     	NumPoints = Int(VSize(DVector)/512.0);

	for (NumI = 0; NumI < NumPoints + 1; NumI++)
	{
		For(u=0; u<3; u++)
		{
			LocPoint = StartTrace + ((256 + 512 * NumI) * X);
					
			Bdc = Spawn(class'BoltTrace',,, LocPoint, rotator(HitLocation - StartTrace));
			Bdc.AnimSequence = RandSequence[Rand(4)];

			If (NumI == 0)
				Bdc.MultiSkins[1]=Texture'ElecBoltStart';
			else if (NumI == NumPoints || Bdc.Region.Zone.bWaterZone)
				Bdc.MultiSkins[1] = Texture'ElecBoltEnd';
		}

		if (Bdc.Region.Zone.bWaterZone)
		{
			Bdc.MultiSkins[1] = Texture'ElecBoltEnd';
			HitLocation = Bdc.Location;
			break;
		}
	}

	
	b = Spawn(class'BoltFlareEnd',,, HitLocation+HitNormal, Rotator(HitNormal));
	b.Splasher = Splasher;
	b.HealthGiver = HealthGiver;
	b.MoreDamage = MoreDamage;

	//-------------------------------------------------

	ProcessTraceHit(Other, HitLocation, HitNormal, X,Y,Z);
}


function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z)
{

	if( BoltEMPProj(Other) != None)
		BoltEMPProj(Other).Combo();

	else if ( (Other != self) && (Other != Owner) && (Other != None) ) 
	{
		if ( Other.bIsPawn )
		{
			Other.PlaySound(Sound 'ChunkHit',, 4.0,,100);
		}

		
		if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) 
			&& (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) )
		{
			
			if (HealthGiver && (Pawn(Other).PlayerReplicationInfo.Team == Instigator.PlayerReplicationInfo.Team && Level.Game.IsA('TeamGamePlus') && !Level.Game.IsA('MonsterHunt')) ||
		(Level.Game.IsA('MonsterHunt') && !Pawn(Other).IsA('ScriptedPawn')) && Pawn(Other).Health < 10000)
			{
				Pawn(Other).Health += 100 * FMax(1.0,MoreDamage);
					if (Pawn(Other).Health > 10000)
						Pawn(Other).Health = 10000;
			}

			Other.TakeDamage(100 * FMax(1.0,MoreDamage), Pawn(Owner), HitLocation, 35000 * X + (MirrorVectorByNormal(HitNormal, HitNormal) * (KickBack * 1000 + 1)), 'Decapitated');
		}
		else
		{
		
			if (HealthGiver &&  Other.bIsPawn)
			{
				if ((Pawn(Other).PlayerReplicationInfo.Team == Instigator.PlayerReplicationInfo.Team && Level.Game.IsA('TeamGamePlus') && !Level.Game.IsA('MonsterHunt')) ||
		(Level.Game.IsA('MonsterHunt') && !Pawn(Other).IsA('ScriptedPawn')) && Pawn(Other).Health < 10000)
				{
					Pawn(Other).Health += 35 * FMax(1.0,MoreDamage);
						if (Pawn(Other).Health > 10000)
							Pawn(Other).Health = 10000;
				}
			}

			Other.TakeDamage(35 * FMax(1.0,MoreDamage),  Pawn(Owner), HitLocation, 30000.0 * X + (MirrorVectorByNormal(HitNormal, HitNormal) * (KickBack * 1000 + 1)), MyDamageType);	
		}
		if ( !Other.bIsPawn && !Other.IsA('Carcass') )
			spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9);
	}
}


simulated function Timer()
{
	if (!bCanClientFire)
	{
		bCanClientFire = True;
		if ( Pawn(Owner).bFire != 0 )
            Global.ClientFire(0);
        else if ( Pawn(Owner).bAltFire != 0 )
            Global.ClientAltFire(0);
	}

	MultiSkins[7] = None;
}


function DropFrom(vector StartLocation)
{
	Super.DropFrom(StartLocation);
	MultiSkins[7] = None;
}

function float RateSelf( out int bUseAltMode )
{
	local float EnemyDist, Rating;
	local bool bRetreating;
	local vector EnemyDir;
	local Pawn P;

	P = Pawn(Owner);

	//No enemy, no need to fire
	if ( P.Enemy == None )
        	return AIRating;

	//Don't recommend self if out of ammo or if owner is inside water
	if ( AmmoType.AmmoAmount <=0 || P.Region.Zone.bWaterZone)
        	return -2;

	EnemyDir = P.Enemy.Location - Owner.Location; 
	EnemyDist = VSize(EnemyDir);

	//Don't recommend second mode if too close
	if (EnemyDist < 360)
		bUseAltMode = 0;
	else
		bUseAltMode = int(FRand() + 0.5);

	//If enemy is on water, use this weapon on its full glory :D
	if (P.Enemy.Region.Zone.bWaterZone)
	{
		bUseAltMode = 0;
		return 3.0;
	}

	return (AIRating + FRand() * 0.05);
}


/////////////////////////////////////////////////////////////////////////////////////////

state NormalFire
{

	function AnimEnd()
    	{
		MultiSkins[7] = None;
		bCanClientFire = False;
		SetTimer(0.5 / FireRateChange, False);
	}

	simulated function Timer()
	{
		bCanClientFire = True;
		MultiSkins[7] = None;
		Finish();
	}
}

state ClientFiring
{
    simulated function AnimEnd()
    {
	SetTimer(0.5 / FireRateChange, False);
	bCanClientFire = False;

	Super.AnimEnd();
    }
}


state AltFiring
{

	function AnimEnd()
    	{
		MultiSkins[7] = None;
		Super.AnimEnd();
	}
}



defaultproperties
{
	bSpecialOverlayer=True
	SpecialOvMeshR=BoltRifleROV
	SpecialOvMeshL=BoltRifleOV
	DrawType=DT_Mesh
	Mesh=BoltRiflePick
	CollisionHeight=15.000000
	CollisionRadius=20.000000
	AutoSwitchPriority=4
	Icon=BoltRIcon
	InventoryGroup=4
	ItemArticle="a"
	ItemName="Bolt Rifle"
	MaxDesireability=0.500000
	PickupMessage="You got the Bolt Rifle."
	PickupSound=BoltRPickup
	PickupViewMesh=BoltRiflePick
	PickupViewScale=1.000000
	PlayerViewMesh=BoltRifleR
	PlayerViewOffset=(X=5.000000,Y=-16.000000,Z=-14.000000)
	PlayerViewScale=1.000000
	RespawnTime=30.000000
	StatusIcon=BoltRIcon
	ThirdPersonMesh=BoltRifleM
	ThirdPersonScale=0.600000
	AltDamageType=Electrified
	AltFireSound=BoltRAltFire
	AltProjectileClass=BoltEMPProj
	bInstantHit=True
	AmmoName=BoltAmmo
	bRapidFire=True
	DeathMessage="%o was electrified by %k's %w."
	FireOffset=(X=5.000000,Y=4.000000,Z=0.000000)
	HitScanOffset=(X=-25.000000,Y=-5.000000,Z=4.000000)
	FireSound=BoltRFire
	FiringSpeed=1.000000
	MaxTargetRange=4096.000000
	MyDamageType=Electrified
	NameColor=(R=0,G=0,B=255)
	PickupAmmoCount=16
	ProjectileClass=None
	SelectSound=BoltRSelect
	shakemag=750.000000
	shaketime=0.200000
	shakevert=15.000000
	AIRating=0.400000
	AltRefireRate=1.000000
	bAltWarnTarget=True
	bRecommendAltSplashDamage=True
	bRecommendSplashDamage=False
	bSplashDamage=False
	bWarnTarget=False
	RefireRate=1.200000
	Mass=50.000000
	bNoSmooth=False
	bOwnsCrossHair=True
	CustomCross=BoltRCross
	CrossHairSize=64
	LightBrightness=100
	LightHue=168
	LightSaturation=68
	LightEffect=LE_FireWaver
	LightRadius=4
	LightType=LT_Steady
	RandSequence(0)="LightEnd01"
	RandSequence(1)="LightEnd02"
	RandSequence(2)="LightEnd03"
	RandSequence(3)="LightEnd04"
	RandSequence(4)="LightEnd05"
}
