[Setup] Product=UTPool Version=200 Archive=UTPool200.umod SrcPath=. MasterPath=.. Requires=UnrealTournament400Requirement Group=SetupGroup Group=umodINIGroup Group=UTPool200Group Group=umodIncludeFilesGroup [UnrealTournament400Requirement] Product=UnrealTournament Version=400 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=580,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=451,Flags=3) [umodINIGroup] Ini=System\UnrealTournament.ini,Engine.GameEngine.ServerPackages=UTPool [UTPool200Group] File=(Src=System\UTPool.u,Size=33397) File=(Src=System\UTPool.int,Size=799) [umodIncludeFilesGroup] File=(Src=Help\UTPool200.txt,Size=2354) [Setup] LocalProduct=UTPool ReadMe=Help\UTPool200.txt SetupWindowTitle=UTPool v200 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/ *D@y^vRo)MNoneSystemUTPoolCoreEngine ExplosionBotpackBroadcastLocalizedMessageBlowUpspin FireRocketsMyDamageTypespeedFlying TakeDamage MaxSpeedHitWallAsylumCueBall pooldeathCueBallExplode BeginStateTickBeginTimerAbouncedeathDamage Apooldeath RocketPack PlayRFiringPawn AmmoStringWeaponString CheckTargetUT_EightballMomentumTransferAltProjectileClassProjectileClass AmmoName LightHueDefaultWeapon bouncedeath PlayRecoil WeaponName ItemName ReplaceWith AdjustToss SoundPitch LightRadius LightType AltFiring AmbientGlowCheckReplacementbFixedRotationDir AdjustAimDeathMessageProcessTouchPickupMessageGibbedPickupAmmoCount SoundRadiusAsylumBouncersBroadcastRegularDeathMessage AsylumPoolAsylumRocketsfastbouncersInsaneAsylumCueBallArenabAlwaysInstantPoolGrenadeDeath RocketDeath EradicatedRedeemerDeath NameColorWeaponDescription FiringSpeedbInstantRocketColorBouncyRockets bRapidFire ReturnValueStateCalcDrawOffset DeltaTimeG FunctionAltProjectileSpeedDynamicLoadObject BestTarget HitLocation TextBuffer HitNormalProjectileSpeedROtherKiller aimerrorDamageAmount bWarnTargetNetModeMutatorWeaponbSuperRelevant PlayerOwner PawnOwner LevelInfoRole bPointingbAltWarnTarget bLockedOnDeathMessageClassPackagebDamageTriggeredRotator LocationSoundDampeningViewRotation AdjustedAimPlayerReplicationInfoOwner HurtRadius FireOffsetS DamageType InventoryClassPropertyNamePropertyObjectPropertyFloatPropertyLeveltrailVel2DAngleRocketsLoaded RocketRad bFireLoad bTightWadLockedTargetFireLocation StartLocFireRot DupRocketsRandRot bHitWater SmokeRateSeekingbRing bWaterStartNumExtraRockets NumWallHitsbCanHitInstigatorBoolProperty GameInfoMoverActorVectorArena PlayerPawnClass ProjectileYawTournamentGameInfo BlastMark WallCrackut_seekingrocketUT_SpriteBallExplosion RocketTrail RocketMk2EradicatedDeathMessageWallRedeemerClass ImpactSound ScriptText bRotatedbPendingLockbMultiRocketsNorm2D IntPropertyYObjectZXSkillStructStructPropertyByteProperty RemoteRole Velocity Instigator8;7:&(90iYA#sBƯRenyrү  $D$D$A#" N )3/'E05SKXO# afsBƯRenyrү  $D$D$ B#"@ 3</'0 5S{ } JE@#.~rafyrү  $D$D 1BMF=#>yrү  $D$ E 1?"4'1$T2%6‡:TԆTԆTԄ TԆTԆTԄ TԙZZZafafafMDK]! Classification: Heavy BallisticP%$7]-,%k laid down the SmAcK upon %o with the %w.J*N9]You got the Cueball.,] Cueball.=#+*-/IK56F LACg%`I2G%6†TԆTԆTԄ TԆTԆTԄ TԙZZZ.~r.~r.~r>>>;" L$?%$7]10%k dished out the insanity upon %o with the %w.9]You got the pSyChO_BaLL.,= PsYcHoBaLLyHupqHQEO%lQ1p c24 8]I$Q2a/!"2a/!-2UTPool.CueBall(I$' l].r*  *0.&l%%r0*-?, 1/-" 616/6-A- 6"D'-m ."D'-w0* &b-*-("w*..!w*w.*-(".*-(-'&@i- -&@-?&K%-?"կ&@/կ&?,-1?,"-?%G?, -6D?6?X`@ -6D?6?,?X66&w*#a !###?%# fff?L>)a  !)F,-)-P'?%) fff?L>5$a  !$K ,-$-M'5?%$ fff?L>1?x-(-( dd%q!  ZR }! @N]\L4*4C?\b? mDg nCc% S2 a pW-<'a$@a! ?w.;*.;-::$;*D? a(b>,6&a P6 6  6 w? 6  6 w&%#L=#L=&%#L=)#L=ի?, xW-3'a$@a! ?w.8*.8-::$8*D? a(b>,6&a P666w?66w&%#L=#L=&%#L=)#L=ի?, O_t?^nO%lQ v //======================================================================= //AsylumPool. Makes rockets bounce around like razor blades. With each bounce, their damage is increased. They are speedier than normal bouncy rockets and have a strobe light. //======================================================================= class AsylumPool expands Pool; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { bSuperRelevant = 0; if( Other.IsA('UT_EightBall') && !Other.IsA('AsylumCueBall') ) { ReplaceWith( Other, "UTPool.AsylumCueBall" ); return false; } bSuperRelevant = 0; return TRUE; } w4class AsylumCueBall extends CueBall; state AltFiring { function Tick( float DeltaTime ) { if (RocketsLoaded > 0) //makes alt fire instant GoToState('FireRockets'); } } /////////////////////////////////////////////////////// state FireRockets { function BeginState() { local vector FireLocation, StartLoc, X,Y,Z; local rotator FireRot, RandRot; local AsylumRockets r; local UT_SeekingRocket s; local AsylumBouncers 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'AsylumRockets',, '', 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'AsylumBouncers',, '', 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; } Begin: }  8 a/!Ur  %''  w ''   Zw2 hPzA6f0TԆTԆTԆTԆTԆTԆTԆTԆTԆTԆTԆTԆTԆTԆTԆTԉ={TԆT<k$class fastbouncers extends rocketmk2; var float SmokeRate,damageamount; var bool bRing,bHitWater,bWaterStart,bCanHitInstigator; var int NumExtraRockets; var rockettrail trail; var int NumWallHits; 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 > 18 ) 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; } function BlowUp(vector HitLocation) { HurtRadius(Damage,180.0, MyDamageType, MomentumTransfer, HitLocation ); MakeNoise(1.0); } simulated function Timer() { bCanHitInstigator = true; } 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(); } } R!q] .r *  *9.&l%%r9*-?,   456 646566A-  6D'-m  .D'-w9*  &b -*-("w*=.!w*w=*-("=*-(-'(@i- -(@-B&K%-B!կ(@5կ(?,64?,!-?%G?, -6D?6?X`@ -6D?6?,?X66&w**a !!**#?%* fff?L>,a  !!,F,-,-P'?%, fff?L>5+a  !!+K ,-+-M'5?%+ fff?L>1?x-(-( lV>P&,NA?,&N>C?Vb? [ W-<'a$@a! ?w.:*.:-::$:*D? a(b>,6&a P6 6  6 w? 6  6 w&%#L=#L=&%#L=)#L=ի?, eoMr3Q>4 cL$W>a/!">a/!->UTPool.AsylumCueBall(L$' @BvMٴԱ+& ]UTPool.AsylumCueBall]Botpack.RocketPack(GSse%q!  J8986Ja/!HHJ  Oclass pooldeath extends TournamentGameInfo; function BroadcastRegularDeathMessage(pawn Killer, pawn Other, name damageType) { if (damageType == 'RedeemerDeath') { if ( RedeemerClass == None ) RedeemerClass = class(DynamicLoadObject("Botpack.Warheadlauncher", class'Class')); BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, RedeemerClass); } else if (damageType == 'Eradicated') BroadcastLocalizedMessage(class'EradicatedDeathMessage', 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, None); else if ((damageType == 'RocketDeath') || (damageType == 'GrenadeDeath')) BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, class'UT_Eightball'); else if (damageType == 'Gibbed') BroadcastLocalizedMessage(DeathMessageClass, 8, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, None); else if ((damageType == 'pooldeath') || (damageType == 'bouncedeath')) BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, class'Cueball'); else if ((damageType == 'Apooldeath') || (damageType == 'Abouncedeath')) BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, class'AsylumCueBall'); else { if (Killer.Weapon != None) BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, Killer.Weapon.Class); else BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, None); } } )t//======================================================================= //Pool. Makes rockets bounce around like razor blades. //======================================================================= class CueBallArena expands arena; ,|C~vgԱ+& MUTPool.CueBall]Botpack.RocketPack(%p4class CueBall extends UT_Eightball; state AltFiring { function Tick( float DeltaTime ) { if (RocketsLoaded > 0) //makes alt fire instant GoToState('FireRockets'); } } /////////////////////////////////////////////////////// state FireRockets { 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; } Begin: } r//======================================================================= //TheInsaneAsylum. Makes rockets bounce around like razor blades. With each bounce, their damage is increased. They are speedier than normal bouncy rockets and have a strobe light. //======================================================================= class InsaneAsylum expands arena;  >ay!IIr*Botpack.Warheadlauncher % _!H % *_!G!F%  _@!:, *_!!)%  %_!!%  G_6w *%  _% * WR -3' BEY5eE`::$a  "@Ca EC$a Ne -<' XkCYLF] W-3'a$@a! ?w.7*.7-::$7*D? a(b>,6&a P666w?66w&%#L=#L=&%#L=)#L=ի?, n//======================================================================= //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; } Tbj ~( jclass asylumrockets extends bouncyrockets; auto state flying { 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; } function BlowUp(vector HitLocation) { local float damageamount; if (numwallhits <4) damageamount = 20 * (numwallhits * 2 + 1); HurtRadius(DamageAmount,190.0, MyDamageType, MomentumTransfer, HitLocation ); MakeNoise(1.0); } } Z(//================================================================== //Bouncy Rockets are like rockets only they bounce around like razor blades. //================================================================== class BouncyRockets extends rocketmk2; var float SmokeRate, DamageAmount; var bool bRing,bHitWater,bWaterStart,bCanHitInstigator; var int NumExtraRockets; var rockettrail trail; var int NumWallHits; auto state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (other.isa('Pawn')) { if ((other == instigator) && (numwallhits > 0)) Explode(HitLocation,Normal(HitLocation-Other.Location) ); else if (other != instigator) 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 > 8 ) 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 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(); } simulated function Timer() { bCanHitInstigator = true; } } WGU@P&, @ A?,&@C?Ub? tclass asylumbouncers extends fastbouncers; auto state flying { 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; } function BlowUp(vector HitLocation) { local float damageamount; if (numwallhits <10) damageamount = 10 * (numwallhits * 2 + 1); HurtRadius(DamageAmount,150.0, MyDamageType, MomentumTransfer, HitLocation ); MakeNoise(1.0); } } [DVeD`::$a  "@Aa DA$a ppp_[_t__"x\_f_y_@_`y|ys_VrF_Z@wxrXIAu_h@Jyv_e_Xra_A___[XH_R@xr#~o _Y_fR_r_b@}yzA_d_^_jzkyuXqAa_]Xn@lVy_e~kVAWALVSA]z{AtAw@f@BAvAsXcXnXmzd_}R _zXlXo_gR2VVrU_c@RV8VX_V_iV4~_V>V]\F0[\S0\`0l\m0RE z0jE F1]qR1q_1`l1lqy1[qF2jiS2Ri`2| m2V y2V E3AyQ3_J6OEW6RM\9[Dj9jMw9DE:]DR:lD_:@}l:jNi<=|v<RN r>RK~>jLK?a_X?jKe?RLr?R{?RUL@OY@RG hFaZtFjG AGR^MGj{ZGjUgGj^tGRuAHRYNHRs[HRhhHRvuHQ_BIWPIjv]IjsjIjuwIjDJ]jQJjh^JljkJ[jxJWEKjYRKt__KRp mKb yK{ELjp RL{^LZkLZyLUGM%mTMxZASQgNSx_\SUjStgwSSETkb RTEk^TSIVO4aVVTTwWZ)Kf% 9tfZmgkZ{gY8Ih+Ai+li%2+WjXkBkWZmqYkzqO?lex^m4A QzGm4B5RX8oTZG2+CPnST {bGDTCXT fm4v$rRVhW~[kUQ@QMbZtQ gPsT @wT LQ^4gXCBSMSb)`Y8BIQQ Kfm4ZWROq~m4~jO}CKJ%m4{4Uvm4}Pf>UMY"bYiDX"mX+OY+z]keOm4yPTG 9Im4uBm4e(wWW\m4sXir[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!!!) Object=(Name=UTPool.InsaneAsylum,Class=Class,MetaClass=Engine.Mutator,Description="InsaneAsylum,All weapons and ammo replaced with PsYcHoBaLL!! Inspired by Asylum Escapee. Go CrAzY!!!!") Object=(Name=UTPool.AsylumPool,Class=Class,MetaClass=Engine.Mutator,Description="AsylumPool, PsYcHoBaLL: Inspired by Asylum Escapee. They are speedier than normal bouncy rockets. With each bounce, their damage is increased. Go CrAzY!!!!")UTPool v200 ReadMe---------------------------------------------------------------------------------- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- ----------------------------------------------------------------------------------------------------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 just run the file... ---------------------------------------------------------------------------------------------------- Version History -12/14/99. v100 added cueball and cueball arena .. -12/17/99. v150 added PsYcHoBaLL and Insane Asylum. Fixed the blow-up-in-your-face bug. .. -12/18/99. v155 added fun ;) by upping the damage done by asylum rockets and bouncers. .. --12/18/99. v200 added deathmessages and balanced gameplay with the Asylum mode. ---------------------------------------------------------------------------------------------------- Version Details: DeathMessages added. ---------------------------------------------------------------------------------------------------- Special Thanks to: JbP drunken master beppo anyone else from the mutator message board i forgot to mention -all for scripting help and inpuy AsylumEscapee -For the great idea Epic and GT Interactive -Making such a cool game ---------------------------------------------------------------------------------------------------- Plans for things to come ...i will probably add an entry to the mod menu allowing you to customize everything (damage, bounces, colors, lights, etc.) ...in a future version, you might see a "King of the Hill" mode in which there is one PsYcHoBaLL and the rest are CueBalls. the object would be to obtain and control the PsYcHoBaLL (which is better than cueball) to be the king of the hill... ---------------------------------------------------------------------------------------------------- -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/18/99System\Manifest.iniSystem\Manifest.intSystem\UTPool.uuSystem\UTPool.intHelp\UTPool200.txt'2 Y BU