[Setup] Product=UTPool Version=100 Archive=UTPool.umod SrcPath=. MasterPath=.. Requires=UnrealTournament400Requirement Group=SetupGroup Group=UTPoolGroup [UnrealTournament400Requirement] Product=UnrealTournament Version=400 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=409,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=451,Flags=3) [UTPoolGroup] File=(Src=System\UTPoolReadMe.txt,Size=998) File=(Src=System\UTPool.u,Size=64461) File=(Src=System\UTPool.int,Size=371) [Setup] LocalProduct=UTPool ReadMe=System\UTPoolReadMe.txt SetupWindowTitle=UTPool Installation AutoplayWindowTitle=UTPool Options ProductURL=None Yet VersionURL=None Yet Developer={KiX}ProfessorGib DeveloperURL=None Yet [UnrealTournament400Requirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ Unzip it to your C:\ (or whatever hardrive your UT folder is on) with use folder names checked. Unless u have the umod version, in which case jsut run the file... This is UTPool v100 It adds a weapon called Cueball which fires rockets that bounce around like razorblades... Asshole in the corner pocket!!!! It includes two mutators: -CueballArena --- Self Explanatory -Pool ----- Replaces rocket launcher with cueball. ...There is bug. when u use primary fire while walking forward, the rocket explodes in your face when fired at certain angles... if anyone knows how to fix this, drop me an email... Special Thanks to: JbP drunken master beppo -all for scripting help AsylumEscapee -For the great idea Epic and GT Interactive -Making such a cool game ---- Plans for things to come i may: make it fully customizable add a better death message administer other various updates (like the blowup in yer face fix) -other Mutators by me- QuadMod v100 Later All {KiX}ProfessorGib comments, questions, suggestions, ideas, hate mail, or whatever the hell else u can think of to send to me: ian69@home.net (no viruses or bombs please ;P ) 12/14/99*Dx@ >dBo)MxNone FireRockets BeginState PlayLoadingAnimEndTickBeginIdle Explosion RotateRocketFiringRockets RotateAnim LoadAnimBlowUp FireAnim PlayRotating CheckTargetUTPoolCoreEngineTimerSystemUseAmmoExplodeRotatorWing EndStateStationaryPawnFire ClientReloadClientAltFireCueBall ClientFireMesh PlayRFiring NormalFire PendingLockAltFireHitWall PlayerPawnPawn RemoteRoleVector ZoneChange DestroyedspeedBot AltFiring RocketDeathRotate3ClientAltFiring ClientFiringFire3BotpackFire2spin TakeDamagePostBeginPlay WarnTarget AmbientGlow LightRadiusStillSetupExplosionDecal ImpactSound SpawnSoundMomentumTransfer MyDamageType AmmoName LightHueDamage MaxSpeed SplashJumpFlyingCheckFutureSight GiveAmmo AmbientSound SoundVolume LightTypebUnlitDesiredRotation AnimSequence LifeSpan ProcessTouchLightBrightness SoundRadiusbFixedRotationDir SoundPitch LightEffect RotationRatebBounce DrawScale PlayIdleAnim DeathMessageFinish AdjustAim PlayRecoilRenderOverlaysSetHandRenderTexture BecomeItemCheckReplacementCollisionHeightPickupMessage ForceFire ForceAltFire RateSelf PostRender ShakeViewSwitchToBestWeapon CueBallArena AltFireSound CockingSound FireOffsetProjectileClass RocketPackLoad5Load6Load2Rotate1 FiringSpeedRotate2Load3 bNoSmoothRotate4bSplashDamage AmmoStringbRecommendSplashDamagebAltWarnTargetFire4WeaponDescription NameColorAltRefireRateColor AIRating RefireRateIcon BobDampingPlayerViewScalePlayerViewOffsetAutoSwitchPriority shaketimeLoad4 AdjustTossRotate5 shakemag shakevertAltProjectileClassSuggestAttackStyle Misc3Sound Misc2SoundInventoryGroup ReplaceWith bWarnTarget ItemNameClientInstantFlashbAlwaysInstant SelectSoundPool FireEffectload1 bRapidFire PickupSound StatusIconBouncyRocketsPickupViewMeshPlayerViewMesh WeaponNameThirdPersonMesh fastbouncersDefaultWeapon Misc1SoundFire1 UT_Eightball WeaponStringPickupAmmoCount HeadRegion AccelerationbDamageTriggeredRate VelocityEnemyNewZone HitNormalbestAimPRegionYBaseStartratingTarget bForceFire DeltaTime InstigatorZoneWbSuperRelevantValue BestTarget NotifyActorClipY PlayerOwner HitLocation MoveTargetNumhand bNetOwner TimerCounter TimerRateTextureCanvas PawnOwner ScriptTextOther AmmoType bPointingSoundDampeningSetPosLevelbForceAltFirebOwnsCrosshairAltProjectileSpeedDirXMoverCalcDrawOffsetProjectileSpeed ViewRotationbHighDetailModeStyleZNetModeOwner bDropDetailTex bestDist AmmoAmountBYawRGUSizebFire bAltFireSkillClipX bWaterZoneRole Rotation ReturnValueIconsDynamicLoadObjectClassPackage TextBufferMutator aimerrorObjectLoadingtrailIgnite Eightball WaterRingLodMesh enemyDist enemyDir oldTargetVel2DAnglePickups WeaponPickup Crosshair6 EightAltFire BarrelMove SeekLock SeekLost SelectingRocketsLoaded RocketRad bFireLoad bTightWad LockedTarget bRetreatingETarget FireLocation StartLocFireRot DupRocketsRandRot GrenadeFloor bHitWater SmokeRateSeekingbRing bWaterStartNumExtraRocketsC NumWallHitsbCanHitInstigatorTournamentPlayerWeapon Function LevelInfoS bLockedOn Projectile PointRegion ZoneInfoTournamentWeaponState DrawIconHealth LocationStruct UnrealShare StrPropertyStructProperty NamePropertyObjectPropertyUT_SpriteSmokePuffAmmoArenaFloatPropertyActorF HurtRadiusPlayOwnedSoundPhysics BoolPropertyScriptedTextureBitmapSound IntPropertyVSizeTournamentPickupTemp InventoryLightSmokeTrail UTSmokeTrail BlastMark WallCrackut_seekingrocketUT_SpriteBallExplosion RocketTrail RocketMk2bInstantRocketbNovice AdjustedAimXScale AffectorbCanClientFire Ammocount miniammoled LEDFont2Eightm Eight2Pick EightHand Use8ballClientRocketsLoadedWall bClientDone bRotated bPendingLockTPAimRotdiffbMultiRocketsNorm2D UTRocketRocketLauncher RocketFly1 BytePropertyFont bUseAltMode NewTarget62 */3 5H L cb0Cdd#G_enTԙ  Ren R!t"ڭ!t"ڧyrү  RRRIɑRR rC-$zDG$DF$@BB"8C0A@?)R$@QL![$ ף<;`OUMWdNX TE<ZVY:PP:0uvjJi#_]5_enTԙ  Ren R!t"ڭ!t"ڧyrү  RRRIɑRR rC-$DG$DF$AB"@C0A@?)R$@QL![$ ף<;EOUMWNX TEE<ZVY:PP:0uPI ;@%CFAH1+#8G DaAB7K"s-j thRT![]'E).pc `2IE-/::$ r*%q!3'( wW~4IE-/::$ r*%q!2'( Ya_:26-::$ -|-'% ?a a C> #  ??2  ?=r?a?'$-'q!!$ -(q!#Vq!# GV626-::$ -|-!% ?a a C> #R$@F$@?G$>D$>op]kVU]]-,%k laid down the SmAcK upon %o with the %w.C*EL W g]You got the Cueball.Z] CueballK:*@ fJ$@I$y?ehcbH!{Sf$ A(Gb%q3G-'-'+r*K.E&q!/ @U'-r.*q!F-"?%q!q-̌?-(,  u!&-' cSf }X%-"(-( DFR'-r.*q!F-"?%q!q-̌?-(-  ,  u!&-' FT%-"(-( xW'- (&&-' f\ MI--/-w.*%- iU86:.%%  pB$CY wAJ%%bY EQ86:.%%  {_T- '&  f j~3"&-"'v! ,Ch)Y -' `Ki.Y -' MQH3Y( vqT `*n9.  f9?X]9?,c333lL N$Cr[].r*  `3. &l%%r3*-?, CBA% 6C6B6AA-  _%D'-m O%D'-w3* "&b- *-("w*8.w* w8*-("8*-(-'/@i- - /@-b&K%-b$%կ /@Bկ /?,AC?,$%-  ?%G ?, -6D?6 ?X `@ -6D?6 ?,?X66&w*+a !$++# ?%+ fff?L>,a  !$,',-,-c' ?%, fff?L>51a  !$1! ,-1-v'5 ?%1 fff?L> 1?x-(-( R?fM>-%?%&-' *^ ?e 8]a$Q?a/!m?a/!X?UTPool.CueBall(a$' UBHrw*-'b.a$.w.* 333?.):.9. -.$- '&q!! ufw* r*a$.-(u*-(-( UTJ"!+ea/!'.l?.[̾#"DC>Cw*_-  $@.$@.- - aJHq= ?L=)aJH?L= ||3Ug~LNI--/-w.*%- ]FQ-(-( ^P-(-( [\O-w.*%f-:.%8  -:.%8 q!8 kW9$Fa u-HC??,?'?,r-$$> ף7,67&a  P6 6  6 w? 6  6 w&%#L=#L=&%#L=)#L=ի?, D_( L r*  $.akM L= FQclass fastbouncers extends projectile; #exec MESH IMPORT MESH=UTRocket ANIVFILE=MODELS\eightballrocket_a.3D DATAFILE=MODELS\eightballrocket_d.3D X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=UTRocket X=0 Y=-250 Z=-30 YAW=-64 #exec MESH SEQUENCE MESH=UTRocket SEQ=All STARTFRAME=0 NUMFRAMES=2 #exec MESH SEQUENCE MESH=UTRocket SEQ=Still STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=UTRocket SEQ=Wing STARTFRAME=1 NUMFRAMES=1 #exec TEXTURE IMPORT NAME=JuRocket1 FILE=MODELS\eightballrocket.PCX LODSET=2 #exec MESHMAP SCALE MESHMAP=UTRocket X=2.2 Y=2.2 Z=4.5 YAW=128 #exec MESHMAP SETTEXTURE MESHMAP=UTRocket NUM=1 TEXTURE=Jurocket1 #exec AUDIO IMPORT FILE="Sounds\RocketLauncher\brufly1c.Wav" NAME=RocketFly1 GROUP="RocketLauncher" var float SmokeRate; var bool bRing,bHitWater,bWaterStart,bCanHitInstigator; var int NumExtraRockets; var rockettrail trail; var int NumWallHits; simulated function Destroyed() { if ( Trail != None ) Trail.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { Trail = Spawn(class'RocketTrail',self); if ( Level.bHighDetailMode ) { SmokeRate = (200 + (0.5 + 2 * FRand()) * NumExtraRockets * 24)/Speed; if ( Level.bDropDetail ) { SoundRadius = 6; LightRadius = 3; } } else { SmokeRate = 0.15 + FRand()*(0.02+NumExtraRockets); LightRadius = 3; } SetTimer(SmokeRate, true); } simulated function Timer() { local ut_SpriteSmokePuff b; if ( Region.Zone.bWaterZone || (Level.NetMode == NM_DedicatedServer) ) Return; if ( Level.bHighDetailMode ) { if ( Level.bDropDetail || ((NumExtraRockets > 0) && (FRand() < 0.5)) ) Spawn(class'LightSmokeTrail'); else Spawn(class'UTSmokeTrail'); SmokeRate = 152/Speed; } else { SmokeRate = 0.15 + FRand()*(0.01+NumExtraRockets); b = Spawn(class'ut_SpriteSmokePuff'); b.RemoteRole = ROLE_None; } SetTimer(SmokeRate, false); } auto state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (Other.IsA('Pawn') ) Explode(HitLocation,Normal(HitLocation-Other.Location)); } simulated function HitWall (vector HitNormal, actor Wall) { local vector Vel2D, Norm2D; bCanHitInstigator = true; PlaySound(ImpactSound, SLOT_Misc, 2.0); LoopAnim('Spin',1.0); if ( (Mover(Wall) != None) && Mover(Wall).bDamageTriggered ) { if ( Role == ROLE_Authority ) Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType); Explosion(location); return; } NumWallHits++; SetTimer(0, False); MakeNoise(0.3); if ( NumWallHits > 15 ) Explosion(location); if ( NumWallHits == 1 ) { Spawn(class'WallCrack',,,Location, rotator(HitNormal)); Vel2D = Velocity; Vel2D.Z = 0; Norm2D = HitNormal; Norm2D.Z = 0; Norm2D = Normal(Norm2D); Vel2D = Normal(Vel2D); if ( (Vel2D Dot Norm2D) < -0.999 ) { HitNormal = Normal(HitNormal + 0.6 * Vel2D); Norm2D = HitNormal; Norm2D.Z = 0; Norm2D = Normal(Norm2D); if ( (Vel2D Dot Norm2D) < -0.999 ) { if ( Rand(1) == 0 ) HitNormal = HitNormal + vect(0.05,0,0); else HitNormal = HitNormal - vect(0.05,0,0); if ( Rand(1) == 0 ) HitNormal = HitNormal + vect(0,0.05,0); else HitNormal = HitNormal - vect(0,0.05,0); HitNormal = Normal(HitNormal); } } } Velocity -= 2 * (Velocity dot HitNormal) * HitNormal; } simulated function ZoneChange( Zoneinfo NewZone ) { local waterring w; if (!NewZone.bWaterZone || bHitWater) Return; bHitWater = True; if ( Level.NetMode != NM_DedicatedServer ) { w = Spawn(class'WaterRing',,,,rot(16384,0,0)); w.DrawScale = 0.2; w.RemoteRole = ROLE_None; PlayAnim( 'Still', 3.0 ); } Velocity=0.6*Velocity; } function BlowUp(vector HitLocation) { HurtRadius(Damage,220.0, MyDamageType, MomentumTransfer, HitLocation ); MakeNoise(1.0); } simulated function Explosion(vector HitLocation) { local UT_SpriteBallExplosion s; BlowUp(HitLocation); if ( Level.NetMode != NM_DedicatedServer ) { spawn(class'Botpack.BlastMark',,,,rot(16384,0,0)); s = spawn(class'UT_SpriteBallExplosion',,,HitLocation); s.RemoteRole = ROLE_None; } Destroy(); } function BeginState() { local vector Dir; Dir = vector(Rotation); Velocity = speed * Dir; Acceleration = Dir * 50; PlayAnim( 'Wing', 0.2 ); if (Region.Zone.bWaterZone) { bHitWater = True; Velocity=0.6*Velocity; } } function SetUp() { local vector X; X = vector(Rotation); Velocity = Speed * X; // Impart ONLY forward vel if (Instigator.HeadRegion.Zone.bWaterZone) bHitWater = True; } simulated function Timer() { bCanHitInstigator = true; } simulated function Explode(vector HitLocation, vector HitNormal) { local UT_SpriteBallExplosion s; s = spawn(class'UT_SpriteBallExplosion',,,HitLocation + HitNormal*16); s.RemoteRole = ROLE_None; BlowUp(HitLocation); Destroy(); } } t//======================================================================= //Pool. Makes rockets bounce around like razor blades. //======================================================================= class CueBallArena expands arena; knlvgԱ5gDsnMUTPool.CueBall~]Botpack.RocketPackjuho+ !o--) -)'::$4a "@4L>4$a!=@@? <Bclass CueBall extends tournamentweapon; #exec MESH IMPORT MESH=Eightm ANIVFILE=MODELS\Eightball2_a.3D DATAFILE=MODELS\Eightball2_d.3D X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=Eightm X=0 Y=0 Z=0 YAW=-64 ROLL=0 #exec MESH SEQUENCE MESH=Eightm SEQ=All STARTFRAME=0 NUMFRAMES=169 #exec MESH SEQUENCE MESH=Eightm SEQ=Select STARTFRAME=0 NUMFRAMES=20 RATE=33 GROUP=Select #exec MESH SEQUENCE MESH=Eightm SEQ=Still STARTFRAME=19 NUMFRAMES=1 #exec MESH SEQUENCE MESH=Eightm SEQ=Idle STARTFRAME=19 NUMFRAMES=1 #exec MESH SEQUENCE MESH=Eightm SEQ=Fire1 STARTFRAME=20 NUMFRAMES=8 #exec MESH SEQUENCE MESH=Eightm SEQ=Load1 STARTFRAME=28 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate1 STARTFRAME=35 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Load2 STARTFRAME=42 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Fire2 STARTFRAME=49 NUMFRAMES=11 #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate2 STARTFRAME=60 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Load3 STARTFRAME=67 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Fire3 STARTFRAME=74 NUMFRAMES=10 #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate3 STARTFRAME=84 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Load4 STARTFRAME=91 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Fire4 STARTFRAME=98 NUMFRAMES=11 #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate4 STARTFRAME=109 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Fire5 STARTFRAME=116 NUMFRAMES=13 #exec MESH SEQUENCE MESH=Eightm SEQ=Fire6 STARTFRAME=130 NUMFRAMES=16 #exec MESH SEQUENCE MESH=Eightm SEQ=Down STARTFRAME=146 NUMFRAMES=11 #exec MESH SEQUENCE MESH=Eightm SEQ=Load5 STARTFRAME=157 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate5 STARTFRAME=164 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=Eightm SEQ=Load6 STARTFRAME=171 NUMFRAMES=6 RATE=15 #exec TEXTURE IMPORT NAME=Eight_t FILE=MODELS\eightballpick.PCX GROUP="Skins" LODSET=2 #exec TEXTURE IMPORT NAME=Eight_t1 FILE=MODELS\eight1.PCX GROUP="Skins" LODSET=2 #exec TEXTURE IMPORT NAME=Eight_t2 FILE=MODELS\eight2.PCX GROUP="Skins" LODSET=2 #exec TEXTURE IMPORT NAME=Eight_t3 FILE=MODELS\eight3.PCX GROUP="Skins" LODSET=2 #exec TEXTURE IMPORT NAME=Eight_t4 FILE=MODELS\eight4.PCX GROUP="Skins" LODSET=2 #exec OBJ LOAD FILE=Textures\Ammocount.utx PACKAGE=Botpack.Ammocount #exec MESHMAP SCALE MESHMAP=Eightm X=0.006 Y=0.006 Z=0.012 #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=0 TEXTURE=eight_t1 #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=1 TEXTURE=eight_t2 #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=2 TEXTURE=eight_t3 #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=3 TEXTURE=eight_t4 #exec MESHMAP SETTEXTURE MESHMAP=Eightm Num=4 TEXTURE=Botpack.Ammocount.MiniAmmoled // left handed version #exec MESH IMPORT MESH=EightmL ANIVFILE=MODELS\Eightball2_a.3D DATAFILE=MODELS\Eightball2_d.3D UNMIRROR=1 UNMIRRORTEX=4 #exec MESH ORIGIN MESH=EightmL X=0 Y=0 Z=0 YAW=-64 ROLL=0 #exec MESH SEQUENCE MESH=EightmL SEQ=All STARTFRAME=0 NUMFRAMES=169 #exec MESH SEQUENCE MESH=EightmL SEQ=Select STARTFRAME=0 NUMFRAMES=20 RATE=33 GROUP=Select #exec MESH SEQUENCE MESH=EightmL SEQ=Still STARTFRAME=19 NUMFRAMES=1 #exec MESH SEQUENCE MESH=EightmL SEQ=Idle STARTFRAME=19 NUMFRAMES=1 #exec MESH SEQUENCE MESH=EightmL SEQ=Fire1 STARTFRAME=20 NUMFRAMES=8 #exec MESH SEQUENCE MESH=EightmL SEQ=Load1 STARTFRAME=28 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate1 STARTFRAME=35 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Load2 STARTFRAME=42 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Fire2 STARTFRAME=49 NUMFRAMES=11 #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate2 STARTFRAME=60 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Load3 STARTFRAME=67 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Fire3 STARTFRAME=74 NUMFRAMES=10 #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate3 STARTFRAME=84 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Load4 STARTFRAME=91 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Fire4 STARTFRAME=98 NUMFRAMES=11 #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate4 STARTFRAME=109 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Fire5 STARTFRAME=116 NUMFRAMES=13 #exec MESH SEQUENCE MESH=EightmL SEQ=Fire6 STARTFRAME=130 NUMFRAMES=16 #exec MESH SEQUENCE MESH=EightmL SEQ=Down STARTFRAME=146 NUMFRAMES=11 #exec MESH SEQUENCE MESH=EightmL SEQ=Load5 STARTFRAME=157 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate5 STARTFRAME=164 NUMFRAMES=7 RATE=15 #exec MESH SEQUENCE MESH=EightmL SEQ=Load6 STARTFRAME=171 NUMFRAMES=6 RATE=15 #exec MESHMAP SCALE MESHMAP=EightmL X=0.006 Y=0.006 Z=0.012 #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=0 TEXTURE=eight_t1 #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=1 TEXTURE=eight_t2 #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=2 TEXTURE=eight_t3 #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=3 TEXTURE=eight_t4 #exec MESHMAP SETTEXTURE MESHMAP=EightmL Num=4 TEXTURE=Botpack.Ammocount.MiniAmmoled #exec MESH IMPORT MESH=Eight2Pick ANIVFILE=MODELS\EightPick_a.3D DATAFILE=MODELS\EightPick_d.3D X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=Eight2Pick X=0 Y=170 Z=0 YAW=64 #exec MESH SEQUENCE MESH=eight2pick SEQ=All STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=eight2pick SEQ=Still STARTFRAME=0 NUMFRAMES=1 #exec MESHMAP SCALE MESHMAP=eight2pick X=0.12 Y=0.12 Z=0.24 #exec MESHMAP SETTEXTURE MESHMAP=eight2pick NUM=2 TEXTURE=Eight_t // 3rd person perspective version #exec MESH IMPORT MESH=EightHand ANIVFILE=MODELS\EightPick_a.3D DATAFILE=MODELS\EightPick_d.3D #exec MESH ORIGIN MESH=EightHand X=-5 Y=-125 Z=-30 YAW=-64 #exec MESH SEQUENCE MESH=EightHand SEQ=All STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=EightHand SEQ=Still STARTFRAME=0 NUMFRAMES=1 #exec MESHMAP SCALE MESHMAP=EightHand X=0.07 Y=0.07 Z=0.14 #exec MESHMAP SETTEXTURE MESHMAP=EightHand NUM=2 TEXTURE=Eight_t #exec TEXTURE IMPORT NAME=Crosshair6 FILE=..\unrealshare\Textures\Hud\chair6.PCX GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=Icon8ball FILE=TEXTURES\HUD\WpnRockt.PCX GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=Use8ball FILE=TEXTURES\HUD\UseRockt.PCX GROUP="Icons" MIPS=OFF var name LoadAnim[6], RotateAnim[6], FireAnim[6]; var int RocketsLoaded, ClientRocketsLoaded; var bool bFireLoad,bTightWad, bInstantRocket, bAlwaysInstant, bClientDone, bRotated, bPendingLock; var Actor LockedTarget, NewTarget, OldTarget; Replication { reliable if ( bNetOwner && (Role == ROLE_Authority) ) bInstantRocket; } function setHand(float Hand) { Super.SetHand(Hand); if ( Hand == 0 ) PlayerViewOffset.Y = 0; if ( Hand == 1 ) Mesh = mesh(DynamicLoadObject("Botpack.EightML", class'Mesh')); else Mesh = mesh'EightM'; } function BecomeItem() { local TournamentPlayer TP; Super.BecomeItem(); TP = TournamentPlayer(Instigator); bInstantRocket = bAlwaysInstant || ( (TP != None) && TP.bInstantRocket ); } simulated event RenderTexture(ScriptedTexture Tex) { local Color C; local string Temp; if ( AmmoType != None ) Temp = String(AmmoType.AmmoAmount); while(Len(Temp) < 3) Temp = "0"$Temp; C.R = 255; C.G = 0; C.B = 0; Tex.DrawColoredText( 2, 10, Temp, Font'LEDFont2', C ); } simulated event RenderOverlays( canvas Canvas ) { Texture'MiniAmmoled'.NotifyActor = Self; Super.RenderOverlays(Canvas); Texture'MiniAmmoled'.NotifyActor = None; } simulated function PostRender( canvas Canvas ) { local float XScale; Super.PostRender(Canvas); bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair ) { // if locked on, draw special crosshair XScale = FMax(1.0, Canvas.ClipX/640.0); Canvas.SetPos(0.5 * (Canvas.ClipX - Texture'Crosshair6'.USize * XScale), 0.5 * (Canvas.ClipY - Texture'Crosshair6'.VSize * XScale)); Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawIcon(Texture'Crosshair6', 1.0); Canvas.Style = 1; } } simulated function PlayLoading(float rate, int num) { if ( Owner == None ) return; Owner.PlayOwnedSound(CockingSound, SLOT_None, Pawn(Owner).SoundDampening); PlayAnim(LoadAnim[num],, 0.05); } simulated function PlayRotating(int num) { Owner.PlayOwnedSound(Misc3Sound, SLOT_None, 0.1*Pawn(Owner).SoundDampening); PlayAnim(RotateAnim[num],, 0.05); } simulated function PlayRFiring(int num) { if ( Owner.IsA('PlayerPawn') ) { PlayerPawn(Owner).shakeview(ShakeTime, ShakeMag*RocketsLoaded, ShakeVert); //shake player view PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); } if ( Affector != None ) Affector.FireEffect(); if ( bFireLoad ) PlayOwnedSound(class'RocketMk2'.Default.SpawnSound, SLOT_None, 4.0*Pawn(Owner).SoundDampening); else PlayOwnedSound(AltFireSound, SLOT_None, 4.0*Pawn(Owner).SoundDampening); if ( bFireLoad && bInstantRocket ) PlayAnim(FireAnim[num], 0.54, 0.05); else PlayAnim(FireAnim[num], 0.6, 0.05); } simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; if (AnimSequence == LoadAnim[0] ) PlayAnim('Idle',0.1,0.0); else TweenAnim('Idle', 0.5); } function float RateSelf( out int bUseAltMode ) { local float EnemyDist, Rating; local bool bRetreating; local vector EnemyDir; local Pawn P; if ( AmmoType.AmmoAmount <=0 ) return -2; bUseAltMode = 0; P = Pawn(Owner); if ( P.Enemy == None ) return AIRating; if ( (P.Base != None) && (P.Base.Velocity != vect(0,0,0)) && !P.CheckFutureSight(0.1) ) return 0.1; EnemyDir = P.Enemy.Location - Owner.Location; EnemyDist = VSize(EnemyDir); Rating = AIRating; if ( EnemyDist < 360 ) { if ( P.Weapon == self ) { if ( (EnemyDist > 230) || ((P.Health < 50) && (P.Health < P.Enemy.Health - 30)) ) return Rating; } return 0.05 + EnemyDist * 0.001; } if ( P.Enemy.IsA('StationaryPawn') ) Rating += 0.4; if ( Owner.Location.Z > P.Enemy.Location.Z + 120 ) Rating += 0.25; else if ( P.Enemy.Location.Z > Owner.Location.Z + 160 ) Rating -= 0.35; else if ( P.Enemy.Location.Z > Owner.Location.Z + 80 ) Rating -= 0.05; if ( (Owner.Physics == PHYS_Falling) || Owner.Region.Zone.bWaterZone ) bUseAltMode = 0; else if ( EnemyDist < -1.5 * EnemyDir.Z ) bUseAltMode = int( FRand() < 0.5 ); else { bRetreating = ( ((EnemyDir/EnemyDist) Dot Owner.Velocity) < -0.7 ); bUseAltMode = 0; if ( bRetreating && (EnemyDist < 800) && (FRand() < 0.4) ) bUseAltMode = 1; } return Rating; } // return delta to combat style function float SuggestAttackStyle() { local float EnemyDist; EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); if ( EnemyDist < 600 ) { if ( EnemyDist < 300 ) return -1.5; else return -0.7; } else return -0.2; } function Fire( float Value ) { local TournamentPlayer TP; bPointing=True; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { TP = TournamentPlayer(Instigator); bCanClientFire = true; bInstantRocket = bAlwaysInstant || ( (TP != None) && TP.bInstantRocket ); if ( bInstantRocket ) { bFireLoad = True; RocketsLoaded = 1; GotoState(''); GotoState('FireRockets', 'Begin'); } else if ( Instigator.IsA('Bot') ) { if ( LockedTarget != None ) { bFireLoad = True; RocketsLoaded = 1; Instigator.bFire = 0; bPendingLock = true; GotoState(''); GotoState('FireRockets', 'Begin'); return; } else if ( (NewTarget != None) && !NewTarget.IsA('StationaryPawn') && (FRand() < 0.8) && (VSize(Instigator.Location - NewTarget.Location) > 400 + 400 * (1.25 - TimerCounter) + 1300 * FRand()) ) { Instigator.bFire = 0; bPendingLock = true; GotoState('Idle','PendingLock'); return; } else if ( !Bot(Owner).bNovice && (FRand() < 0.7) && IsInState('Idle') && (Instigator.Enemy != None) && ((Instigator.Enemy == Instigator.Target) || (Instigator.Target == None)) && !Instigator.Enemy.IsA('StationaryPawn') && (VSize(Instigator.Location - Instigator.Enemy.Location) > 700 + 1300 * FRand()) && (VSize(Instigator.Location - Instigator.Enemy.Location) < 2000) ) { NewTarget = CheckTarget(); OldTarget = NewTarget; if ( NewTarget == Instigator.Enemy ) { if ( TimerCounter > 0.6 ) SetTimer(1.0, true); Instigator.bFire = 0; bPendingLock = true; GotoState('Idle','PendingLock'); return; } } bPendingLock = false; GotoState('NormalFire'); } else GotoState('NormalFire'); } } simulated function bool ClientFire( float Value ) { if ( bCanClientFire && ((Role == ROLE_Authority) || (AmmoType == None) || (AmmoType.AmmoAmount > 0)) ) { GotoState('ClientFiring'); return true; } return false; } simulated function FiringRockets() { PlayRFiring(ClientRocketsLoaded - 1); bClientDone = true; Disable('Tick'); } function AltFire( float Value ) { bPointing=True; bCanClientFire = true; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) GoToState('AltFiring'); } simulated function bool ClientAltFire( float Value ) { if ( bCanClientFire && ((Role == ROLE_Authority) || (AmmoType == None) || (AmmoType.AmmoAmount > 0)) ) { GotoState('ClientAltFiring'); return true; } return false; } function Actor CheckTarget() { local Actor ETarget; local Vector Start, X,Y,Z; local float bestDist, bestAim; local Pawn PawnOwner; local rotator AimRot; local int diff; PawnOwner = Pawn(Owner); bPointing = false; if ( Owner.IsA('PlayerPawn') ) { GetAxes(PawnOwner.ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; bestAim = 0.93; ETarget = PawnOwner.PickTarget(bestAim, bestDist, X, Start); } else if ( PawnOwner.Enemy == None ) return None; else if ( Owner.IsA('Bot') && Bot(Owner).bNovice ) return None; else if ( VSize(PawnOwner.Enemy.Location - PawnOwner.Location) < 2000 ) { Start = Owner.Location + CalcDrawOffset() + FireOffset.Z * vect(0,0,1); AimRot = rotator(PawnOwner.Enemy.Location - Start); diff = abs((AimRot.Yaw & 65535) - (PawnOwner.Rotation.Yaw & 65535)); if ( (diff > 7200) && (diff < 58335) ) return None; // check if can hold lock if ( !bPendingLock ) //not already locked { AimRot = rotator(PawnOwner.Enemy.Location + (3 - PawnOwner.Skill) * 0.3 * PawnOwner.Enemy.Velocity - Start); diff = abs((AimRot.Yaw & 65535) - (PawnOwner.Rotation.Yaw & 65535)); if ( (diff > 16000) && (diff < 49535) ) return None; } // check line of sight ETarget = Trace(X,Y, PawnOwner.Enemy.Location, Start, false); if ( ETarget != None ) return None; return PawnOwner.Enemy; } bPointing = (ETarget != None); Return ETarget; } ////////////////////////////////////////////////////// state AltFiring { function Tick( float DeltaTime ) { GoToState('FireRockets'); } function AnimEnd() { if ( bRotated ) { bRotated = false; PlayLoading(1.1, RocketsLoaded); } else { if ( RocketsLoaded == 6 ) { GotoState('FireRockets'); return; } RocketsLoaded++; AmmoType.UseAmmo(1); if ( (PlayerPawn(Owner) == None) && ((FRand() > 0.5) || (Pawn(Owner).Enemy == None)) ) Pawn(Owner).bAltFire = 0; bPointing = true; Owner.MakeNoise(0.6 * Pawn(Owner).SoundDampening); RotateRocket(); } } function RotateRocket() { if (AmmoType.AmmoAmount<=0) { GotoState('FireRockets'); return; } PlayRotating(RocketsLoaded-1); bRotated = true; } function BeginState() { Super.BeginState(); RocketsLoaded = 1; bFireLoad = False; RotateRocket(); } Begin: bLockedOn = False; } /////////////////////////////////////////////////////// state NormalFire { function bool SplashJump() { return true; } function Tick( float DeltaTime ) { if ( (PlayerPawn(Owner) == None) && ((Pawn(Owner).MoveTarget != Pawn(Owner).Target) || (LockedTarget != None) || (Pawn(Owner).Enemy == None) || ( Mover(Owner.Base) != None ) || ((Owner.Physics == PHYS_Falling) && (Owner.Velocity.Z < 5)) || (VSize(Owner.Location - Pawn(Owner).Target.Location) < 400) || !Pawn(Owner).CheckFutureSight(0.15)) ) Pawn(Owner).bFire = 0; GoToState('FireRockets'); } function AnimEnd() { if ( bRotated ) { bRotated = false; PlayLoading(1.1, RocketsLoaded); } else { if ( RocketsLoaded == 6 ) { GotoState('FireRockets'); return; } RocketsLoaded++; AmmoType.UseAmmo(1); if (pawn(Owner).bAltFire!=0) bTightWad=True; NewTarget = CheckTarget(); if ( Pawn(NewTarget) != None ) Pawn(NewTarget).WarnTarget(Pawn(Owner), ProjectileSpeed, vector(Pawn(Owner).ViewRotation)); if ( LockedTarget != None ) { If ( NewTarget != LockedTarget ) { LockedTarget = None; Owner.PlaySound(Misc2Sound, SLOT_None, Pawn(Owner).SoundDampening); bLockedOn=False; } else if (LockedTarget != None) Owner.PlaySound(Misc1Sound, SLOT_None, Pawn(Owner).SoundDampening); } bPointing = true; Owner.MakeNoise(0.6 * Pawn(Owner).SoundDampening); RotateRocket(); } } function BeginState() { Super.BeginState(); bFireLoad = True; RocketsLoaded = 1; RotateRocket(); } function RotateRocket() { if ( PlayerPawn(Owner) == None ) { if ( FRand() > 0.33 ) Pawn(Owner).bFire = 0; if ( Pawn(Owner).bFire == 0 ) { GoToState('FireRockets'); return; } } if ( AmmoType.AmmoAmount <= 0 ) { GotoState('FireRockets'); return; } if ( AmmoType.AmmoAmount == 1 ) Owner.PlaySound(Misc2Sound, SLOT_None, Pawn(Owner).SoundDampening); PlayRotating(RocketsLoaded-1); bRotated = true; } Begin: Sleep(0.0); } /////////////////////////////////////////////////////// state Idle { function Timer() { NewTarget = CheckTarget(); if ( NewTarget == OldTarget ) { LockedTarget = NewTarget; If (LockedTarget != None) { bLockedOn=True; Owner.MakeNoise(Pawn(Owner).SoundDampening); Owner.PlaySound(Misc1Sound, SLOT_None,Pawn(Owner).SoundDampening); if ( (Pawn(LockedTarget) != None) && (FRand() < 0.7) ) Pawn(LockedTarget).WarnTarget(Pawn(Owner), ProjectileSpeed, vector(Pawn(Owner).ViewRotation)); if ( bPendingLock ) { OldTarget = NewTarget; Pawn(Owner).bFire = 0; bFireLoad = True; RocketsLoaded = 1; GotoState('FireRockets', 'Begin'); return; } } } else if( (OldTarget != None) && (NewTarget == None) ) { Owner.PlaySound(Misc2Sound, SLOT_None,Pawn(Owner).SoundDampening); bLockedOn = False; } else { LockedTarget = None; bLockedOn = False; } OldTarget = NewTarget; bPendingLock = false; } Begin: if (Pawn(Owner).bFire!=0) Fire(0.0); if (Pawn(Owner).bAltFire!=0) AltFire(0.0); bPointing=False; if (AmmoType.AmmoAmount<=0) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo PlayIdleAnim(); OldTarget = CheckTarget(); SetTimer(1.25,True); LockedTarget = None; bLockedOn = False; PendingLock: if ( bPendingLock ) bPointing = true; if ( TimerRate <= 0 ) SetTimer(1.0, true); } state ClientReload { simulated function bool ClientFire(float Value) { bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceFire; } simulated function bool ClientAltFire(float Value) { bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceAltFire; } simulated function AnimEnd() { if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ) { if ( bForceFire || (Pawn(Owner).bFire != 0) ) { Global.ClientFire(0); return; } else if ( bForceAltFire || (Pawn(Owner).bAltFire != 0) ) { Global.ClientAltFire(0); return; } } GotoState(''); Global.AnimEnd(); } simulated function EndState() { bForceFire = false; bForceAltFire = false; } simulated function BeginState() { bForceFire = false; bForceAltFire = false; } } state ClientFiring { simulated function Tick(float DeltaTime) { if ( (Pawn(Owner).bFire == 0) || (Ammotype.AmmoAmount <= 0) ) FiringRockets(); } simulated function AnimEnd() { if ( !bCanClientFire || (Pawn(Owner) == None) ) GotoState(''); else if ( bClientDone ) { PlayLoading(1.5,0); GotoState('ClientReload'); } else if ( bRotated ) { PlayLoading(1.1, ClientRocketsLoaded); bRotated = false; ClientRocketsLoaded++; } else { if ( bInstantRocket || (ClientRocketsLoaded == 6) ) { FiringRockets(); return; } Enable('Tick'); PlayRotating(ClientRocketsLoaded - 1); bRotated = true; } } simulated function BeginState() { bFireLoad = true; ClientRocketsLoaded = 1; FiringRockets(); } simulated function EndState() { ClientRocketsLoaded = 0; bClientDone = false; bRotated = false; } } state ClientAltFiring { simulated function Tick(float DeltaTime) { if ( (Pawn(Owner).bAltFire == 0) || (Ammotype.AmmoAmount <= 0) ) FiringRockets(); } simulated function AnimEnd() { if ( !bCanClientFire || (Pawn(Owner) == None) ) GotoState(''); else if ( bClientDone ) { PlayLoading(1.5,0); GotoState('ClientReload'); } else if ( bRotated ) { PlayLoading(1.1, ClientRocketsLoaded); bRotated = false; ClientRocketsLoaded++; } else { if ( ClientRocketsLoaded == 6 ) { FiringRockets(); return; } Enable('Tick'); PlayRotating(ClientRocketsLoaded - 1); bRotated = true; } } simulated function BeginState() { bFireLoad = false; ClientRocketsLoaded = 1; PlayRotating(ClientRocketsLoaded - 1); bRotated = true; } simulated function EndState() { ClientRocketsLoaded = 0; bClientDone = false; bRotated = false; } } /////////////////////////////////////////////////////// state FireRockets { function Fire(float F) {} function AltFire(float F) {} function ForceFire() { bForceFire = true; } function ForceAltFire() { bForceAltFire = true; } function bool SplashJump() { return false; } function BeginState() { local vector FireLocation, StartLoc, X,Y,Z; local rotator FireRot, RandRot; local bouncyrockets r; local UT_SeekingRocket s; local fastbouncers g; local float Angle, RocketRad; local pawn BestTarget, PawnOwner; local PlayerPawn PlayerOwner; local int DupRockets; local bool bMultiRockets; PawnOwner = Pawn(Owner); if ( PawnOwner == None ) return; PawnOwner.PlayRecoil(FiringSpeed); PlayerOwner = PlayerPawn(Owner); Angle = 0; DupRockets = RocketsLoaded - 1; if (DupRockets < 0) DupRockets = 0; if ( PlayerOwner == None ) bTightWad = ( FRand() * 4 < PawnOwner.skill ); GetAxes(PawnOwner.ViewRotation,X,Y,Z); StartLoc = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; if ( bFireLoad ) AdjustedAim = PawnOwner.AdjustAim(ProjectileSpeed, StartLoc, AimError, True, bWarnTarget); else AdjustedAim = PawnOwner.AdjustToss(AltProjectileSpeed, StartLoc, AimError, True, bAltWarnTarget); if ( PlayerOwner != None ) AdjustedAim = PawnOwner.ViewRotation; PlayRFiring(RocketsLoaded-1); Owner.MakeNoise(PawnOwner.SoundDampening); if ( !bFireLoad ) { LockedTarget = None; bLockedOn = false; } else if ( LockedTarget != None ) { BestTarget = Pawn(CheckTarget()); if ( (LockedTarget!=None) && (LockedTarget != BestTarget) ) { LockedTarget = None; bLockedOn=False; } } else BestTarget = None; bPendingLock = false; bPointing = true; FireRot = AdjustedAim; RocketRad = 4; if (bTightWad || !bFireLoad) RocketRad=7; bMultiRockets = ( RocketsLoaded > 1 ); While ( RocketsLoaded > 0 ) { if ( bMultiRockets ) Firelocation = StartLoc - (Sin(Angle)*RocketRad - 7.5)*Y + (Cos(Angle)*RocketRad - 7)*Z - X * 4 * FRand(); else FireLocation = StartLoc; if (bFireLoad) { if ( Angle > 0 ) { if ( Angle < 3 && !bTightWad) FireRot.Yaw = AdjustedAim.Yaw - Angle * 600; else if ( Angle > 3.5 && !bTightWad) FireRot.Yaw = AdjustedAim.Yaw + (Angle - 3) * 600; else FireRot.Yaw = AdjustedAim.Yaw; } if ( LockedTarget != None ) { s = Spawn( class 'ut_SeekingRocket',, '', FireLocation,FireRot); s.Seeking = LockedTarget; s.NumExtraRockets = DupRockets; if ( Angle > 0 ) s.Velocity *= (0.9 + 0.2 * FRand()); } else { r = Spawn( class'bouncyrockets',, '', FireLocation,FireRot); r.NumExtraRockets = DupRockets; if (RocketsLoaded>4 && bTightWad) r.bRing=True; if ( Angle > 0 ) r.Velocity *= (0.9 + 0.2 * FRand()); } } else { g = Spawn( class'fastbouncers',, '', FireLocation,FireRot); g.NumExtraRockets = DupRockets; if (RocketsLoaded>4 && bTightWad) g.bRing=True; if ( Angle > 0 ) g.Velocity *= (0.9 + 0.2 * FRand()); } Angle += 1.0484; //2*3.1415/6; RocketsLoaded--; } bTightWad=False; bRotated = false; } function AnimEnd() { if ( !bRotated && (AmmoType.AmmoAmount > 0) ) { PlayLoading(1.5,0); RocketsLoaded = 1; bRotated = true; return; } LockedTarget = None; Finish(); } Begin: } mn b*\C?nb? 9p\e \`::$a  "@[a \[$a {s@0'r.*w.. w*r.*w.*2::$6 ?,7 . ?. J>.$q! r=Bn=9==?,2a!L>l6--)'? j2%Z%%.Kr*w*' # J==-  -?hnrn?,C,2,,L=o:a/!>6 6 ?,x>;6 6 ?,33>6 6 ?,PL=::$6 -%R6-A?R-L- 333%R-L?  >& uZ>:HZ9ZF6 --)' iw -`' yOBXa Ot?,X$ Oa xH?' P\yQZb#LGa  p//======================================================================= //Pool. Makes rockets bounce around like razor blades. //======================================================================= class Pool expands mutator; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { bSuperRelevant = 0; if( Other.IsA('UT_EightBall') && !Other.IsA('CueBall') ) { ReplaceWith( Other, "UTPool.CueBall" ); return false; } bSuperRelevant = 0; return TRUE; } X\$Fr 7%Ma!=Da&!? ~T^@lJ1p WI>&- (  dT//================================================================== //Bouncy Rockets are like rockets only they bounce around like razor //blades. //================================================================== class BouncyRockets extends projectile; #exec MESH IMPORT MESH=UTRocket ANIVFILE=MODELS\eightballrocket_a.3D DATAFILE=MODELS\eightballrocket_d.3D X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=UTRocket X=0 Y=-250 Z=-30 YAW=-64 #exec MESH SEQUENCE MESH=UTRocket SEQ=All STARTFRAME=0 NUMFRAMES=2 #exec MESH SEQUENCE MESH=UTRocket SEQ=Still STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=UTRocket SEQ=Wing STARTFRAME=1 NUMFRAMES=1 #exec TEXTURE IMPORT NAME=JuRocket1 FILE=MODELS\eightballrocket.PCX LODSET=2 #exec MESHMAP SCALE MESHMAP=UTRocket X=2.2 Y=2.2 Z=4.5 YAW=128 #exec MESHMAP SETTEXTURE MESHMAP=UTRocket NUM=1 TEXTURE=Jurocket1 #exec AUDIO IMPORT FILE="Sounds\RocketLauncher\brufly1c.Wav" NAME=RocketFly1 GROUP="RocketLauncher" var float SmokeRate; var bool bRing,bHitWater,bWaterStart,bCanHitInstigator; var int NumExtraRockets; var rockettrail trail; var int NumWallHits; simulated function Destroyed() { if ( Trail != None ) Trail.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { Trail = Spawn(class'RocketTrail',self); if ( Level.bHighDetailMode ) { SmokeRate = (200 + (0.5 + 2 * FRand()) * NumExtraRockets * 24)/Speed; if ( Level.bDropDetail ) { SoundRadius = 6; LightRadius = 3; } } else { SmokeRate = 0.15 + FRand()*(0.02+NumExtraRockets); LightRadius = 3; } SetTimer(SmokeRate, true); } simulated function Timer() { local ut_SpriteSmokePuff b; if ( Region.Zone.bWaterZone || (Level.NetMode == NM_DedicatedServer) ) Return; if ( Level.bHighDetailMode ) { if ( Level.bDropDetail || ((NumExtraRockets > 0) && (FRand() < 0.5)) ) Spawn(class'LightSmokeTrail'); else Spawn(class'UTSmokeTrail'); SmokeRate = 152/Speed; } else { SmokeRate = 0.15 + FRand()*(0.01+NumExtraRockets); b = Spawn(class'ut_SpriteSmokePuff'); b.RemoteRole = ROLE_None; } SetTimer(SmokeRate, false); } auto state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (Other.IsA('Pawn') ) Explode(HitLocation,Normal(HitLocation-Other.Location)); } simulated function HitWall (vector HitNormal, actor Wall) { local vector Vel2D, Norm2D; bCanHitInstigator = true; PlaySound(ImpactSound, SLOT_Misc, 2.0); LoopAnim('Spin',1.0); if ( (Mover(Wall) != None) && Mover(Wall).bDamageTriggered ) { if ( Role == ROLE_Authority ) Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType); explosion(location); return; } NumWallHits++; SetTimer(0, False); MakeNoise(0.3); if ( NumWallHits > 6 ) Explosion(location); if ( NumWallHits == 1 ) { Spawn(class'WallCrack',,,Location, rotator(HitNormal)); Vel2D = Velocity; Vel2D.Z = 0; Norm2D = HitNormal; Norm2D.Z = 0; Norm2D = Normal(Norm2D); Vel2D = Normal(Vel2D); if ( (Vel2D Dot Norm2D) < -0.999 ) { HitNormal = Normal(HitNormal + 0.6 * Vel2D); Norm2D = HitNormal; Norm2D.Z = 0; Norm2D = Normal(Norm2D); if ( (Vel2D Dot Norm2D) < -0.999 ) { if ( Rand(1) == 0 ) HitNormal = HitNormal + vect(0.05,0,0); else HitNormal = HitNormal - vect(0.05,0,0); if ( Rand(1) == 0 ) HitNormal = HitNormal + vect(0,0.05,0); else HitNormal = HitNormal - vect(0,0.05,0); HitNormal = Normal(HitNormal); } } } Velocity -= 2 * (Velocity dot HitNormal) * HitNormal; } simulated function ZoneChange( Zoneinfo NewZone ) { local waterring w; if (!NewZone.bWaterZone || bHitWater) Return; bHitWater = True; if ( Level.NetMode != NM_DedicatedServer ) { w = Spawn(class'WaterRing',,,,rot(16384,0,0)); w.DrawScale = 0.2; w.RemoteRole = ROLE_None; PlayAnim( 'Still', 3.0 ); } Velocity=0.6*Velocity; } function BlowUp(vector HitLocation) { HurtRadius(Damage,220.0, MyDamageType, MomentumTransfer, HitLocation ); MakeNoise(1.0); } simulated function Explosion(vector HitLocation) { local UT_SpriteBallExplosion s; BlowUp(HitLocation); if ( Level.NetMode != NM_DedicatedServer ) { spawn(class'Botpack.BlastMark',,,,rot(16384,0,0)); s = spawn(class'UT_SpriteBallExplosion',,,HitLocation); s.RemoteRole = ROLE_None; } Destroy(); } function BeginState() { local vector Dir; Dir = vector(Rotation); Velocity = speed * Dir; Acceleration = Dir * 50; PlayAnim( 'Wing', 0.2 ); if (Region.Zone.bWaterZone) { bHitWater = True; Velocity=0.6*Velocity; } } function SetUp() { local vector X; X = vector(Rotation); Velocity = Speed * X; // Impart ONLY forward vel if (Instigator.HeadRegion.Zone.bWaterZone) bHitWater = True; } simulated function Timer() { bCanHitInstigator = true; } simulated function Explode(vector HitLocation, vector HitNormal) { local UT_SpriteBallExplosion s; s = spawn(class'UT_SpriteBallExplosion',,,HitLocation + HitNormal*16); s.RemoteRole = ROLE_None; BlowUp(HitLocation); Destroy(); } } OkB---5? D`?? 5?? 5$ ?$ ,w;*;a F9 ';a u-HC??,?!?,r-$$> ף5%q! &-' q`I@USN86Ua/!(TTU  YR<$--(̌?9,q! &r.*%?r.*.$-'b?.  K&VW-W'a$@a!7?w.2*.2-::$2*8D? Da(b>D,6D&a  P6 6  6 w? 6  6 w&%#L=#L=&%#L=)#L=ի?, Qra|- r *  }VyK%:.%J:.%%-(z%.m\a?'*-(--'?%a?' $Recw w*#SA}#,#p0# 6.=,6.$6.$ea@ A# .  U@dxF@.- -Iw@*@- Nm++!m--( -('::$Ea "@EL>E$a!=@@? id F'$=.adj L= M>bjj>'>?%6]>?&.Botpack.EightML h  Sl *\C?lb? ,wF*Fa VSAe S`::$a  "@Ra SR$a M< q! ^B/K?-(  X:dn:9::?,2a!L>l6--('? Z[Q>\HQ9QF6 --(' gaV6+ .-(a/!'  0GK 606G6KN{n?& bNs0r **a/!..-*    ? 6#?*P  D?6*?6     *-*P  ի?, >  D?6*?6  > *&a0G  (w&** -w&*& q] -W' _PBYa Ph?,Y$ Pa &f 7FUr.*2>.$U:.%q! r%q! &a$.&-' Yz2X~~}D}(~5}m}Bi}nz*}u}y}}}}r}A}o}t}C}IuW~{B}tCg}SMm[CYz}W}M}'tsMo~Fn}aI_IqIw}vIX}Gt)}lC-}\I\}qzsI@C}.}V}J}Xth}y}}}@}d}ztx}}QttMB}TIjt<IeCFzE~CnnGn,Mxn|v2Ccnb}@}Y~{~`v3V!}~C{RP}RIrnanb}q}!nFCvn&n9tHCun+}pCFC[CAC`tf}K@Ls~rHcRwfHqHdtUCPI[I]}SLEkn}BHnH^nk~{}RnSn}UJav#v/IZLbndMN~NLkOCMLCLSLTCQC^nwAvpnTUCRI@CQ}OLQMrLRnn%nmLUn\nn tnntqnCxCInntpon|nhniMhIO}tenZIY}|nqnpubnenc}sLnjHee}K~QuV JZuZ VZuj cZw oZw |Zuw I[ug V[y b[T o[uX |[M H\p T\p a\T n\uk {\uY G]S S]_`]L n]~ {]I H^L T^d a^` n^uK {^} H_dwU_n Lfd Xfiwefv \muZimh xmui DnP Pn] \n^in\ wnh Doc Qoc ^om kop xop EpJ Rpi_pW mp`ypq Gqh TqJ aqD nq] {qh Grj TrG `rI mr_ yrDFspl Ts_ asN nsVzsl Htg Ut{bt`ptj ~tD JuD Wu{duu ruu\ ~uM JvgVv[ dvu  pvx }vKIwKWw` ewp rwKwK MxVZxqn hxk uxp Ayp Ny` [yp hyKuyK CzVPzin ^zk kzEwzo E{f Q{M ]{k i{u Tv{uTJ}w^~El~u  qM ~K JvWK ev ruw EvS {l HwUB"cf eu%IqIzu8C+{Qf+w2bf LTA `BlpynE Kwy%WAuA v(Bu -ja Wfz dE pyh#|F _yi#lyH!OuTppz `z lybxyQZedkgz ON[gF iu"tvu3,j~z VgMb&o'UP|s Lz Y9ZewF fF KI,XSCD+GMr&tuPsU4QQCU4TnTS+UgpF |uU4NH ;Vz Qg]A DoP`uj{ _>HZz bi#nKQH \u+|u#AgU4{hu\Tc^mwg d+qU4oT\ukCKz N,1Z9YKg d =qI,nSCZl]A I&wUua>LuHJucRudNQ+X_uMwubkD ;o,3jg]!Du/>e`c~F C>HPuzXq#RKuz @ ]Mu2,j[Public] Object=(Name=UTPool.CueBallArena,Class=Class,MetaClass=Engine.Mutator,Description="CueBallArena,All weapons and ammo replaced with CueBall!! Asshole in the corner pocket!!!") Object=(Name=UTPool.Pool,Class=Class,MetaClass=Engine.Mutator,Description="Pool,Thanx to the CueBall u can bounce your rockets around like razor blades! Asshole in the corner pocket!!!)System\Manifest.ini$System\Manifest.int$System\UTPoolReadMe.txtSystem\UTPool.uSystem\UTPool.ints