UnrealShare
Class Eightball

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

class Eightball
extends Engine.Weapon

//============================================================================= // Eightball. //=============================================================================
Variables
 NewTarget, OldTarget
 RocketsLoaded, RocketRad
 bool bFireLoad,bTightWad

States
FireRockets, Idle, NormalFire, AltFiring

Function Summary
 void AltFire(float Value)
 void BarrelTurn()
 Actor CheckTarget()
 void Fire(float Value)
 
simulated
PostRender(Canvas Canvas)
 float RateSelf(out int)
 float SuggestAttackStyle()
     
// return delta to combat style


State FireRockets Function Summary
 void BeginState()
 void AltFire(float F)
 void Fire(float F)


State Idle Function Summary
 void Timer()


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


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



Source Code


00001	//=============================================================================
00002	// Eightball.
00003	//=============================================================================
00004	class Eightball extends Weapon;
00005	
00006	#exec MESH IMPORT MESH=EightB ANIVFILE=MODELS\eightb_a.3D DATAFILE=MODELS\eightb_d.3D X=0 Y=0 Z=0
00007	#exec MESH ORIGIN MESH=EightB X=0 Y=100 Z=-120 YAW=-64 ROLL=-8
00008	#exec MESH SEQUENCE MESH=eightb SEQ=All      STARTFRAME=0   NUMFRAMES=65
00009	#exec MESH SEQUENCE MESH=eightb SEQ=Select   STARTFRAME=0   NUMFRAMES=15 RATE=24 GROUP=Select
00010	#exec MESH SEQUENCE MESH=eightb SEQ=Down     STARTFRAME=15  NUMFRAMES=12
00011	#exec MESH SEQUENCE MESH=eightb SEQ=Idle     STARTFRAME=27  NUMFRAMES=2
00012	#exec MESH SEQUENCE MESH=eightb SEQ=Idle2    STARTFRAME=29  NUMFRAMES=1
00013	#exec MESH SEQUENCE MESH=eightb SEQ=Loading  STARTFRAME=30  NUMFRAMES=27
00014	#exec MESH SEQUENCE MESH=eightb SEQ=Fire     STARTFRAME=57  NUMFRAMES=8
00015	#exec TEXTURE IMPORT NAME=JEightB1 FILE=MODELS\eightbal.PCX GROUP=Skins
00016	#exec MESHMAP SCALE MESHMAP=eightb X=0.005 Y=0.005 Z=0.01
00017	#exec MESHMAP SETTEXTURE MESHMAP=eightb NUM=1 TEXTURE=Jeightb1
00018	
00019	#exec MESH IMPORT MESH=EightPick ANIVFILE=MODELS\epick_a.3D DATAFILE=MODELS\epick_d.3D X=0 Y=0 Z=0
00020	#exec MESH ORIGIN MESH=EightPick X=0 Y=170 Z=0 YAW=64
00021	#exec MESH SEQUENCE MESH=eightpick SEQ=All    STARTFRAME=0   NUMFRAMES=1
00022	#exec MESH SEQUENCE MESH=eightpick SEQ=Still  STARTFRAME=0   NUMFRAMES=1
00023	#exec TEXTURE IMPORT NAME=JEightB1 FILE=MODELS\eightbal.PCX GROUP=Skins
00024	#exec MESHMAP SCALE MESHMAP=eightpick X=0.04 Y=0.04 Z=0.08
00025	#exec MESHMAP SETTEXTURE MESHMAP=eightpick NUM=1 TEXTURE=Jeightb1
00026	
00027	// 3rd person perspective version
00028	#exec MESH IMPORT MESH=8Ball3rd ANIVFILE=MODELS\8ball3_a.3D DATAFILE=MODELS\8ball3_d.3D X=0 Y=0 Z=0
00029	#exec MESH ORIGIN MESH=8Ball3rd X=0 Y=-430 Z=-45 YAW=-64 ROLL=9
00030	#exec MESH SEQUENCE MESH=8Ball3rd SEQ=All  STARTFRAME=0  NUMFRAMES=10
00031	#exec MESH SEQUENCE MESH=8Ball3rd SEQ=Idle  STARTFRAME=0  NUMFRAMES=1
00032	#exec MESH SEQUENCE MESH=8Ball3rd SEQ=Fire  STARTFRAME=1  NUMFRAMES=9
00033	#exec TEXTURE IMPORT NAME=JEightB1 FILE=MODELS\eightbal.PCX GROUP="Skins"
00034	#exec OBJ LOAD FILE=textures\FireEffect18.utx PACKAGE=UnrealShare.Effect18
00035	#exec MESHMAP SCALE MESHMAP=8Ball3rd X=0.065 Y=0.065 Z=0.13
00036	#exec MESHMAP SETTEXTURE MESHMAP=8Ball3rd NUM=1 TEXTURE=JEightB1
00037	#exec MESHMAP SETTEXTURE MESHMAP=8Ball3rd NUM=0 TEXTURE=UnrealShare.Effect18.FireEffect18
00038	
00039	#exec AUDIO IMPORT FILE="Sounds\eightbal\8ALTF1.WAV" NAME="EightAltFire" GROUP="EightBall"
00040	#exec AUDIO IMPORT FILE="Sounds\eightbal\Barrelm1.WAV" NAME="BarrelMove" GROUP="EightBall"
00041	#exec AUDIO IMPORT FILE="Sounds\eightbal\Eload1.WAV" NAME="Loading" GROUP="EightBall"
00042	#exec AUDIO IMPORT FILE="Sounds\eightbal\Lock1.WAV" NAME="SeekLock" GROUP="EightBall"
00043	#exec AUDIO IMPORT FILE="Sounds\eightbal\SeekLost.WAV" NAME="SeekLost" GROUP="EightBall"
00044	#exec AUDIO IMPORT FILE="Sounds\eightbal\Select.WAV" NAME="Selecting" GROUP="EightBall"
00045	
00046	#exec MESH NOTIFY MESH=Eightb SEQ=Loading TIME=0.45 FUNCTION=BarrelTurn
00047	
00048	#exec TEXTURE IMPORT NAME=Crosshair6 FILE=Textures\Hud\chair6.PCX GROUP="Icons" FLAGS=2 MIPS=OFF
00049	
00050	var int RocketsLoaded, RocketRad;
00051	var bool bFireLoad,bTightWad;
00052	var Actor LockedTarget, NewTarget, OldTarget;
00053	
00054	simulated function PostRender( canvas Canvas )
00055	{
00056		Super.PostRender(Canvas);
00057		bOwnsCrossHair = bLockedOn;
00058		if ( bOwnsCrossHair )
00059		{
00060			// if locked on, draw special crosshair
00061			Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 );
00062			Canvas.Style = 2;
00063			Canvas.DrawIcon(Texture'Crosshair6', 1.0);
00064			Canvas.Style = 1;	
00065		}
00066	}
00067			
00068	function float RateSelf( out int bUseAltMode )
00069	{
00070		local float EnemyDist;
00071		local bool bRetreating;
00072		local vector EnemyDir;
00073	
00074		if ( AmmoType.AmmoAmount <=0 )
00075			return -2;
00076	
00077		bUseAltMode = 0;
00078		if ( Pawn(Owner).Enemy == None )
00079			return AIRating;
00080	
00081		EnemyDir = Pawn(Owner).Enemy.Location - Owner.Location; 
00082		EnemyDist = VSize(EnemyDir);
00083		if ( EnemyDist < 370 )
00084			return -0.1;
00085	
00086		if ( Owner.Physics == PHYS_Falling )
00087			bUseAltMode = 0;
00088		else if ( EnemyDist < -1.5 * EnemyDir.Z )
00089			bUseAltMode = int( FRand() < 0.5 );
00090		else
00091		{
00092			bRetreating = ( ((EnemyDir/EnemyDist) Dot Owner.Velocity) < -0.7 );
00093			bUseAltMode = 0;
00094			if ( bRetreating && (EnemyDist < 800) && (FRand() < 0.4) )
00095				bUseAltMode = 1;
00096		}
00097		return AIRating;
00098	}
00099	
00100	// return delta to combat style
00101	function float SuggestAttackStyle()
00102	{
00103		local float EnemyDist;
00104	
00105		EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location);
00106		if ( EnemyDist < 600 )
00107			return -0.6;
00108		else
00109			return -0.2;
00110	}
00111	
00112	function BarrelTurn()
00113	{
00114		Owner.PlaySound(Misc3Sound, SLOT_None, 0.1*Pawn(Owner).SoundDampening);
00115	}
00116	
00117	function Fire( float Value )
00118	{
00119		//bFireMem = false;
00120		//bAltFireMem = false;
00121		bPointing=True;
00122		CheckVisibility();
00123		if ( AmmoType.UseAmmo(1) )
00124			GoToState('NormalFire');
00125	}
00126	
00127	function AltFire( float Value )
00128	{
00129		//bFireMem = false;
00130		//bAltFireMem = false;
00131		bPointing=True;
00132		CheckVisibility();
00133		if ( AmmoType.UseAmmo(1) )
00134			GoToState('AltFiring');
00135	}
00136	
00137	function Actor CheckTarget()
00138	{
00139		local Actor ETarget;
00140		local Vector Start, X,Y,Z;
00141		local float bestDist, bestAim;
00142		local Pawn PawnOwner;
00143	
00144		PawnOwner = Pawn(Owner);
00145		if ( !PawnOwner.bIsPlayer && (PawnOwner.Enemy == None) )
00146			return None; 
00147		GetAxes(PawnOwner.ViewRotation,X,Y,Z);
00148		Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; 
00149		bestAim = 0.93;
00150		ETarget = PawnOwner.PickTarget(bestAim, bestDist, X, Start);
00151		if ( !PawnOwner.bIsPlayer && (PawnOwner.Enemy != ETarget) )
00152			return None; 
00153		bPointing = (ETarget != None);
00154		Return ETarget;
00155	}
00156	
00157	//////////////////////////////////////////////////////
00158	state AltFiring
00159	{
00160		function Tick( float DeltaTime )
00161		{
00162			if( (pawn(Owner).bAltFire==0) || (RocketsLoaded > 5) )  // If if Fire button down, load up another
00163	 			GoToState('FireRockets');
00164		}
00165	
00166		function BeginState()
00167		{
00168			RocketsLoaded = 1;
00169			bFireLoad = False;
00170		}
00171	
00172	Begin:
00173		bLockedOn = False;
00174		While ( RocketsLoaded < 6 )
00175		{
00176			if (AmmoType.AmmoAmount<=0) GoToState('FireRockets');		
00177			Owner.PlaySound(CockingSound, SLOT_None, Pawn(Owner).SoundDampening);		
00178			PlayAnim('Loading', 1.1,0.0);
00179			FinishAnim();
00180			RocketsLoaded++;
00181			AmmoType.UseAmmo(1);		
00182			if ( (PlayerPawn(Owner) == None) && ((FRand() > 0.5) || (Pawn(Owner).Enemy == None)) )
00183				Pawn(Owner).bAltFire = 0;
00184			if ( Level.Game.Difficulty > 0 )
00185				Owner.MakeNoise(0.15 * Level.Game.Difficulty * Pawn(Owner).SoundDampening);		
00186		}
00187	}
00188	
00189	///////////////////////////////////////////////////////
00190	state NormalFire
00191	{
00192		function Tick( float DeltaTime )
00193		{
00194			if ( (PlayerPawn(Owner) == None) 
00195				&& ((Pawn(Owner).MoveTarget != Pawn(Owner).Target) 
00196					|| (Pawn(Owner).Enemy == None)
00197					|| ( Mover(Owner.Base) != None )
00198					|| ((Owner.Physics == PHYS_Falling) && (Owner.Velocity.Z < 15))
00199					|| (VSize(Owner.Location - Pawn(Owner).Target.Location) < 400)
00200					|| !Pawn(Owner).CheckFutureSight(0.15)) )
00201				Pawn(Owner).bFire = 0;
00202	
00203			if( pawn(Owner).bFire==0 || RocketsLoaded > 5)  // If Fire button down, load up another
00204	 			GoToState('FireRockets');
00205		}
00206	
00207		function BeginState()
00208		{
00209			bFireLoad = True;
00210			RocketsLoaded = 1;
00211			Super.BeginState();
00212		}
00213	
00214	Begin:
00215		While ( RocketsLoaded < 6 )
00216		{
00217			if ( PlayerPawn(Owner) == None )
00218			{
00219				if ( FRand() > 0.33 )
00220					Pawn(Owner).bFire = 0;
00221				if ( Pawn(Owner).bFire == 0 )
00222		 			GoToState('FireRockets');
00223			}
00224			if (AmmoType.AmmoAmount<=0) GoToState('FireRockets');			
00225			Owner.PlaySound(CockingSound, SLOT_None, Pawn(Owner).SoundDampening);	
00226			PlayAnim('Loading', 1.1,0.0);
00227			FinishAnim();
00228			if (pawn(Owner).bAltFire!=0) bTightWad=True;
00229			NewTarget = CheckTarget();
00230			if ( Pawn(NewTarget) != None )
00231				Pawn(NewTarget).WarnTarget(Pawn(Owner), ProjectileSpeed, vector(Pawn(Owner).ViewRotation));	
00232			If ( (LockedTarget != None) && (NewTarget != LockedTarget) ) 
00233			{
00234				LockedTarget = None;
00235				Owner.PlaySound(Misc2Sound, SLOT_None, Pawn(Owner).SoundDampening);
00236				bLockedOn=False;
00237			}
00238			else if (LockedTarget != None)
00239	 			Owner.PlaySound(Misc1Sound, SLOT_None, Pawn(Owner).SoundDampening);
00240			bPointing = true;
00241			if ( Level.Game.Difficulty > 0 )
00242				Owner.MakeNoise(0.15 * Level.Game.Difficulty * Pawn(Owner).SoundDampening);		
00243			RocketsLoaded++;
00244			AmmoType.UseAmmo(1);
00245		}
00246	}
00247	
00248	///////////////////////////////////////////////////////
00249	state Idle
00250	{
00251		function Timer()
00252		{
00253			NewTarget = CheckTarget();
00254			if ( NewTarget == OldTarget )
00255			{
00256				LockedTarget = NewTarget;
00257				If (LockedTarget != None) 
00258				{
00259					bLockedOn=True;			
00260					Owner.MakeNoise(Pawn(Owner).SoundDampening);
00261					Owner.PlaySound(Misc1Sound, SLOT_None,Pawn(Owner).SoundDampening);
00262					if ( (Pawn(LockedTarget) != None) && (FRand() < 0.7) )
00263						Pawn(LockedTarget).WarnTarget(Pawn(Owner), ProjectileSpeed, vector(Pawn(Owner).ViewRotation));	
00264				}
00265			}
00266			else if( (OldTarget != None) && (NewTarget == None) ) 
00267			{
00268				Owner.PlaySound(Misc2Sound, SLOT_None,Pawn(Owner).SoundDampening);
00269				bLockedOn = False;
00270			}
00271			else 
00272			{
00273				LockedTarget = None;
00274				bLockedOn = False;
00275			}
00276			OldTarget = NewTarget;
00277		}
00278	Begin:
00279		if (Pawn(Owner).bFire!=0) Fire(0.0);
00280		if (Pawn(Owner).bAltFire!=0) AltFire(0.0);	
00281		bPointing=False;
00282		if (AmmoType.AmmoAmount<=0) 
00283			Pawn(Owner).SwitchToBestWeapon();  //Goto Weapon that has Ammo
00284		LoopAnim('Idle', 0.01,0.4);
00285		OldTarget = CheckTarget();
00286		SetTimer(1.25,True);
00287		LockedTarget = None;
00288		bLockedOn = False;
00289	}
00290	
00291	///////////////////////////////////////////////////////
00292	state FireRockets
00293	{
00294		function Fire(float F) {}
00295		function AltFire(float F) {}
00296	
00297		function BeginState()
00298		{
00299			local vector FireLocation, StartLoc, X,Y,Z;
00300			local rotator FireRot;
00301			local rocket r;
00302			local grenade g;
00303			local float Angle;
00304			local pawn BestTarget;
00305			local int DupRockets;
00306	
00307			Angle = 0;
00308			DupRockets = RocketsLoaded - 1;
00309			if (DupRockets < 0) DupRockets = 0;
00310			if ( PlayerPawn(Owner) != None )
00311			{
00312				PlayerPawn(Owner).shakeview(ShakeTime, ShakeMag*RocketsLoaded, ShakeVert); //shake player view
00313				PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190));
00314			}
00315			else
00316				bTightWad = ( FRand() * 4 < Pawn(Owner).skill );
00317	
00318			GetAxes(Pawn(Owner).ViewRotation,X,Y,Z);
00319			StartLoc = Owner.Location + CalcDrawOffset(); 
00320			FireLocation = StartLoc + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; 
00321			if ( bFireLoad ) 		
00322				AdjustedAim = pawn(owner).AdjustAim(ProjectileSpeed, FireLocation, AimError, True, bWarnTarget);
00323			else 
00324				AdjustedAim = pawn(owner).AdjustToss(AltProjectileSpeed, FireLocation, AimError, True, bAltWarnTarget);	
00325				
00326			if ( PlayerPawn(Owner) != None )
00327				AdjustedAim = Pawn(Owner).ViewRotation;
00328					
00329			PlayAnim( 'Fire', 0.6, 0.05);	
00330			Owner.MakeNoise(Pawn(Owner).SoundDampening);
00331			if ( (LockedTarget!=None) || !bFireLoad )
00332			{
00333				BestTarget = Pawn(CheckTarget());
00334				if ( (LockedTarget!=None) && (LockedTarget != BestTarget) ) 
00335				{
00336					LockedTarget = None;
00337					bLockedOn=False;
00338				}
00339			}
00340			else 
00341				BestTarget = None;
00342			bPointing = true;
00343			FireRot = AdjustedAim;
00344			RocketRad = 4;
00345			if (bTightWad || !bFireLoad) RocketRad=7;
00346			While ( RocketsLoaded > 0 )
00347			{
00348				Firelocation = StartLoc - Sin(Angle)*Y*RocketRad + (Cos(Angle)*RocketRad - 10.78)*Z + X * (10 + 8 * FRand());
00349				if (bFireLoad)
00350				{
00351					if ( Angle > 0 )
00352					{
00353						if ( Angle < 3 && !bTightWad)
00354							FireRot.Yaw = AdjustedAim.Yaw - Angle * 600;
00355						else if ( Angle > 3.5 && !bTightWad)
00356							FireRot.Yaw = AdjustedAim.Yaw + (Angle - 3)  * 600;
00357						else
00358							FireRot.Yaw = AdjustedAim.Yaw;
00359					}
00360					if ( LockedTarget!=None )
00361					{
00362						r = Spawn( class 'SeekingRocket',, '', FireLocation,FireRot);	
00363						r.Seeking = LockedTarget;
00364						r.NumExtraRockets = DupRockets;					
00365					}
00366					else 
00367					{
00368						r = Spawn( class 'Rocket',, '', FireLocation,FireRot);
00369						r.NumExtraRockets = DupRockets;
00370						if (RocketsLoaded>5 && bTightWad) r.bRing=True;
00371					}
00372					if ( Angle > 0 )
00373						r.Velocity *= (0.9 + 0.2 * FRand());			
00374				}
00375				else 
00376				{
00377					g = Spawn( class 'Grenade',, '', FireLocation,AdjustedAim);
00378					g.WarnTarget = ScriptedPawn(BestTarget);
00379					g.NumExtraGrenades = DupRockets;
00380					Owner.PlaySound(AltFireSound, SLOT_None, 3.0*Pawn(Owner).SoundDampening);				
00381				}
00382	
00383				Angle += 1.0484; //2*3.1415/6;
00384				RocketsLoaded--;
00385			}
00386			bTightWad=False;
00387			//bFireMem = false;
00388			//bAltFireMem = false;		
00389		}
00390	
00391	Begin:
00392		FinishAnim();
00393		if (AmmoType.AmmoAmount > 0) 
00394		{	
00395			Owner.PlaySound(CockingSound, SLOT_None,Pawn(Owner).SoundDampening);		
00396			PlayAnim('Loading', 1.5,0.0);	
00397			FinishAnim();		
00398			RocketsLoaded = 1;
00399		}
00400		LockedTarget = None;
00401		Finish();	
00402	}
00403	
00404	defaultproperties
00405	{
00406	     AmmoName=Class'UnrealShare.RocketCan'
00407	     PickupAmmoCount=6
00408	     bWarnTarget=True
00409	     bAltWarnTarget=True
00410	     bSplashDamage=True
00411	     bRecommendSplashDamage=True
00412	     ProjectileClass=Class'UnrealShare.Rocket'
00413	     AltProjectileClass=Class'UnrealShare.Grenade'
00414	     shakemag=350.000000
00415	     shaketime=0.200000
00416	     shakevert=7.500000
00417	     AIRating=0.700000
00418	     RefireRate=0.250000
00419	     AltRefireRate=0.250000
00420	     AltFireSound=Sound'UnrealShare.Eightball.EightAltFire'
00421	     CockingSound=Sound'UnrealShare.Eightball.Loading'
00422	     SelectSound=Sound'UnrealShare.Eightball.Selecting'
00423	     Misc1Sound=Sound'UnrealShare.Eightball.SeekLock'
00424	     Misc2Sound=Sound'UnrealShare.Eightball.SeekLost'
00425	     Misc3Sound=Sound'UnrealShare.Eightball.BarrelMove'
00426	     DeathMessage="%o was smacked down multiple times by %k's %w."
00427	     AutoSwitchPriority=5
00428	     InventoryGroup=5
00429	     PickupMessage="You got the Eightball gun"
00430	     ItemName="Eightball"
00431	     PlayerViewOffset=(X=1.900000,Z=-1.890000)
00432	     PlayerViewMesh=LodMesh'UnrealShare.EightB'
00433	     BobDamping=0.985000
00434	     PickupViewMesh=LodMesh'UnrealShare.EightPick'
00435	     ThirdPersonMesh=LodMesh'UnrealShare.8Ball3rd'
00436	     PickupSound=Sound'UnrealShare.Pickups.WeaponPickup'
00437	     Mesh=LodMesh'UnrealShare.EightPick'
00438	     bNoSmooth=False
00439	     CollisionHeight=10.000000
00440	}

End Source Code