Botpack
Class SniperRifle

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

class SniperRifle
extends Botpack.TournamentWeapon

//============================================================================= // SniperRifle // A military redesign of the rifle. //=============================================================================
Variables
 name FireAnims[5]
 int NumFire
 vector OwnerLocation
 StillTime, StillStart

States
Zooming, Idle, NormalFire

Function Summary
 void AltFire(float Value)
 bool ClientAltFire(float Value)
 
simulated
PlayFiring()
 
simulated
PostRender(Canvas Canvas)
 float RateSelf(out int)
 void setHand(float Hand)
     
// set which hand is holding weapon


State Zooming Function Summary


State Idle Function Summary
 void EndState()
 void BeginState()
 void Fire(float Value)


State NormalFire Function Summary
 void TraceFire(float Accuracy)
 void Finish()
 void ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z)
 void Timer()
 void EndState()



Source Code


00001	//=============================================================================
00002	// SniperRifle
00003	// A military redesign of the rifle.
00004	//=============================================================================
00005	class SniperRifle extends TournamentWeapon;
00006	
00007	#exec MESH IMPORT MESH=Rifle2m ANIVFILE=MODELS\Rifle2_a.3D DATAFILE=MODELS\Rifle2_d.3D 
00008	#exec MESH ORIGIN MESH=Rifle2m X=0 Y=0 Z=0 YAW=64 PITCH=0 ROLL=0
00009	
00010	#exec MESH SEQUENCE MESH=Rifle2m SEQ=All         STARTFRAME=0   NUMFRAMES=75
00011	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Select      STARTFRAME=0   NUMFRAMES=17 RATE=28 GROUP=Select
00012	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Still       STARTFRAME=17  NUMFRAMES=1 
00013	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Fire        STARTFRAME=17  NUMFRAMES=10 RATE=15
00014	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Fire2       STARTFRAME=27  NUMFRAMES=10 RATE=15
00015	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Fire3       STARTFRAME=37  NUMFRAMES=10 RATE=15
00016	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Fire4       STARTFRAME=47  NUMFRAMES=10 RATE=15
00017	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Fire5       STARTFRAME=57  NUMFRAMES=10 RATE=15
00018	#exec MESH SEQUENCE MESH=Rifle2m SEQ=Down        STARTFRAME=67  NUMFRAMES=7
00019	
00020	#exec TEXTURE IMPORT NAME=Rifle2a FILE=MODELS\Rifle1.PCX GROUP=Skins LODSET=2
00021	#exec TEXTURE IMPORT NAME=Rifle2b FILE=MODELS\Rifle2.PCX GROUP=Skins LODSET=2
00022	#exec TEXTURE IMPORT NAME=Rifle2c FILE=MODELS\Rifle3.PCX GROUP=Skins LODSET=2
00023	#exec TEXTURE IMPORT NAME=Rifle2d FILE=MODELS\Rifle4.PCX GROUP=Skins LODSET=2
00024	#exec MESHMAP SCALE MESHMAP=Rifle2m X=0.008 Y=0.004 Z=0.016
00025	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2m NUM=0 TEXTURE=Rifle2a
00026	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2m NUM=1 TEXTURE=Rifle2b
00027	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2m NUM=2 TEXTURE=Rifle2c
00028	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2m NUM=3 TEXTURE=Rifle2d
00029	
00030	#exec MESH IMPORT MESH=Rifle2mL ANIVFILE=MODELS\Rifle2_a.3D DATAFILE=MODELS\Rifle2_d.3D UnMirror=1
00031	#exec MESH ORIGIN MESH=Rifle2mL X=0 Y=0 Z=0 YAW=64 PITCH=0 ROLL=0
00032	
00033	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=All         STARTFRAME=0   NUMFRAMES=75
00034	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Select      STARTFRAME=0   NUMFRAMES=17 RATE=28 GROUP=Select
00035	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Still       STARTFRAME=17  NUMFRAMES=1 
00036	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Fire        STARTFRAME=17  NUMFRAMES=10 RATE=15
00037	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Fire2       STARTFRAME=27  NUMFRAMES=10 RATE=15
00038	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Fire3       STARTFRAME=37  NUMFRAMES=10 RATE=15
00039	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Fire4       STARTFRAME=47  NUMFRAMES=10 RATE=15
00040	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Fire5       STARTFRAME=57  NUMFRAMES=10 RATE=15
00041	#exec MESH SEQUENCE MESH=Rifle2mL SEQ=Down        STARTFRAME=67  NUMFRAMES=7
00042	
00043	#exec MESHMAP SCALE MESHMAP=Rifle2mL X=0.008 Y=0.004 Z=0.016
00044	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2mL NUM=0 TEXTURE=Rifle2a
00045	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2mL NUM=1 TEXTURE=Rifle2b
00046	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2mL NUM=2 TEXTURE=Rifle2c
00047	#exec MESHMAP SETTEXTURE MESHMAP=Rifle2mL NUM=3 TEXTURE=Rifle2d
00048	
00049	#exec MESH IMPORT MESH=RiflePick ANIVFILE=MODELS\Riflehand_a.3D DATAFILE=MODELS\Riflehand_d.3D X=0 Y=0 Z=0
00050	#exec MESH ORIGIN MESH=RiflePick X=0 Y=0 Z=0 YAW=64 
00051	#exec MESH SEQUENCE MESH=RiflePick SEQ=All         STARTFRAME=0   NUMFRAMES=1
00052	#exec MESH SEQUENCE MESH=RiflePick SEQ=Still        STARTFRAME=0   NUMFRAMES=1
00053	#exec TEXTURE IMPORT NAME=JRifle2 FILE=MODELS\Rifle.PCX GROUP=Skins LODSET=2
00054	#exec MESHMAP SCALE MESHMAP=RiflePick X=0.1 Y=0.1 Z=0.2
00055	#exec MESHMAP SETTEXTURE MESHMAP=RiflePick NUM=2 TEXTURE=JRifle2
00056	
00057	#exec MESH IMPORT MESH=RifleHand ANIVFILE=MODELS\Riflehand_a.3D DATAFILE=MODELS\Riflehand_d.3D X=0 Y=0 Z=0
00058	#exec MESH ORIGIN MESH=RifleHand X=15 Y=170 Z=-30 YAW=64 PITCH=0 ROLL=0
00059	#exec MESH SEQUENCE MESH=RifleHand SEQ=All  STARTFRAME=0  NUMFRAMES=1
00060	#exec MESHMAP SCALE MESHMAP=RifleHand X=0.07 Y=0.07 Z=0.14
00061	#exec MESHMAP SETTEXTURE MESHMAP=RifleHand NUM=2 TEXTURE=JRifle2
00062	
00063	#exec TEXTURE IMPORT NAME=MuzzleFlash2 FILE=TEXTURES\NewMuz2.PCX GROUP="Rifle" MIPS=OFF LODSET=2
00064	#exec TEXTURE IMPORT NAME=IconRifle FILE=TEXTURES\HUD\WpnRifle.PCX GROUP="Icons" MIPS=OFF
00065	#exec TEXTURE IMPORT NAME=UseRifle FILE=TEXTURES\HUD\UseRifle.PCX GROUP="Icons" MIPS=OFF
00066	#exec TEXTURE IMPORT NAME=RReticle FILE=TEXTURES\rifleret.PCX GROUP="Icons" MIPS=OFF FLAGS=2 LODSET=2
00067	
00068	#exec AUDIO IMPORT FILE="Sounds\SniperRifle\SniperFire.wav" NAME="SniperFire" GROUP="SniperRifle"
00069	
00070	#exec MESH IMPORT MESH=muzzsr3 ANIVFILE=MODELS\muzzle2_a.3d DATAFILE=MODELS\Muzzle2_d.3d X=0 Y=0 Z=0
00071	#exec MESH LODPARAMS MESH=muzzsr3 MINVERTS=8 STRENGTH=0.7 ZDISP=800.0
00072	#exec MESH ORIGIN MESH=muzzsr3 X=0 Y=980 Z=-75 YAW=64
00073	#exec MESH SEQUENCE MESH=muzzsr3 SEQ=All                      STARTFRAME=0 NUMFRAMES=3
00074	#exec MESH SEQUENCE MESH=muzzsr3 SEQ=Shoot                   STARTFRAME=0 NUMFRAMES=3
00075	#exec MESHMAP NEW   MESHMAP=muzzsr3 MESH=muzzsr3
00076	#exec MESHMAP SCALE MESHMAP=muzzsr3 X=0.04 Y=0.1 Z=0.08
00077	#exec TEXTURE IMPORT NAME=Muzzy3 FILE=MODELS\Muzzy3.PCX GROUP=Skins
00078	
00079	var int NumFire;
00080	var name FireAnims[5];
00081	var vector OwnerLocation;
00082	var float StillTime, StillStart;
00083	
00084	simulated function PostRender( canvas Canvas )
00085	{
00086		local PlayerPawn P;
00087		local float Scale;
00088	
00089		Super.PostRender(Canvas);
00090		P = PlayerPawn(Owner);
00091		if ( (P != None) && (P.DesiredFOV != P.DefaultFOV) ) 
00092		{
00093			bOwnsCrossHair = true;
00094			Scale = Canvas.ClipX/640;
00095			Canvas.SetPos(0.5 * Canvas.ClipX - 128 * Scale, 0.5 * Canvas.ClipY - 128 * Scale );
00096			if ( Level.bHighDetailMode )
00097				Canvas.Style = ERenderStyle.STY_Translucent;
00098			else
00099				Canvas.Style = ERenderStyle.STY_Normal;
00100			Canvas.DrawIcon(Texture'RReticle', Scale);
00101			Canvas.SetPos(0.5 * Canvas.ClipX + 64 * Scale, 0.5 * Canvas.ClipY + 96 * Scale);
00102			Canvas.DrawColor.R = 0;
00103			Canvas.DrawColor.G = 255;
00104			Canvas.DrawColor.B = 0;
00105			Scale = P.DefaultFOV/P.DesiredFOV;
00106			Canvas.DrawText("X"$int(Scale)$"."$int(10 * Scale - 10 * int(Scale)));
00107		}
00108		else
00109			bOwnsCrossHair = false;
00110	}
00111	
00112	function float RateSelf( out int bUseAltMode )
00113	{
00114		local float dist;
00115	
00116		if ( AmmoType.AmmoAmount <=0 )
00117			return -2;
00118	
00119		bUseAltMode = 0;
00120		if ( (Bot(Owner) != None) && Bot(Owner).bSniping )
00121			return AIRating + 1.15;
00122		if (  Pawn(Owner).Enemy != None )
00123		{
00124			dist = VSize(Pawn(Owner).Enemy.Location - Owner.Location);
00125			if ( dist > 1200 )
00126			{
00127				if ( dist > 2000 )
00128					return (AIRating + 0.75);
00129				return (AIRating + FMin(0.0001 * dist, 0.45)); 
00130			}
00131		}
00132		return AIRating;
00133	}
00134	
00135	// set which hand is holding weapon
00136	function setHand(float Hand)
00137	{
00138		Super.SetHand(Hand);
00139		if ( Hand == 1 )
00140			Mesh = mesh(DynamicLoadObject("Botpack.Rifle2mL", class'Mesh'));
00141		else
00142			Mesh = mesh'Rifle2m';
00143	}
00144	
00145	simulated function PlayFiring()
00146	{
00147		local int r;
00148	
00149		PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0);
00150		PlayAnim(FireAnims[Rand(5)],0.5 + 0.5 * FireAdjust, 0.05);
00151	
00152		if ( (PlayerPawn(Owner) != None) 
00153			&& (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) )
00154			bMuzzleFlash++;
00155	}
00156	
00157	
00158	simulated function bool ClientAltFire( float Value )
00159	{
00160		GotoState('Zooming');
00161		return true;
00162	}
00163	
00164	function AltFire( float Value )
00165	{
00166		ClientAltFire(Value);
00167	}
00168	
00169	///////////////////////////////////////////////////////
00170	state NormalFire
00171	{
00172		function EndState()
00173		{
00174			Super.EndState();
00175			OldFlashCount = FlashCount;
00176		}
00177			
00178	Begin:
00179		FlashCount++;
00180	}
00181	
00182	function Timer()
00183	{
00184		local actor targ;
00185		local float bestAim, bestDist;
00186		local vector FireDir;
00187		local Pawn P;
00188	
00189		bestAim = 0.95;
00190		P = Pawn(Owner);
00191		if ( P == None )
00192		{
00193			GotoState('');
00194			return;
00195		}
00196		if ( VSize(P.Location - OwnerLocation) < 6 )
00197			StillTime += FMin(2.0, Level.TimeSeconds - StillStart);
00198	
00199		else
00200			StillTime = 0;
00201		StillStart = Level.TimeSeconds;
00202		OwnerLocation = P.Location;
00203		FireDir = vector(P.ViewRotation);
00204		targ = P.PickTarget(bestAim, bestDist, FireDir, Owner.Location);
00205		if ( Pawn(targ) != None )
00206		{
00207			SetTimer(1 + 4 * FRand(), false);
00208			bPointing = true;
00209			Pawn(targ).WarnTarget(P, 200, FireDir);
00210		}
00211		else 
00212		{
00213			SetTimer(0.4 + 1.6 * FRand(), false);
00214			if ( (P.bFire == 0) && (P.bAltFire == 0) )
00215				bPointing = false;
00216		}
00217	}	
00218	
00219	function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z)
00220	{
00221		local UT_Shellcase s;
00222	
00223		s = Spawn(class'UT_ShellCase',, '', Owner.Location + CalcDrawOffset() + 30 * X + (2.8 * FireOffset.Y+5.0) * Y - Z * 1);
00224		if ( s != None ) 
00225		{
00226			s.DrawScale = 2.0;
00227			s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160);              
00228		}
00229		if (Other == Level) 
00230			Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal));
00231		else if ( (Other != self) && (Other != Owner) && (Other != None) ) 
00232		{
00233			if ( Other.bIsPawn )
00234				Other.PlaySound(Sound 'ChunkHit',, 4.0,,100);
00235			if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) 
00236				&& (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) )
00237				Other.TakeDamage(100, Pawn(Owner), HitLocation, 35000 * X, AltDamageType);
00238			else
00239				Other.TakeDamage(45,  Pawn(Owner), HitLocation, 30000.0*X, MyDamageType);	
00240			if ( !Other.bIsPawn && !Other.IsA('Carcass') )
00241				spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9);	
00242		}
00243	}
00244	
00245	function Finish()
00246	{
00247		if ( (Pawn(Owner).bFire!=0) && (FRand() < 0.6) )
00248			Timer();
00249		Super.Finish();
00250	}
00251	
00252	function TraceFire( float Accuracy )
00253	{
00254		local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z;
00255		local actor Other;
00256		local Pawn PawnOwner;
00257	
00258		PawnOwner = Pawn(Owner);
00259	
00260		Owner.MakeNoise(PawnOwner.SoundDampening);
00261		GetAxes(PawnOwner.ViewRotation,X,Y,Z);
00262		StartTrace = Owner.Location + PawnOwner.Eyeheight * Z; 
00263		AdjustedAim = PawnOwner.AdjustAim(1000000, StartTrace, 2*AimError, False, False);	
00264		X = vector(AdjustedAim);
00265		EndTrace = StartTrace + 10000 * X; 
00266		Other = PawnOwner.TraceShot(HitLocation,HitNormal,EndTrace,StartTrace);
00267		ProcessTraceHit(Other, HitLocation, HitNormal, X,Y,Z);
00268	}
00269	
00270	
00271	state Idle
00272	{
00273		function Fire( float Value )
00274		{
00275			if ( AmmoType == None )
00276			{
00277				// ammocheck
00278				GiveAmmo(Pawn(Owner));
00279			}
00280			if (AmmoType.UseAmmo(1))
00281			{
00282				GotoState('NormalFire');
00283				bCanClientFire = true;
00284				bPointing=True;
00285				if ( Owner.IsA('Bot') )
00286				{
00287					// simulate bot using zoom
00288					if ( Bot(Owner).bSniping && (FRand() < 0.65) )
00289						AimError = AimError/FClamp(StillTime, 1.0, 8.0);
00290					else if ( VSize(Owner.Location - OwnerLocation) < 6 )
00291						AimError = AimError/FClamp(0.5 * StillTime, 1.0, 3.0);
00292					else
00293						StillTime = 0;
00294				}
00295				Pawn(Owner).PlayRecoil(FiringSpeed);
00296				TraceFire(0.0);
00297				AimError = Default.AimError;
00298				ClientFire(Value);
00299			}
00300		}
00301	
00302	
00303		function BeginState()
00304		{
00305			bPointing = false;
00306			SetTimer(0.4 + 1.6 * FRand(), false);
00307			Super.BeginState();
00308		}
00309	
00310		function EndState()
00311		{	
00312			SetTimer(0.0, false);
00313			Super.EndState();
00314		}
00315		
00316	Begin:
00317		bPointing=False;
00318		if ( AmmoType.AmmoAmount<=0 ) 
00319			Pawn(Owner).SwitchToBestWeapon();  //Goto Weapon that has Ammo
00320		if ( Pawn(Owner).bFire!=0 ) Fire(0.0);
00321		Disable('AnimEnd');
00322		PlayIdleAnim();
00323	}
00324	
00325	///////////////////////////////////////////////////////
00326	state Zooming
00327	{
00328		simulated function Tick(float DeltaTime)
00329		{
00330			if ( Pawn(Owner).bAltFire == 0 )
00331			{
00332				if ( (PlayerPawn(Owner) != None) && PlayerPawn(Owner).Player.IsA('ViewPort') )
00333					PlayerPawn(Owner).StopZoom();
00334				SetTimer(0.0,False);
00335				GoToState('Idle');
00336			}
00337		}
00338	
00339		simulated function BeginState()
00340		{
00341			if ( Owner.IsA('PlayerPawn') )
00342			{
00343				if ( PlayerPawn(Owner).Player.IsA('ViewPort') )
00344					PlayerPawn(Owner).ToggleZoom();
00345				SetTimer(0.2,True);
00346			}
00347			else
00348			{
00349				Pawn(Owner).bFire = 1;
00350				Pawn(Owner).bAltFire = 0;
00351				Global.Fire(0);
00352			}
00353		}
00354	}
00355	
00356	///////////////////////////////////////////////////////////
00357	simulated function PlayIdleAnim()
00358	{
00359		if ( Mesh != PickupViewMesh )
00360			PlayAnim('Still',1.0, 0.05);
00361	}
00362	
00363	defaultproperties
00364	{
00365	     FireAnims(0)=Fire
00366	     FireAnims(1)=Fire2
00367	     FireAnims(2)=Fire3
00368	     FireAnims(3)=Fire4
00369	     FireAnims(4)=Fire5
00370	     WeaponDescription="Classification: Long Range Ballistic\n\nRegular Fire: Fires a high powered bullet. Can kill instantly when applied to the cranium of opposing forces. \n\nSecondary Fire: Zooms the rifle in, up to eight times normal vision. Allows for extreme precision from hundreds of yards away.\n\nTechniques: Great for long distance headshots!"
00371	     AmmoName=Class'Botpack.BulletBox'
00372	     PickupAmmoCount=8
00373	     bInstantHit=True
00374	     bAltInstantHit=True
00375	     FiringSpeed=1.800000
00376	     FireOffset=(Y=-5.000000,Z=-2.000000)
00377	     MyDamageType=shot
00378	     AltDamageType=Decapitated
00379	     shakemag=400.000000
00380	     shaketime=0.150000
00381	     shakevert=8.000000
00382	     AIRating=0.540000
00383	     RefireRate=0.600000
00384	     AltRefireRate=0.300000
00385	     FireSound=Sound'Botpack.SniperRifle.SniperFire'
00386	     SelectSound=Sound'UnrealI.Rifle.RiflePickup'
00387	     DeathMessage="%k put a bullet through %o's head."
00388	     NameColor=(R=0,G=0)
00389	     bDrawMuzzleFlash=True
00390	     MuzzleScale=1.000000
00391	     FlashY=0.110000
00392	     FlashO=0.014000
00393	     FlashC=0.031000
00394	     FlashLength=0.013000
00395	     FlashS=256
00396	     MFTexture=Texture'Botpack.Rifle.MuzzleFlash2'
00397	     AutoSwitchPriority=5
00398	     InventoryGroup=10
00399	     PickupMessage="You got a Sniper Rifle."
00400	     ItemName="Sniper Rifle"
00401	     PlayerViewOffset=(X=5.000000,Y=-1.600000,Z=-1.700000)
00402	     PlayerViewMesh=LodMesh'Botpack.Rifle2m'
00403	     PlayerViewScale=2.000000
00404	     BobDamping=0.975000
00405	     PickupViewMesh=LodMesh'Botpack.RiflePick'
00406	     ThirdPersonMesh=LodMesh'Botpack.RifleHand'
00407	     StatusIcon=Texture'Botpack.Icons.UseRifle'
00408	     bMuzzleFlashParticles=True
00409	     MuzzleFlashStyle=STY_Translucent
00410	     MuzzleFlashMesh=LodMesh'Botpack.muzzsr3'
00411	     MuzzleFlashScale=0.100000
00412	     MuzzleFlashTexture=Texture'Botpack.Skins.Muzzy3'
00413	     PickupSound=Sound'UnrealShare.Pickups.WeaponPickup'
00414	     Icon=Texture'Botpack.Icons.UseRifle'
00415	     Rotation=(Roll=-1536)
00416	     Mesh=LodMesh'Botpack.RiflePick'
00417	     bNoSmooth=False
00418	     CollisionRadius=32.000000
00419	     CollisionHeight=8.000000
00420	}

End Source Code