Botpack
Class UT_FlakCannon

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

class UT_FlakCannon
extends Botpack.TournamentWeapon

//============================================================================= // UT_FlakCannon. //=============================================================================
States
NormalFire, ClientAltFiring, ClientFiring, ClientReload, AltFiring

Function Summary
 void AltFire(float Value)
 void Fire(float Value)
     
// Fire chunks
 
simulated
PlayAltFiring()
 
simulated
PlayFiring()
 float RateSelf(out int)
 float SuggestAttackStyle()
     
// return delta to combat style
 float SuggestDefenseStyle()


State NormalFire Function Summary
 void AnimEnd()
 void EndState()


State ClientAltFiring Function Summary


State ClientFiring Function Summary


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


State AltFiring Function Summary
 void AnimEnd()
 void EndState()



Source Code


00001	//=============================================================================
00002	// UT_FlakCannon.
00003	//=============================================================================
00004	class UT_FlakCannon extends TournamentWeapon;
00005	
00006	#exec MESH IMPORT MESH=flakm ANIVFILE=MODELS\flakcannon_a.3D DATAFILE=MODELS\flakcannon_d.3D X=0 Y=0 Z=0
00007	#exec MESH ORIGIN MESH=flakm X=40 Y=0 Z=0 YAW=64 ROLL=124 PITCH=128
00008	#exec MESH SEQUENCE MESH=Flakm SEQ=All     STARTFRAME=0   NUMFRAMES=96
00009	#exec MESH SEQUENCE MESH=Flakm SEQ=Select  STARTFRAME=0   NUMFRAMES=30 RATE=48 GROUP=Select
00010	#exec MESH SEQUENCE MESH=Flakm SEQ=Loading STARTFRAME=30  NUMFRAMES=15
00011	#exec MESH SEQUENCE MESH=Flakm SEQ=Still   STARTFRAME=45  NUMFRAMES=1
00012	#exec MESH SEQUENCE MESH=Flakm SEQ=Fire    STARTFRAME=46  NUMFRAMES=10
00013	#exec MESH SEQUENCE MESH=Flakm SEQ=AltFire STARTFRAME=57  NUMFRAMES=10 RATE=24
00014	#exec MESH SEQUENCE MESH=Flakm SEQ=Sway    STARTFRAME=80  NUMFRAMES=2
00015	#exec MESH SEQUENCE MESH=Flakm SEQ=Down    STARTFRAME=82  NUMFRAMES=10
00016	#exec TEXTURE IMPORT NAME=Flak_t FILE=MODELS\Flak.PCX GROUP="Skins" LODSET=2
00017	#exec TEXTURE IMPORT NAME=Flak_t1 FILE=MODELS\Flak1.PCX GROUP="Skins" LODSET=2
00018	#exec TEXTURE IMPORT NAME=Flak_t2 FILE=MODELS\Flak2.PCX GROUP="Skins" LODSET=2
00019	#exec TEXTURE IMPORT NAME=Flak_t3 FILE=MODELS\Flak3.PCX GROUP="Skins" LODSET=2
00020	#exec TEXTURE IMPORT NAME=Flak_t4 FILE=MODELS\Flak4.PCX GROUP="Skins" LODSET=2
00021	#exec MESHMAP SCALE MESHMAP=flakm  X=0.007 Y=0.003 Z=0.014
00022	#exec MESHMAP SETTEXTURE MESHMAP=flakm NUM=0 TEXTURE=Flak_t1
00023	#exec MESHMAP SETTEXTURE MESHMAP=flakm NUM=1 TEXTURE=Flak_t2
00024	#exec MESHMAP SETTEXTURE MESHMAP=flakm NUM=2 TEXTURE=Flak_t3
00025	#exec MESHMAP SETTEXTURE MESHMAP=flakm NUM=3 TEXTURE=Flak_t4
00026	#exec MESHMAP SETTEXTURE MESHMAP=flakm NUM=4 TEXTURE=Botpack.Ammocount.flakAmmoled
00027	
00028	#exec OBJ LOAD FILE=Textures\Ammocount.utx  PACKAGE=Botpack.Ammocount
00029	#exec TEXTURE IMPORT NAME=Flakmuz FILE=MODELS\FlakFlash.PCX GROUP="Skins" LODSET=2
00030	
00031	#exec MESH IMPORT MESH=Flak2Pick ANIVFILE=MODELS\FlakPick2_a.3D DATAFILE=MODELS\FlakPick2_d.3D X=0 Y=0 Z=0
00032	#exec MESH ORIGIN MESH=Flak2Pick X=0 Y=-540 Z=0 YAW=64
00033	#exec MESH SEQUENCE MESH=Flak2Pick SEQ=All    STARTFRAME=0   NUMFRAMES=1
00034	#exec MESH SEQUENCE MESH=Flak2Pick SEQ=Still  STARTFRAME=0   NUMFRAMES=1
00035	#exec MESHMAP SCALE MESHMAP=Flak2Pick X=0.07 Y=0.07 Z=0.14
00036	#exec MESHMAP SETTEXTURE MESHMAP=Flak2Pick NUM=1 TEXTURE=Flak_t
00037	
00038	#exec MESH IMPORT MESH=FlakHand ANIVFILE=MODELS\flakhand_a.3D DATAFILE=MODELS\flakhand_d.3D X=0 Y=0 Z=0
00039	#exec MESH ORIGIN MESH=FlakHand X=20 Y=-230 Z=-55 YAW=-64 ROLL=0 PITCH=0
00040	#exec MESH SEQUENCE MESH=FlakHand SEQ=All  STARTFRAME=0  NUMFRAMES=10
00041	#exec MESH SEQUENCE MESH=FlakHand SEQ=Still  STARTFRAME=0  NUMFRAMES=1
00042	#exec MESH SEQUENCE MESH=FlakHand SEQ=Fire  STARTFRAME=1  NUMFRAMES=9 RATE=40.0
00043	#exec MESHMAP SCALE MESHMAP=FlakHand X=0.04 Y=0.04 Z=0.08
00044	#exec MESHMAP SETTEXTURE MESHMAP=FlakHand NUM=1 TEXTURE=Flak_t
00045	
00046	#exec TEXTURE IMPORT NAME=IconFlak FILE=TEXTURES\HUD\WpnFlak.PCX GROUP="Icons" MIPS=OFF
00047	#exec TEXTURE IMPORT NAME=UseFlak FILE=TEXTURES\HUD\UseFlak.PCX GROUP="Icons" MIPS=OFF
00048	
00049	#exec MESH IMPORT MESH=muzzFF3 ANIVFILE=MODELS\flakflash_a.3d DATAFILE=MODELS\flakflash_d.3d X=0 Y=0 Z=0
00050	#exec MESH LODPARAMS MESH=muzzFF3 MINVERTS=8 STRENGTH=0.7 ZDISP=800.0
00051	#exec MESH ORIGIN MESH=muzzFF3 X=0 Y=740 Z=-90 YAW=64
00052	#exec MESH SEQUENCE MESH=muzzFF3 SEQ=All                      STARTFRAME=0 NUMFRAMES=1
00053	#exec MESHMAP NEW   MESHMAP=muzzFF3 MESH=muzzFF3
00054	#exec MESHMAP SCALE MESHMAP=muzzFF3 X=0.03 Y=0.075 Z=0.06
00055	#exec TEXTURE IMPORT NAME=MuzzyFlak FILE=MODELS\flakflash2.PCX GROUP=Skins LODSET=2
00056	
00057	// return delta to combat style
00058	function float SuggestAttackStyle()
00059	{
00060		local bot B;
00061	
00062		B = Bot(Owner);
00063		if ( (B != None) && B.bNovice )
00064			return 0.2;
00065		return 0.4;
00066	}
00067	
00068	function float SuggestDefenseStyle()
00069	{
00070		return -0.3;
00071	}
00072	
00073	simulated event RenderTexture(ScriptedTexture Tex)
00074	{
00075		local Color C;
00076		local string Temp;
00077		
00078		if ( AmmoType != None )
00079			Temp = String(AmmoType.AmmoAmount);
00080	
00081		while(Len(Temp) < 3) Temp = "0"$Temp;
00082	
00083		C.R = 255;
00084		C.G = 0;
00085		C.B = 0;
00086	
00087		Tex.DrawColoredText( 30, 10, Temp, Font'LEDFont2', C );	
00088	}
00089	
00090	
00091	function float RateSelf( out int bUseAltMode )
00092	{
00093		local float EnemyDist, rating;
00094		local vector EnemyDir;
00095	
00096		if ( AmmoType.AmmoAmount <=0 )
00097			return -2;
00098		if ( Pawn(Owner).Enemy == None )
00099		{
00100			bUseAltMode = 0;
00101			return AIRating;
00102		}
00103		EnemyDir = Pawn(Owner).Enemy.Location - Owner.Location;
00104		EnemyDist = VSize(EnemyDir);
00105		rating = FClamp(AIRating - (EnemyDist - 450) * 0.001, 0.2, AIRating);
00106		if ( Pawn(Owner).Enemy.IsA('StationaryPawn') )
00107		{
00108			bUseAltMode = 0;
00109			return AIRating + 0.3;
00110		}
00111		if ( EnemyDist > 900 )
00112		{
00113			bUseAltMode = 0;
00114			if ( EnemyDist > 2000 )
00115			{
00116				if ( EnemyDist > 3500 )
00117					return 0.2;
00118				return (AIRating - 0.3);
00119			}			
00120			if ( EnemyDir.Z < -0.5 * EnemyDist )
00121			{
00122				bUseAltMode = 1;
00123				return (AIRating - 0.3);
00124			}
00125		}
00126		else if ( (EnemyDist < 750) && (Pawn(Owner).Enemy.Weapon != None) && Pawn(Owner).Enemy.Weapon.bMeleeWeapon )
00127		{
00128			bUseAltMode = 0;
00129			return (AIRating + 0.3);
00130		}
00131		else if ( (EnemyDist < 340) || (EnemyDir.Z > 30) )
00132		{
00133			bUseAltMode = 0;
00134			return (AIRating + 0.2);
00135		}
00136		else
00137			bUseAltMode = int( FRand() < 0.65 );
00138		return rating;
00139	}
00140	
00141	
00142	simulated event RenderOverlays( canvas Canvas )
00143	{
00144		Texture'FlakAmmoled'.NotifyActor = Self;
00145		Super.RenderOverlays(Canvas);
00146		Texture'FlakAmmoled'.NotifyActor = None;
00147	}
00148	
00149	
00150	// Fire chunks
00151	function Fire( float Value )
00152	{
00153		local Vector Start, X,Y,Z;
00154		local Bot B;
00155		local Pawn P;
00156	
00157		if ( AmmoType == None )
00158		{
00159			// ammocheck
00160			GiveAmmo(Pawn(Owner));
00161		}
00162		if (AmmoType.UseAmmo(1))
00163		{
00164			bCanClientFire = true;
00165			bPointing=True;
00166			Start = Owner.Location + CalcDrawOffset();
00167			B = Bot(Owner);
00168			P = Pawn(Owner);
00169			P.PlayRecoil(FiringSpeed);
00170			Owner.MakeNoise(2.0 * P.SoundDampening);
00171			AdjustedAim = P.AdjustAim(AltProjectileSpeed, Start, AimError, True, bWarnTarget);
00172			GetAxes(AdjustedAim,X,Y,Z);
00173			Spawn(class'WeaponLight',,'',Start+X*20,rot(0,0,0));		
00174			Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z;	
00175			Spawn( class 'UTChunk1',, '', Start, AdjustedAim);
00176			Spawn( class 'UTChunk2',, '', Start - Z, AdjustedAim);
00177			Spawn( class 'UTChunk3',, '', Start + 2 * Y + Z, AdjustedAim);
00178			Spawn( class 'UTChunk4',, '', Start - Y, AdjustedAim);
00179			Spawn( class 'UTChunk1',, '', Start + 2 * Y - Z, AdjustedAim);
00180			Spawn( class 'UTChunk2',, '', Start, AdjustedAim);
00181	
00182			// lower skill bots fire less flak chunks
00183			if ( (B == None) || !B.bNovice || ((B.Enemy != None) && (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon) )
00184			{
00185				Spawn( class 'UTChunk3',, '', Start + Y - Z, AdjustedAim);
00186				Spawn( class 'UTChunk4',, '', Start + 2 * Y + Z, AdjustedAim);
00187			}
00188			else if ( B.Skill > 1 )
00189				Spawn( class 'UTChunk3',, '', Start + Y - Z, AdjustedAim);
00190	
00191			ClientFire(Value);
00192			GoToState('NormalFire');
00193		}
00194	}
00195	
00196	simulated function PlayFiring()
00197	{
00198		PlayAnim( 'Fire', 0.9, 0.05);
00199		PlayOwnedSound(FireSound, SLOT_Misc,Pawn(Owner).SoundDampening*4.0);	
00200		bMuzzleFlash++;
00201	}
00202	
00203	simulated function PlayAltFiring()
00204	{
00205		PlayOwnedSound(AltFireSound, SLOT_Misc,Pawn(Owner).SoundDampening*4.0);
00206		PlayAnim('AltFire', 1.3, 0.05);
00207		bMuzzleFlash++;
00208	}
00209	
00210	function AltFire( float Value )
00211	{
00212		local Vector Start, X,Y,Z;
00213	
00214		if ( AmmoType == None )
00215		{
00216			// ammocheck
00217			GiveAmmo(Pawn(Owner));
00218		}
00219		if (AmmoType.UseAmmo(1))
00220		{
00221			Pawn(Owner).PlayRecoil(FiringSpeed);
00222			bPointing=True;
00223			bCanClientFire = true;
00224			Owner.MakeNoise(Pawn(Owner).SoundDampening);
00225			GetAxes(Pawn(owner).ViewRotation,X,Y,Z);
00226			Start = Owner.Location + CalcDrawOffset();
00227			Spawn(class'WeaponLight',,'',Start+X*20,rot(0,0,0));		
00228			Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; 
00229			AdjustedAim = pawn(owner).AdjustToss(AltProjectileSpeed, Start, AimError, True, bAltWarnTarget);	
00230			Spawn(class'FlakSlug',,, Start,AdjustedAim);
00231			ClientAltFire(Value);	
00232			GoToState('AltFiring');
00233		}	
00234	}
00235	
00236	////////////////////////////////////////////////////////////
00237	state AltFiring
00238	{
00239		function EndState()
00240		{
00241			Super.EndState();
00242			OldFlashCount = FlashCount;
00243		}
00244	
00245		function AnimEnd()
00246		{
00247			if ( (AnimSequence != 'Loading') && (AmmoType.AmmoAmount > 0) )
00248				PlayReloading();
00249			else
00250				Finish();
00251		}
00252			
00253	Begin:
00254		FlashCount++;
00255	}
00256	
00257	/////////////////////////////////////////////////////////////
00258	simulated function PlayReloading()
00259	{
00260		PlayAnim('Loading',0.7, 0.05);
00261		Owner.PlayOwnedSound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening);		
00262	}
00263	
00264	simulated function PlayFastReloading()
00265	{
00266		PlayAnim('Loading',1.4, 0.05);
00267		Owner.PlayOwnedSound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening);		
00268	}
00269	
00270	state ClientReload
00271	{
00272		simulated function bool ClientFire(float Value)
00273		{
00274			bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) );
00275			return bForceFire;
00276		}
00277	
00278		simulated function bool ClientAltFire(float Value)
00279		{
00280			bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) );
00281			return bForceAltFire;
00282		}
00283	
00284		simulated function AnimEnd()
00285		{
00286			if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) )
00287			{
00288				if ( bForceFire || (Pawn(Owner).bFire != 0) )
00289				{
00290					Global.ClientFire(0);
00291					return;
00292				}
00293				else if ( bForceAltFire || (Pawn(Owner).bAltFire != 0) )
00294				{
00295					Global.ClientAltFire(0);
00296					return;
00297				}
00298			}			
00299			GotoState('');
00300			Global.AnimEnd();
00301		}
00302	
00303		simulated function EndState()
00304		{
00305			bForceFire = false;
00306			bForceAltFire = false;
00307		}
00308	
00309		simulated function BeginState()
00310		{
00311			bForceFire = false;
00312			bForceAltFire = false;
00313		}
00314	}
00315	
00316	state ClientFiring
00317	{
00318		simulated function AnimEnd()
00319		{
00320			if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) )
00321			{
00322				PlayIdleAnim();
00323				GotoState('');
00324			}
00325			else if ( !bCanClientFire )
00326				GotoState('');
00327			else
00328			{
00329				PlayFastReloading();
00330				GotoState('ClientReload');
00331			}
00332		}
00333	}
00334	
00335	state ClientAltFiring
00336	{
00337		simulated function AnimEnd()
00338		{
00339			if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) )
00340			{
00341				PlayIdleAnim();
00342				GotoState('');
00343			}
00344			else if ( !bCanClientFire )
00345				GotoState('');
00346			else
00347			{
00348				PlayReloading();
00349				GotoState('ClientReload');
00350			}
00351	
00352		}
00353	}
00354	
00355	state NormalFire
00356	{
00357		function EndState()
00358		{
00359			Super.EndState();
00360			OldFlashCount = FlashCount;
00361		}
00362	
00363		function AnimEnd()
00364		{
00365			if ( (AnimSequence != 'Loading') && (AmmoType.AmmoAmount > 0) )
00366				PlayFastReloading();
00367			else
00368				Finish();
00369		}
00370			
00371	Begin:
00372		FlashCount++;
00373	}
00374	
00375	///////////////////////////////////////////////////////////
00376	simulated function TweenDown()
00377	{
00378		if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') )
00379			TweenAnim( AnimSequence, AnimFrame * 0.4 );
00380		else if ( AmmoType.AmmoAmount < 1 )
00381			TweenAnim('Select', 0.5);
00382		else
00383			PlayAnim('Down',1.0, 0.05);
00384	}
00385	
00386	simulated function PlayIdleAnim()
00387	{
00388	}
00389	
00390	simulated function PlayPostSelect()
00391	{
00392		PlayAnim('Loading', 1.3, 0.05);
00393		Owner.PlayOwnedSound(Misc2Sound, SLOT_None,1.3*Pawn(Owner).SoundDampening);	
00394	}
00395	
00396	defaultproperties
00397	{
00398	     WeaponDescription="Classification: Heavy Shrapnel\n\nPrimary Fire: White hot chunks of scrap metal are sprayed forth, shotgun style.\n\nSecondary Fire: A grenade full of shrapnel is lobbed at the enemy.\n\nTechniques: The Flak Cannon is far more useful in close range combat situations."
00399	     InstFlash=-0.400000
00400	     InstFog=(X=650.000000,Y=450.000000,Z=190.000000)
00401	     AmmoName=Class'Botpack.FlakAmmo'
00402	     PickupAmmoCount=10
00403	     bWarnTarget=True
00404	     bAltWarnTarget=True
00405	     bSplashDamage=True
00406	     FiringSpeed=1.000000
00407	     FireOffset=(X=10.000000,Y=-11.000000,Z=-15.000000)
00408	     ProjectileClass=Class'Botpack.UTChunk'
00409	     AltProjectileClass=Class'Botpack.flakslug'
00410	     aimerror=700.000000
00411	     shakemag=350.000000
00412	     shaketime=0.150000
00413	     shakevert=8.500000
00414	     AIRating=0.750000
00415	     FireSound=Sound'UnrealShare.flak.shot1'
00416	     AltFireSound=Sound'UnrealShare.flak.Explode1'
00417	     CockingSound=Sound'UnrealI.flak.load1'
00418	     SelectSound=Sound'UnrealI.flak.pdown'
00419	     Misc2Sound=Sound'UnrealI.flak.Hidraul2'
00420	     DeathMessage="%o was ripped to shreds by %k's %w."
00421	     NameColor=(G=96,B=0)
00422	     bDrawMuzzleFlash=True
00423	     MuzzleScale=2.000000
00424	     FlashY=0.160000
00425	     FlashO=0.015000
00426	     FlashC=0.100000
00427	     FlashLength=0.020000
00428	     FlashS=256
00429	     MFTexture=Texture'Botpack.Skins.Flakmuz'
00430	     AutoSwitchPriority=8
00431	     InventoryGroup=8
00432	     PickupMessage="You got the Flak Cannon."
00433	     ItemName="Flak Cannon"
00434	     PlayerViewOffset=(X=1.500000,Y=-1.000000,Z=-1.650000)
00435	     PlayerViewMesh=LodMesh'Botpack.flakm'
00436	     PlayerViewScale=1.200000
00437	     BobDamping=0.972000
00438	     PickupViewMesh=LodMesh'Botpack.Flak2Pick'
00439	     ThirdPersonMesh=LodMesh'Botpack.FlakHand'
00440	     StatusIcon=Texture'Botpack.Icons.UseFlak'
00441	     bMuzzleFlashParticles=True
00442	     MuzzleFlashStyle=STY_Translucent
00443	     MuzzleFlashMesh=LodMesh'Botpack.muzzFF3'
00444	     MuzzleFlashScale=0.400000
00445	     MuzzleFlashTexture=Texture'Botpack.Skins.MuzzyFlak'
00446	     PickupSound=Sound'UnrealShare.Pickups.WeaponPickup'
00447	     Icon=Texture'Botpack.Icons.UseFlak'
00448	     Mesh=LodMesh'Botpack.Flak2Pick'
00449	     bNoSmooth=False
00450	     CollisionRadius=32.000000
00451	     CollisionHeight=23.000000
00452	     LightBrightness=228
00453	     LightHue=30
00454	     LightSaturation=71
00455	     LightRadius=14
00456	}

End Source Code