Core.Object | +--Engine.Actor | +--Engine.Inventory | +--Engine.Weapon | +--UnrealShare.Eightball
NewTarget,
OldTarget
RocketsLoaded,
RocketRad
bool
bFireLoad,bTightWad
void
AltFire(float Value)
BarrelTurn()
Actor
CheckTarget()
Fire(float Value)
simulated
PostRender(Canvas Canvas)
float
RateSelf(out int)
SuggestAttackStyle()
// return delta to combat style
BeginState()
AltFire(float F)
Fire(float F)
Timer()
Tick(float DeltaTime)
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 }