Botpack
Class Minigun2

source: e:\games\UnrealTournament\Botpack\Classes\minigun2.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Inventory
         |
         +--Engine.Weapon
            |
            +--Botpack.TournamentWeapon
               |
               +--Botpack.Minigun2
Direct Known Subclasses:None

class Minigun2
extends Botpack.TournamentWeapon

//============================================================================= // Minigun. //=============================================================================
Variables
 int Count
 ShotAccuracy, LastShellSpawn
 Texture MuzzleFlashVariations[10]
 bOutOfAmmo, bFiredShot

States
Idle, AltFiring, ClientAltFiring, ClientFinish, ClientFiring, NormalFire, FinishFire

Function Summary
 void AltFire(float Value)
 void Fire(float Value)
 void GenerateBullet()
 
simulated
PlayAltFiring()
 
simulated
PlayFiring()
 
simulated
PlayUnwind()
 void ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z)
 float RateSelf(out int)
 void TraceFire(float Accuracy)
 void setHand(float Hand)
     
// set which hand is holding weapon


State Idle Function Summary


State AltFiring Function Summary
 void EndState()
 void BeginState()
 void AnimEnd()
 void Tick(float DeltaTime)


State ClientAltFiring Function Summary


State ClientFinish Function Summary
 bool ClientAltFire(float Value)
 bool ClientFire(float Value)


State ClientFiring Function Summary


State NormalFire Function Summary
 void EndState()
 void BeginState()
 void AnimEnd()
 void Tick(float DeltaTime)


State FinishFire Function Summary
 void BeginState()
 void ForceAltFire()
 void ForceFire()
 void AltFire(float F)
 void Fire(float F)



Source Code


00001	//=============================================================================
00002	// Minigun.
00003	//=============================================================================
00004	class Minigun2 extends TournamentWeapon;
00005	
00006	#exec MESH IMPORT MESH=Minigun2m ANIVFILE=MODELS\minigun_a.3D DATAFILE=MODELS\minigun_d.3D X=0 Y=0 Z=0
00007	#exec MESH ORIGIN MESH=Minigun2m X=0 Y=0 Z=0 YAW=64 PITCH=0 ROLL=0
00008	#exec MESH SEQUENCE MESH=Minigun2m SEQ=All     STARTFRAME=0   NUMFRAMES=152
00009	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Select  STARTFRAME=0   NUMFRAMES=20 RATE=36 GROUP=Select
00010	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Still   STARTFRAME=21  NUMFRAMES=1
00011	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Wind    STARTFRAME=21  NUMFRAMES=19
00012	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Wind2   STARTFRAME=40  NUMFRAMES=19
00013	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Shoot1  STARTFRAME=61  NUMFRAMES=19
00014	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Shoot2  STARTFRAME=61  NUMFRAMES=19
00015	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Unwind  STARTFRAME=80  NUMFRAMES=39
00016	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Idle    STARTFRAME=121  NUMFRAMES=19
00017	#exec MESH SEQUENCE MESH=Minigun2m SEQ=Down    STARTFRAME=141  NUMFRAMES=10
00018	
00019	#exec OBJ LOAD FILE=Textures\Ammocount.utx  PACKAGE=Botpack.Ammocount
00020	#exec TEXTURE IMPORT NAME=Mini_t FILE=MODELS\Mini.PCX GROUP="Skins" LODSET=2
00021	#exec TEXTURE IMPORT NAME=Mini_t1 FILE=MODELS\Mini1.PCX GROUP="Skins" LODSET=2
00022	#exec TEXTURE IMPORT NAME=Mini_t2 FILE=MODELS\Mini2.PCX GROUP="Skins" LODSET=2
00023	#exec TEXTURE IMPORT NAME=Mini_t3 FILE=MODELS\Mini3.PCX GROUP="Skins" LODSET=2
00024	#exec TEXTURE IMPORT NAME=Mini_t4 FILE=MODELS\Mini4.PCX GROUP="Skins" LODSET=2
00025	
00026	#exec MESHMAP SCALE MESHMAP=Minigun2m X=0.0035 Y=0.0017 Z=0.007
00027	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2m NUM=0 TEXTURE=Mini_t1
00028	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2m NUM=1 TEXTURE=Mini_t2
00029	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2m NUM=2 TEXTURE=Mini_t3
00030	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2m NUM=3 TEXTURE=Mini_t4
00031	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2m NUM=4 TEXTURE=Botpack.Ammocount.MiniAmmoled
00032	
00033	#exec MESH IMPORT MESH=Minigun2L ANIVFILE=MODELS\minigun_a.3D DATAFILE=MODELS\minigun_d.3D UnMirror=1  unmirrortex=4
00034	#exec MESH ORIGIN MESH=Minigun2L X=0 Y=0 Z=0 YAW=64 PITCH=0 ROLL=0
00035	#exec MESH SEQUENCE MESH=Minigun2L SEQ=All     STARTFRAME=0   NUMFRAMES=152
00036	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Select  STARTFRAME=0   NUMFRAMES=20 RATE=36 GROUP=Select
00037	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Still   STARTFRAME=21  NUMFRAMES=1
00038	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Wind    STARTFRAME=21  NUMFRAMES=19
00039	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Wind2   STARTFRAME=40  NUMFRAMES=19
00040	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Shoot1  STARTFRAME=61  NUMFRAMES=19
00041	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Shoot2  STARTFRAME=61  NUMFRAMES=19
00042	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Unwind  STARTFRAME=80  NUMFRAMES=39
00043	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Idle    STARTFRAME=121  NUMFRAMES=19
00044	#exec MESH SEQUENCE MESH=Minigun2L SEQ=Down    STARTFRAME=141  NUMFRAMES=10
00045	
00046	#exec MESHMAP SCALE MESHMAP=Minigun2L X=0.0035 Y=0.0017 Z=0.007
00047	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2L NUM=0 TEXTURE=Mini_t1
00048	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2L NUM=1 TEXTURE=Mini_t2
00049	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2L NUM=2 TEXTURE=Mini_t3
00050	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2L NUM=3 TEXTURE=Mini_t4
00051	#exec MESHMAP SETTEXTURE MESHMAP=Minigun2L NUM=4 TEXTURE=Botpack.Ammocount.MiniAmmoled
00052	
00053	#exec TEXTURE IMPORT NAME=Muz1 FILE=MODELS\muz1.PCX GROUP="Skins" LODSET=2
00054	#exec TEXTURE IMPORT NAME=Muz2 FILE=MODELS\muz2.PCX GROUP="Skins" LODSET=2
00055	#exec TEXTURE IMPORT NAME=Muz3 FILE=MODELS\muz3.PCX GROUP="Skins" LODSET=2
00056	#exec TEXTURE IMPORT NAME=Muz4 FILE=MODELS\muz4.PCX GROUP="Skins" LODSET=2
00057	#exec TEXTURE IMPORT NAME=Muz5 FILE=MODELS\muz5.PCX GROUP="Skins" LODSET=2
00058	#exec TEXTURE IMPORT NAME=Muz6 FILE=MODELS\muz6.PCX GROUP="Skins" LODSET=2
00059	#exec TEXTURE IMPORT NAME=Muz7 FILE=MODELS\muz7.PCX GROUP="Skins" LODSET=2
00060	#exec TEXTURE IMPORT NAME=Muz8 FILE=MODELS\muz8.PCX GROUP="Skins" LODSET=2
00061	#exec TEXTURE IMPORT NAME=Muz9 FILE=MODELS\muz9.PCX GROUP="Skins" LODSET=2
00062	
00063	#exec MESH IMPORT MESH=MinigunPick ANIVFILE=MODELS\minipick_a.3D DATAFILE=MODELS\minipick_d.3D X=0 Y=0 Z=0
00064	#exec MESH ORIGIN MESH=MinigunPick X=0 Y=0 Z=0 YAW=64 PITCH=0 ROLL=0
00065	#exec MESH SEQUENCE MESH=MinigunPick SEQ=All     STARTFRAME=0  NUMFRAMES=1
00066	#exec MESHMAP SCALE MESHMAP=MinigunPick X=0.1 Y=0.1 Z=0.2
00067	#exec MESHMAP SETTEXTURE MESHMAP=MinigunPick NUM=1 TEXTURE=Mini_t
00068	
00069	#exec MESH IMPORT MESH=MiniHand ANIVFILE=MODELS\minihand_a.3D DATAFILE=MODELS\minihand_d.3D X=0 Y=0 Z=0
00070	#exec MESH ORIGIN MESH=MiniHand X=5 Y=270 Z=-20 YAW=64 PITCH=0
00071	#exec MESH SEQUENCE MESH=MiniHand SEQ=All STARTFRAME=0  NUMFRAMES=11
00072	#exec MESH SEQUENCE MESH=MiniHand SEQ=Shoot1  STARTFRAME=1  NUMFRAMES=10
00073	#exec MESHMAP SCALE MESHMAP=MiniHand X=0.06 Y=0.06 Z=0.12
00074	#exec MESHMAP SETTEXTURE MESHMAP=MiniHand NUM=1 TEXTURE=Mini_t
00075	
00076	#exec TEXTURE IMPORT NAME=IconMini FILE=TEXTURES\HUD\WpnMini.PCX GROUP="Icons" MIPS=OFF
00077	#exec TEXTURE IMPORT NAME=UseMini FILE=TEXTURES\HUD\UseMini.PCX GROUP="Icons" MIPS=OFF
00078	
00079	#exec AUDIO IMPORT FILE="Sounds\Minigun\RegFire.Wav" NAME=M2RegFire GROUP="Minigun2"
00080	#exec AUDIO IMPORT FILE="Sounds\Minigun\AltFire.Wav" NAME=M2AltFire GROUP="Minigun2"
00081	#exec AUDIO IMPORT FILE="Sounds\Minigun\WindDown.Wav" NAME=M2WindDown GROUP="Minigun2"
00082	
00083	#exec MESH IMPORT MESH=MuzzFlash3 ANIVFILE=MODELS\muzzle2_a.3d DATAFILE=MODELS\Muzzle2_d.3d X=0 Y=0 Z=0
00084	#exec MESH LODPARAMS MESH=muzzFlash3 MINVERTS=8 STRENGTH=0.7 ZDISP=800.0 
00085	
00086	#exec MESH ORIGIN MESH=MuzzFlash3 X=0 Y=940 Z=0 YAW=64
00087	#exec MESH SEQUENCE MESH=MuzzFlash3 SEQ=All                      STARTFRAME=0 NUMFRAMES=9
00088	#exec MESH SEQUENCE MESH=MuzzFlash3 SEQ=Shoot                   STARTFRAME=0 NUMFRAMES=9
00089	#exec MESHMAP NEW    MESHMAP=MuzzFlash3 MESH=MuzzFlash3
00090	#exec MESHMAP SCALE MESHMAP=MuzzFlash3 X=0.08 Y=0.08 Z=0.16
00091	#exec TEXTURE IMPORT NAME=Muzzy FILE=MODELS\Muzzy.PCX GROUP=Skins
00092	
00093	var float ShotAccuracy, LastShellSpawn;
00094	var int Count;
00095	var bool bOutOfAmmo, bFiredShot;
00096	var() texture MuzzleFlashVariations[10];
00097	
00098	// set which hand is holding weapon
00099	function setHand(float Hand)
00100	{
00101		if ( Hand == 2 )
00102		{
00103			FireOffset.Y = 0;
00104			bHideWeapon = true;
00105			return;
00106		}
00107		else
00108			bHideWeapon = false;
00109		PlayerViewOffset = Default.PlayerViewOffset * 100;
00110		FireOffset.Y = Hand * Default.FireOffset.Y;
00111		PlayerViewOffset.Y *= Hand;
00112		if ( Hand == 1 )
00113			Mesh = mesh(DynamicLoadObject("Botpack.Minigun2L", class'Mesh'));
00114		else
00115		{
00116			Mesh = mesh'Minigun2m';
00117			if ( Hand == 0 )
00118			{
00119				PlayerViewOffset.X = Default.PlayerViewOffset.X * 95;
00120				PlayerViewOffset.Z = Default.PlayerViewOffset.Z * 105;
00121			}
00122		}
00123	}
00124	
00125	simulated event RenderTexture(ScriptedTexture Tex)
00126	{
00127		local Color C;
00128		local string Temp;
00129		
00130		Temp = String(AmmoType.AmmoAmount);
00131	
00132		while(Len(Temp) < 3) Temp = "0"$Temp;
00133	
00134		C.R = 255;
00135		C.G = 0;
00136		C.B = 0;
00137	
00138		Tex.DrawColoredText( 2, 10, Temp, Font'LEDFont2', C );	
00139	}
00140	
00141	function float RateSelf( out int bUseAltMode )
00142	{
00143		local float dist;
00144	
00145		if ( AmmoType.AmmoAmount <=0 )
00146			return -2;
00147	
00148		if ( Pawn(Owner).Enemy == None )
00149		{
00150			bUseAltMode = 0;
00151			return AIRating;
00152		}
00153	
00154		dist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); 
00155		bUseAltMode = 1;
00156		if ( dist > 1200 )
00157		{
00158			if ( dist > 1700 )
00159				bUseAltMode = 0;
00160			return (AIRating * FMin(Pawn(Owner).DamageScaling, 1.5) + FMin(0.0001 * dist, 0.3)); 
00161		}
00162		AIRating *= FMin(Pawn(Owner).DamageScaling, 1.5);
00163		return AIRating;
00164	}
00165	
00166	simulated event RenderOverlays( canvas Canvas )
00167	{
00168		local UT_Shellcase s;
00169		local vector X,Y,Z;
00170		local float dir;
00171	
00172		if ( bSteadyFlash3rd )
00173		{
00174			bMuzzleFlash = 1;
00175			bSetFlashTime = false;
00176			if ( !Level.bDropDetail )
00177				MFTexture = MuzzleFlashVariations[Rand(10)];
00178			else
00179				MFTexture = MuzzleFlashVariations[Rand(5)];
00180		}
00181		else
00182			bMuzzleFlash = 0;
00183		FlashY = Default.FlashY * (1.08 - 0.16 * FRand());
00184		if ( !Owner.IsA('PlayerPawn') || (PlayerPawn(Owner).Handedness == 0) )
00185			FlashO = Default.FlashO * (4 + 0.15 * FRand());
00186		else		
00187			FlashO = Default.FlashO * (1 + 0.15 * FRand());
00188		Texture'MiniAmmoled'.NotifyActor = Self;
00189		Super.RenderOverlays(Canvas);
00190		Texture'MiniAmmoled'.NotifyActor = None;
00191	
00192		if ( bSteadyFlash3rd && Level.bHighDetailMode && (Level.TimeSeconds - LastShellSpawn > 0.125)
00193			&& (Level.Pauser=="") )
00194		{
00195			LastShellSpawn = Level.TimeSeconds;
00196			GetAxes(Pawn(Owner).ViewRotation,X,Y,Z);
00197	
00198			if ( PlayerViewOffset.Y >= 0 )
00199				dir = 1;
00200			else 
00201				dir = -1;
00202			if ( Level.bHighDetailMode )
00203			{
00204				s = Spawn(class'MiniShellCase',Owner, '', Owner.Location + CalcDrawOffset() + 30 * X + (0.4 * PlayerViewOffset.Y+5.0) * Y - Z * 5);
00205				if ( s != None ) 
00206					s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.3+0.2)*dir*Y + (FRand()*0.3+1.0) * Z)*160);              
00207			}
00208		}
00209	}
00210	
00211	function GenerateBullet()
00212	{
00213	    LightType = LT_Steady;
00214		bFiredShot = true;
00215		if ( PlayerPawn(Owner) != None )
00216			PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95));
00217		if ( AmmoType.UseAmmo(1) ) 
00218			TraceFire(ShotAccuracy);
00219		else
00220			GotoState('FinishFire');
00221	}
00222	
00223	function TraceFire( float Accuracy )
00224	{
00225		local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z, AimDir;
00226		local actor Other;
00227	
00228		Owner.MakeNoise(Pawn(Owner).SoundDampening);
00229		GetAxes(Pawn(owner).ViewRotation,X,Y,Z);
00230		StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.Y * Y + FireOffset.Z * Z; 
00231		AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False);	
00232		EndTrace = StartTrace + Accuracy * (FRand() - 0.5 )* Y * 1000
00233			+ Accuracy * (FRand() - 0.5 ) * Z * 1000;
00234		AimDir = vector(AdjustedAim);
00235		EndTrace += (10000 * AimDir); 
00236		Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace);
00237	
00238		Count++;
00239		if ( Count == 4 )
00240		{
00241			Count = 0;
00242			if ( VSize(HitLocation - StartTrace) > 250 )
00243				Spawn(class'MTracer',,, StartTrace + 96 * AimDir,rotator(EndTrace - StartTrace));
00244		}
00245		ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z);
00246	}
00247	
00248	function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z)
00249	{
00250		local int rndDam;
00251	
00252		if (Other == Level) 
00253			Spawn(class'UT_LightWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal));
00254		else if ( (Other!=self) && (Other!=Owner) && (Other != None) ) 
00255		{
00256			if ( !Other.bIsPawn && !Other.IsA('Carcass') )
00257				spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); 
00258			else
00259				Other.PlaySound(Sound 'ChunkHit',, 4.0,,100);
00260	
00261			if ( Other.IsA('Bot') && (FRand() < 0.2) )
00262				Pawn(Other).WarnTarget(Pawn(Owner), 500, X);
00263			rndDam = 9 + Rand(6);
00264			if ( FRand() < 0.2 )
00265				X *= 2.5;
00266			Other.TakeDamage(rndDam, Pawn(Owner), HitLocation, rndDam*500.0*X, MyDamageType);
00267		}
00268	}
00269	
00270	function Fire( float Value )
00271	{
00272		Enable('Tick');
00273		if ( AmmoType == None )
00274		{
00275			// ammocheck
00276			GiveAmmo(Pawn(Owner));
00277		}
00278		if ( AmmoType.UseAmmo(1) )
00279		{
00280			SoundVolume = 255*Pawn(Owner).SoundDampening;
00281			Pawn(Owner).PlayRecoil(FiringSpeed);
00282			bCanClientFire = true;
00283			bPointing=True;
00284			ShotAccuracy = 0.2;
00285			ClientFire(value);
00286			GotoState('NormalFire');
00287		}
00288		else GoToState('Idle');
00289	}
00290	
00291	function AltFire( float Value )
00292	{
00293		Enable('Tick');
00294		if ( AmmoType == None )
00295		{
00296			// ammocheck
00297			GiveAmmo(Pawn(Owner));
00298		}
00299		if ( AmmoType.UseAmmo(1) )
00300		{
00301			bPointing=True;
00302			bCanClientFire = true;
00303			ShotAccuracy = 0.95;
00304			Pawn(Owner).PlayRecoil(FiringSpeed);
00305			SoundVolume = 255*Pawn(Owner).SoundDampening;		
00306			ClientAltFire(value);	
00307			GoToState('AltFiring');		
00308		}
00309		else GoToState('Idle');	
00310	}
00311	
00312	simulated function PlayFiring()
00313	{	
00314		if ( PlayerPawn(Owner) != None )
00315			PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert);
00316		PlayAnim('Shoot1',1 + 0.6 * FireAdjust, 0.05);
00317		AmbientGlow = 250;
00318		AmbientSound = FireSound;
00319		bSteadyFlash3rd = true;
00320	}
00321	
00322	simulated function PlayAltFiring()
00323	{
00324		if ( PlayerPawn(Owner) != None )
00325			PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert);
00326		PlayAnim('Shoot1',1 + 0.3 * FireAdjust, 0.05);
00327		AmbientGlow = 250;
00328		AmbientSound = FireSound;
00329		bSteadyFlash3rd = true;
00330	}
00331	
00332	simulated function PlayUnwind()
00333	{
00334		if ( Owner != None )
00335		{
00336			PlayOwnedSound(Misc1Sound, SLOT_Misc, 3.0*Pawn(Owner).SoundDampening);  //Finish firing, power down		
00337			PlayAnim('UnWind',1.5, 0.05);
00338		}
00339	}
00340	
00341	////////////////////////////////////////////////////////
00342	state FinishFire
00343	{
00344		function Fire(float F) {}
00345		function AltFire(float F) {}
00346	
00347		function ForceFire()
00348		{
00349			bForceFire = true;
00350		}
00351	
00352		function ForceAltFire()
00353		{
00354			bForceAltFire = true;
00355		}
00356	
00357		function BeginState()
00358		{
00359			PlayUnwind();
00360		}
00361	
00362	Begin:
00363		FinishAnim();
00364		Finish();
00365	}
00366	
00367	///////////////////////////////////////////////////////
00368	state NormalFire
00369	{
00370		function Tick( float DeltaTime )
00371		{
00372			if (Owner==None) 
00373				AmbientSound = None;
00374		}
00375	
00376		function AnimEnd()
00377		{
00378			if (Pawn(Owner).Weapon != self) GotoState('');
00379			else if (Pawn(Owner).bFire!=0 && AmmoType.AmmoAmount>0)
00380				Global.Fire(0);
00381			else if ( Pawn(Owner).bAltFire!=0 && AmmoType.AmmoAmount>0)
00382				Global.AltFire(0);
00383			else 
00384				GotoState('FinishFire');
00385		}
00386	
00387		function BeginState()
00388		{
00389			AmbientGlow = 250;
00390			AmbientSound = FireSound;
00391			bSteadyFlash3rd = true;
00392			Super.BeginState();
00393		}	
00394	
00395		function EndState()
00396		{
00397			bSteadyFlash3rd = false;
00398			AmbientGlow = 0;
00399			LightType = LT_None;
00400			AmbientSound = None;
00401			Super.EndState();
00402		}
00403	
00404	Begin:
00405		Sleep(0.13);
00406		GenerateBullet();
00407		Goto('Begin');
00408	}
00409	
00410	state ClientFiring
00411	{
00412		simulated function AnimEnd()
00413		{
00414			if ( (Pawn(Owner) == None) || (AmmoType.AmmoAmount <= 0) )
00415			{
00416				PlayUnwind();
00417				GotoState('');
00418			}
00419			else if ( !bCanClientFire )
00420				GotoState('');
00421			else if ( Pawn(Owner).bFire != 0 )
00422				Global.ClientFire(0);
00423			else if ( Pawn(Owner).bAltFire != 0 )
00424				Global.ClientAltFire(0);
00425			else
00426			{
00427				PlayUnwind();
00428				GotoState('ClientFinish');
00429			}
00430		}
00431	
00432		simulated function BeginState()
00433		{
00434			AmbientSound = FireSound;
00435			bSteadyFlash3rd = true;
00436		}
00437	
00438		simulated function EndState()
00439		{
00440			bSteadyFlash3rd = false;
00441			Super.EndState();
00442		}
00443	}
00444	
00445	////////////////////////////////////////////////////////
00446	
00447	state ClientFinish
00448	{
00449		simulated function bool ClientFire(float Value)
00450		{
00451			bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) );
00452			return bForceFire;
00453		}
00454	
00455		simulated function bool ClientAltFire(float Value)
00456		{
00457			bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) );
00458			return bForceAltFire;
00459		}
00460	
00461		simulated function AnimEnd()
00462		{
00463			if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) )
00464			{
00465				if ( bForceFire || (Pawn(Owner).bFire != 0) )
00466				{
00467					Global.ClientFire(0);
00468					return;
00469				}
00470				else if ( bForceAltFire || (Pawn(Owner).bAltFire != 0) )
00471				{
00472					Global.ClientAltFire(0);
00473					return;
00474				}
00475			}			
00476			GotoState('');
00477			Global.AnimEnd();
00478		}
00479	
00480		simulated function EndState()
00481		{
00482			bSteadyFlash3rd = false;
00483			bForceFire = false;
00484			bForceAltFire = false;
00485			AmbientSound = None;
00486		}
00487	
00488		simulated function BeginState()
00489		{
00490			bSteadyFlash3rd = false;
00491			bForceFire = false;
00492			bForceAltFire = false;
00493		}
00494	}
00495	
00496	state ClientAltFiring
00497	{
00498		simulated function AnimEnd()
00499		{
00500			if ( (Pawn(Owner) == None) || (AmmoType.AmmoAmount <= 0) )
00501			{
00502				PlayUnwind();
00503				GotoState('');
00504			}
00505			else if ( !bCanClientFire )
00506				GotoState('');
00507			else if ( Pawn(Owner).bAltFire != 0 )
00508			{
00509				if ( (AnimSequence != 'Shoot2') || !bAnimLoop )
00510				{	
00511					AmbientSound = AltFireSound;
00512					SoundVolume = 255*Pawn(Owner).SoundDampening;
00513					LoopAnim('Shoot2',1.9);
00514				}
00515				else if ( AmbientSound == None )
00516					AmbientSound = FireSound;
00517	
00518				if ( Affector != None )
00519					Affector.FireEffect();
00520				if ( PlayerPawn(Owner) != None )
00521					PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert);
00522			}
00523			else if ( Pawn(Owner).bFire != 0 )
00524				Global.ClientFire(0);
00525			else
00526			{
00527				PlayUnwind();
00528				bSteadyFlash3rd = false;
00529				GotoState('ClientFinish');
00530			}
00531		}
00532	
00533		simulated function BeginState()
00534		{
00535			bSteadyFlash3rd = true;
00536			AmbientSound = FireSound;
00537		}
00538	
00539		simulated function EndState()
00540		{
00541			bSteadyFlash3rd = false;
00542			Super.EndState();
00543		}
00544	}
00545	
00546	state AltFiring
00547	{
00548		function Tick( float DeltaTime )
00549		{
00550			if (Owner==None) 
00551			{
00552				AmbientSound = None;
00553				GotoState('Pickup');
00554			}			
00555	
00556			if	( bFiredShot && ((pawn(Owner).bAltFire==0) || bOutOfAmmo) ) 
00557				GoToState('FinishFire');
00558		}
00559	
00560		function AnimEnd()
00561		{
00562			if ( (AnimSequence != 'Shoot2') || !bAnimLoop )
00563			{	
00564				AmbientSound = AltFireSound;
00565				SoundVolume = 255*Pawn(Owner).SoundDampening;
00566				LoopAnim('Shoot2',1.9);
00567			}
00568			else if ( AmbientSound == None )
00569				AmbientSound = FireSound;
00570			if ( Affector != None )
00571				Affector.FireEffect();
00572		}
00573	
00574		function BeginState()
00575		{
00576			Super.BeginState();
00577			AmbientSound = FireSound;
00578			AmbientGlow = 250;
00579			bFiredShot = false;
00580			bSteadyFlash3rd = true;
00581		}	
00582	
00583		function EndState()
00584		{
00585			bSteadyFlash3rd = false;
00586			AmbientGlow = 0;
00587			LightType = LT_None;
00588			AmbientSound = None;
00589			Super.EndState();
00590		}
00591	
00592	Begin:
00593		Sleep(0.13);
00594		GenerateBullet();
00595		if ( AnimSequence == 'Shoot2' )
00596			Goto('FastShoot');
00597		Goto('Begin');
00598	FastShoot:
00599		Sleep(0.08);
00600		GenerateBullet();
00601		Goto('FastShoot');
00602	}
00603	
00604	///////////////////////////////////////////////////////////
00605	state Idle
00606	{
00607	
00608	Begin:
00609		if (Pawn(Owner).bFire!=0 && AmmoType.AmmoAmount>0) Fire(0.0);
00610		if (Pawn(Owner).bAltFire!=0 && AmmoType.AmmoAmount>0) AltFire(0.0);	
00611		LoopAnim('Idle',0.2,0.9);
00612		bPointing=False;
00613		if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) 
00614			Pawn(Owner).SwitchToBestWeapon();  //Goto Weapon that has Ammo
00615		Disable('AnimEnd');	
00616	}
00617	
00618	defaultproperties
00619	{
00620	     MuzzleFlashVariations(0)=Texture'Botpack.Skins.Muz1'
00621	     MuzzleFlashVariations(1)=Texture'Botpack.Skins.Muz2'
00622	     MuzzleFlashVariations(2)=Texture'Botpack.Skins.Muz3'
00623	     MuzzleFlashVariations(3)=Texture'Botpack.Skins.Muz4'
00624	     MuzzleFlashVariations(4)=Texture'Botpack.Skins.Muz5'
00625	     MuzzleFlashVariations(5)=Texture'Botpack.Skins.Muz6'
00626	     MuzzleFlashVariations(6)=Texture'Botpack.Skins.Muz7'
00627	     MuzzleFlashVariations(7)=Texture'Botpack.Skins.Muz8'
00628	     MuzzleFlashVariations(8)=Texture'Botpack.Skins.Muz9'
00629	     MuzzleFlashVariations(9)=Texture'Botpack.Skins.Muz9'
00630	     WeaponDescription="Classification: Gatling Gun\n\nPrimary Fire: Bullets are sprayed forth at a medium to fast rate of fire and good accuracy.\n\nSecondary Fire: Minigun fires twice as fast and is half as accurate.\n\nTechniques: Secondary fire is much more useful at close range, but can eat up tons of ammunition."
00631	     AmmoName=Class'Botpack.Miniammo'
00632	     PickupAmmoCount=50
00633	     bInstantHit=True
00634	     bAltInstantHit=True
00635	     bRapidFire=True
00636	     FireOffset=(X=8.000000,Y=-5.000000,Z=-4.000000)
00637	     MyDamageType=shot
00638	     shakemag=135.000000
00639	     shakevert=8.000000
00640	     AIRating=0.730000
00641	     RefireRate=0.990000
00642	     AltRefireRate=0.990000
00643	     FireSound=Sound'Botpack.minigun2.M2RegFire'
00644	     AltFireSound=Sound'Botpack.minigun2.M2AltFire'
00645	     SelectSound=Sound'UnrealI.Minigun.MiniSelect'
00646	     Misc1Sound=Sound'Botpack.minigun2.M2WindDown'
00647	     DeathMessage="%k's %w turned %o into a leaky piece of meat."
00648	     NameColor=(B=0)
00649	     bDrawMuzzleFlash=True
00650	     MuzzleScale=2.000000
00651	     FlashY=0.180000
00652	     FlashO=0.022000
00653	     FlashC=0.006000
00654	     FlashLength=0.200000
00655	     FlashS=128
00656	     MFTexture=Texture'Botpack.Skins.Muz9'
00657	     AutoSwitchPriority=7
00658	     InventoryGroup=7
00659	     PickupMessage="You got the Minigun."
00660	     ItemName="Minigun"
00661	     PlayerViewOffset=(X=2.100000,Y=-0.350000,Z=-1.700000)
00662	     PlayerViewMesh=LodMesh'Botpack.Minigun2m'
00663	     BobDamping=0.975000
00664	     PickupViewMesh=LodMesh'Botpack.MinigunPick'
00665	     ThirdPersonMesh=LodMesh'Botpack.MiniHand'
00666	     StatusIcon=Texture'Botpack.Icons.UseMini'
00667	     bMuzzleFlashParticles=True
00668	     MuzzleFlashStyle=STY_Translucent
00669	     MuzzleFlashMesh=LodMesh'Botpack.MuzzFlash3'
00670	     MuzzleFlashScale=0.250000
00671	     MuzzleFlashTexture=Texture'Botpack.Skins.Muzzy'
00672	     PickupSound=Sound'UnrealShare.Pickups.WeaponPickup'
00673	     Icon=Texture'Botpack.Icons.UseMini'
00674	     Mesh=LodMesh'Botpack.MinigunPick'
00675	     bNoSmooth=False
00676	     SoundRadius=96
00677	     SoundVolume=255
00678	     CollisionRadius=34.000000
00679	     CollisionHeight=8.000000
00680	     LightEffect=LE_NonIncidence
00681	     LightBrightness=255
00682	     LightHue=28
00683	     LightSaturation=32
00684	     LightRadius=6
00685	}

End Source Code