[Setup] Product=Cluster Redeemer Version=1 Archive=Cluster Redeemer.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=Cluster RedeemerGroup Group=umodIncludeFilesGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=507,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=518,Flags=3) [Cluster RedeemerGroup] File=(Src=System\ClusterRedeemer.u,Size=34828) File=(Src=System\ClusterRedeemer.int,Size=184) [umodIncludeFilesGroup] File=(Src="Cluster Readme.htm",Size=8970) [Setup] LocalProduct=Cluster Redeemer ReadMe=Cluster Readme.htm SetupWindowTitle=Cluster Redeemer Setup AutoplayWindowTitle=Cluster Redeemer Options ProductURL=http://unreal.epicgames.com VersionURL=http://unreal.epicgames.com Developer=Unholy Smoke DeveloperURL=http://unreal.epicgames.com [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ *E/@}hz`|t֛i6MqY}/NoneClusterRedeemerSystemEngineCoreFire RemoteRole BeginStatePostBeginPlayTick PlayerPawn ExplosionVectorAltFireMeshExplode WarnCannonsBlowUpExplosionDecalMomentumTransferWingIn TrackWarheadTimerHitWallBotpackBeginGuiding Finishing MyDamageTypespeedDamageClientAdjustGlow ReplaceWith ZoneChange ProcessTouch DrawScalebUnlit PostRenderClientAltFire PlayFiringCollisionRadiusCollisionHeightLandedRotatorColorAmmo DestroyedTexture UnrealShare EndStateClusterGrenadeClusterWarHeadAmmoClusterWarExplosionClusterWarShell TakeDamage BeginPlayPlayerViewMeshPickupViewMeshStuffbBigExplosionClusterRedeemerMutatorRedeemerDeath InstFlashTournamentWeaponInstFogPriorityObjectiveWeaponDescription FireEffect TeamCannon ItemName EffectSound1 SelectSound FireSound SoundVolume DrawType ImpactSoundSetHand LifeSpanMaxAmmoProjectileClass ShakeViewbNetTemporary bProjTargetIdle DeathMessagePhysicsSetWeaponStayProjectileFire RateSelfWarheadLauncherPickupMessageUseAmmo PlayRecoil bSpecialIcon SoundRadiusbFixedRotationDir RespawnTimeCheckReplacement AnimSequence NumFrames FiringSpeedClientSetRotationStyle AmbientGlowbAltWarnTarget LightRadiusDesiredRotationbBounce LightEffect StatusIconThirdPersonMesh PickupSoundPause bNoSmooth WarHeadAmmo AmbientSound FireOffset GrenadeDeathSuggestAttackStyle AmmoName NameColorAltRefireRate AIRating RefireRateIcon BobDampingPlayerViewOffsetAutoSwitchPriority shaketimeFlying shakemag shakevert bWarnTargetInventoryGroup TeamGamePlusbCorona ReloadCountPickupAmmoCount MaxStuffbSplashDamageSetPos DrawIconLevelProjectileSpeed HurtRadiusSoundDampening LocationPlayOwnedSound Momentum HitLocationClass ByteProperty HitNormal Acceleration PointRegion ZoneInfo bTeamGameEnemyCanvasRegion InstigatorEffectsZonePackage nextPawnOwner bDropDetail InventorySoundNetMode PawnListbSuperRelevantValueClipYoWeaponMutatorB bIsPlayerCountTeamhandBot bUseAltModePPawnLodMesh AmmoType bPointing bNetOwnerOther bWeaponStaybOwnsCrosshair bHideWeaponActor DeltaTime DamageTypePlayerReplicationInfoAltProjectileClass TextBuffer ViewRotationRolebHighDetailMode AmmoAmountStaticObject RandSpin FunctionWall MaxSpeedClipX bWaterZoneState ViewTargetScroll OldClipYIcons OldClipXStructStructPropertyAAnimSpriteEffecttrailClassProperty Eightball WaterRing bCanFirePickups WeaponPickupGeneralNDamageRandRot GrenadeFloor bCanHitOwner bHitWater SmokeRateNumExtraGrenades InitialDirExpl03 NamePropertyXEZYWi HeadRegion VelocityGameUT_SpriteSmokePuffObjectPropertyFloatProperty BoolProperty IntPropertyTournamentAmmoTournamentPickupTargetmissileLightSmokeTrail UTSmokeTrail BlastMark ScriptTextUT_BlackSmokeUT_SpriteBallExplosionRedeemertrail NuclearMarkGuidedWarshell UT_Sparks LadrStatic Static_A00XScale AffectorbCanClientFireWarHeadWHPickWHHandReadoutGuidedX Redeemer WarheadShotWarheadPickupUseWarH GuidedShell GuidingPawn bGuiding bShowStaticStartRotation numReadoutsWarFly CannonTimerGuider UTGrenadeWarExplosionS WarExplowe_a00S GameInfo ReturnValue Projectile Rotation LevelInfo instigatedByNewZone  Ey2;ʢN_qUmOjqUmqUmqUmʺ!1!t"ڙ!t"ڈqUmqUmqUmggg1$zD$B"PuKUb#$ ף<$k_j:+."   D #!  9'5 V- 0#a/! - [&.P-'. \'.W-a..&q! %+vu^i5#1_ԝX11!t"ڙ!t"ڈqUmggggggg- 1qUmqUmqUmI;:"dJ"$C$zD"=QSsgN$^dI($pA)$AR2f4z327#L#!N"KZY$]Ovj  HI<BQ=$:eԝXԝXԝXԝXG|4C(5 hWqUm0c"p$L=FM$?Jf/#$333@l i GS@TH//============================================================================= // ClusterGrenade. //============================================================================= //Welcome to the first version of Unholy Smoke's 'Cluster Redeemer' Unreal //Tournament Mutator. Let it be known that almost all the code in this mutator //is either copied from the Unreal source code, or stolen (!) from other //people's stuff. Now that that's out of the way, let's get going. I've //annotated the code as well as I can. As with any mutator, don't be too scared //to play with a few numbers or settings, but don't go over the top. It's not //my fault if all your system gets screwed up. Stay within the bounds of //reason, and keep in mind your system - processor, RAM and graphics card //when going over those grenade numbers! class ClusterGrenade extends Projectile; var bool bCanHitOwner, bHitWater; var float Count, SmokeRate; var int NumExtraGrenades; simulated function PostBeginPlay() { local vector X,Y,Z; local rotator RandRot; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) PlayAnim('WingIn'); SetTimer(2.5+FRand()*10,false); //This bit is the timer for the //grenades. The 'FRand' simply //calls up a random number between //0 and 1, adding the random //element to the fuses. The //2.5 and the 10 mean that the //grenade will go off within a //certain time limit. I advise //changing the 10. Higher for a //longer fuse, and vice versa. Keep //it sane! if ( Role == ROLE_Authority ) { GetAxes(Instigator.ViewRotation,X,Y,Z); Velocity = X * (Instigator.Velocity Dot X)*0.4 + Vector(Rotation) * (Speed + FRand() * 150); // FRand() * 100); //This is the original of the above line Velocity.z += 210; MaxSpeed = 1500; //This sets the grenade's maximum speed. RandSpin(50000); bCanHitOwner = False; if (Instigator.HeadRegion.Zone.bWaterZone) { bHitWater = True; Disable('Tick'); Velocity=0.6*Velocity; //How much will it slow when hitting water? //Stay between 0 and 1 } } } simulated function BeginPlay() { if ( Level.bHighDetailMode && !Level.bDropDetail ) SmokeRate = 0.03; else SmokeRate = 0.15; } simulated function ZoneChange( Zoneinfo NewZone ) { local waterring w; if (!NewZone.bWaterZone || bHitWater) Return; bHitWater = True; w = Spawn(class'WaterRing',,,,rot(16384,0,0)); w.DrawScale = 0.2; w.RemoteRole = ROLE_None; Velocity=0.6*Velocity; } simulated function Timer() { Explosion(Location+Vect(0,0,1)*16); } simulated function Tick(float DeltaTime) { local UT_BlackSmoke b; if ( bHitWater || Level.bDropDetail ) { Disable('Tick'); Return; } Count += DeltaTime; if ( (Count>Frand()*SmokeRate+SmokeRate+NumExtraGrenades*0.03) && (Level.NetMode!=NM_DedicatedServer) ) { b = Spawn(class'UT_BlackSmoke'); b.RemoteRole = ROLE_None; Count=0; } } simulated function Landed( vector HitNormal ) { HitWall( HitNormal, None ); } simulated function ProcessTouch( actor Other, vector HitLocation ) { if ( (Other!=instigator) || bCanHitOwner ) Explosion(HitLocation); } simulated function HitWall( vector HitNormal, actor Wall ) { bCanHitOwner = True; Velocity = 0.9*(( Velocity dot HitNormal ) * HitNormal * (-2.0) + Velocity); // See the 0.9 in there? RandSpin(100000); //That's how much a grenade speed = VSize(Velocity); //will slow when it hits a wall if ( Level.NetMode != NM_DedicatedServer ) //decrease to make it bounce less, PlaySound(ImpactSound, SLOT_Misc, 1.5 ); //increase for the opposite. A number if ( Velocity.Z > 400 ) //more than 1 will make it speed up! Velocity.Z = 0.5 * (400 + Velocity.Z); else if ( speed < 20 ) { bBounce = False; SetPhysics(PHYS_None); } } /////////////////////////////////////////////////////// function BlowUp(vector HitLocation) { HurtRadius(damage, 200, 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(); } {F9>a>( c//Welcome to the first version of Unholy Smoke's 'Cluster Redeemer' Unreal //Tournament Mutator. Let it be known that almost all the code in this mutator //is either copied from the Unreal source code, or stolen (!) from other //people's stuff. Now that that's out of the way, let's get going. I've //annotated the code as well as I can. As with any mutator, don't be too scared //to play with a few numbers or settings, but don't go over the top. It's not //my fault if all your system gets screwed up. Stay within the bounds of //reason, and keep in mind your system - processor, RAM and graphics card //when going over those grenade numbers! //Don't play with any of this unless you know your way around class ClusterWarExplosion extends AnimSpriteEffect; simulated function PostBeginPlay() { local actor a; Super.PostBeginPlay(); if ( !Level.bHighDetailMode ) Drawscale = 1.9; PlaySound (EffectSound1,,12.0,,3000); Texture = Default.Texture; } |//Welcome to the first version of Unholy Smoke's 'Cluster Redeemer' Unreal //Tournament Mutator. Let it be known that almost all the code in this mutator //is either copied from the Unreal source code, or stolen (!) from other //people's stuff. Now that that's out of the way, let's get going. I've //annotated the code as well as I can. As with any mutator, don't be too scared //to play with a few numbers or settings, but don't go over the top. It's not //my fault if all your system gets screwed up. Stay within the bounds of //reason, and keep in mind your system - processor, RAM and graphics card //when going over those grenade numbers! //All newbies - this is the bit that actually replaces the normal redeemer with //the cluster one. Don't fiddle unless you know your stuff class ClusterRedeemerMutator expands Mutator; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (Other.IsA('TournamentWeapon')) { if (Other.IsA('WarHeadLauncher')) { ReplaceWith(Other, "ClusterRedeemer.ClusterRedeemer"); return false; } } else if (Other.IsA('Ammo')) { if (Other.IsA('WarHeadAmmo')) { ReplaceWith(Other, "ClusterRedeemer.ClusterWarHeadAmmo"); return false; } } return true; } aYa/!?Va/!Y ClusterRedeemer.ClusterRedeemer(a/!-a/!r ClusterRedeemer.ClusterWarHeadAmmo(' a  -' .?S - Bw*! #?-'q! "Fr * a G??6-::$a( --a a C>"a "$a( Upҥ$a?-' /!)mk/-6-a "@L>$ FNw*}a/!Da!bq! \ Q("31w(%%(  &e&o-/::$ r*%Vw*C$@.'( n,Lu m,?,-' "-(666666?,d T<::$ C?<-#%ޖ'&a  a@(a  a@(a  a@(a  a@(a  a@(a  a@(@$a R:6[:,a  @-#%Ȗ'&a  a@(a  a@(a  a@(a  a@(a  a@(a  a@(*C?.$a "W>9,::$?,2 _;XP1 .Mr*%r*;% w*- w w R-3::)   ?Ia/!F(:. A, b$      ?@?|33> Ja//Welcome to the first version of Unholy Smoke's 'Cluster Redeemer' Unreal //Tournament Mutator. Let it be known that almost all the code in this mutator //is either copied from the Unreal source code, or stolen (!) from other //people's stuff. Now that that's out of the way, let's get going. I've //annotated the code as well as I can. As with any mutator, don't be too scared //to play with a few numbers or settings, but don't go over the top. It's not //my fault if all your system gets screwed up. Stay within the bounds of //reason, and keep in mind your system - processor, RAM and graphics card //when going over those grenade numbers! //Here's where the fun starts. This file contains all the meaty details about the //actual redeemer projectile - speed, damage, contents, the lot. Try not to edit //stuff unless you know what it's gonna do. class ClusterWarShell extends Projectile; var float CannonTimer, SmokeRate; var redeemertrail trail; var bool bBigExplosion; var int Stuff,MaxStuff; simulated function Timer() { local ut_SpriteSmokePuff b; if ( Trail == None ) Trail = Spawn(class'RedeemerTrail',self); CannonTimer += SmokeRate; if ( CannonTimer > 0.6 ) { WarnCannons(); CannonTimer -= 0.6; } if ( Region.Zone.bWaterZone || (Level.NetMode == NM_DedicatedServer) ) { SetTimer(SmokeRate, false); Return; } if ( Level.bHighDetailMode ) { if ( Level.bDropDetail ) Spawn(class'LightSmokeTrail'); else Spawn(class'UTSmokeTrail'); SmokeRate = 152/Speed; } else { SmokeRate = 0.15; b = Spawn(class'ut_SpriteSmokePuff'); b.RemoteRole = ROLE_None; } SetTimer(SmokeRate, false); } simulated function Destroyed() { if ( Trail != None ) Trail.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { SmokeRate = 0.3; SetTimer(0.3,false); } function WarnCannons() { local Pawn P; for ( P=Level.Pawnlist; P!=None; P=P.NextPawn ) if ( P.IsA('TeamCannon') && !P.IsInState('TrackWarhead') && P.LineOfSightTo(self) ) { P.target = self; P.GotoState('TrackWarhead'); } } singular function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, vector momentum, name damageType ) { local int i; if ( NDamage > 5 ) { PlaySound(Sound'Expl03',,6.0); // spawn(class'ClusterWarExplosion',,,Location); //THIS IS THE BIT THAT MAKES THE REDEEMER EXPLOSION!! To turn the shockwave back on, delete the two slashes at THE VERY BEGINNING OF THIS line, before where it says 'spawn etc.'. I prefer it off since it keeps performance up on my machine. if (bBigExplosion) { for (i=0; i<(Stuff+(Rand(MaxStuff-Stuff))+1); i++) { //Okay, here's the fun part. The bits below are what comes out when the redeemer goes off. //The lines containing 'MTracer' and 'flakslug' are foreslashed out. to bring them in, delete //the slashes. To add more of anything, just copy the line below, for the same amount again. //HOWEVER, anything you do here MUST be repeated in the identical selection further down this //page. The difference is that this one defines what happens when the redeemer is shot in mid-air, //and the next says what happens when it hits a surface. You can make them different if you want. Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'UT_Sparks',,,Location,RotRand(False)); //Nice Sparks // Spawn(class'MTracer',,,Location,RotRand(False)); //Minigun-style tracer fire // Spawn(class'flakslug',,,Location,RotRand(False)); //Flak-cannon flak } } HurtRadius(Damage,350.0, MyDamageType, MomentumTransfer, HitLocation ); RemoteRole = ROLE_SimulatedProxy; Destroy(); } } auto state Flying { simulated function ZoneChange( Zoneinfo NewZone ) { local waterring w; if ( NewZone.bWaterZone != Region.Zone.bWaterZone ) { w = Spawn(class'WaterRing',,,,rot(16384,0,0)); w.DrawScale = 0.2; w.RemoteRole = ROLE_None; } } function ProcessTouch (Actor Other, Vector HitLocation) { if ( Other != instigator ) Explode(HitLocation,Normal(HitLocation-Other.Location)); } function Explode(vector HitLocation, vector HitNormal) { local int i; if ( Role < ROLE_Authority ) return; HurtRadius(Damage,500.0, MyDamageType, MomentumTransfer, HitLocation ); // spawn(class'ShockWave',,,HitLocation+ HitNormal*16); //AND THIS BIT TOO if (bBigExplosion) { for (i=0; i<(Stuff+(Rand(MaxStuff-Stuff))+1); i++) { //Okay, here's the fun part. The bits below are what comes out when the redeemer goes off. //The lines containing 'MTracer' and 'flakslug' are foreslashed out. to bring them in, delete //the slashes. To add more of anything, just copy the line below, for the same amount again. //HOWEVER, anything you do above MUST be repeated in this section. The difference is that that //one defines what happens when the redeemer is shot in mid-air, and this says what happens when //it hits a surface. You can make them different if you want. Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'ClusterGrenade',,,Location,RotRand(False)); Spawn(class'UT_Sparks',,,Location,RotRand(False)); //Nice Sparks // Spawn(class'MTracer',,,Location,RotRand(False)); //Minigun-style tracer fire // Spawn(class'flakslug',,,Location,RotRand(False)); //Flak-cannon flak } } } RemoteRole = ROLE_SimulatedProxy; Destroy(); } function BeginState() { local vector InitialDir; initialDir = vector(Rotation); if ( Role == ROLE_Authority ) Velocity = speed*initialDir; Acceleration = initialDir*50; } } `%' A----0- $0 Ca/! .*  % DD??D D8?? ?,???,-$$ !,, %? !?? ,   % ?  V^ -( &SM  .%::$a!a @?, (::$ 54 >9?,6?,DPCG-(6 --'v! ? jm- ::$2=cT&̻ ɏ ɃԝX ɏ ɚuÚuæѸBXu6腩gԝXѸB ɅguÏ ɚuÅgѸBL]L]qUmggqUmw㴢L]{#Ug{#UggqUmw㴈qUmcmgggL]gxxxxxԝX ɚuÉxxxxqUmxxxxxB]&%Classification: Thermonuclear Device>$̾@: mD"DCw7HI"DhK]d$?t: A O1B$C@$L>C$@z$?{$>y$>HGT],+%o was Reedeemed in a big way by %k's %w!!x*, E Z]You got the Cluster Redeemer.E]Cluster Redeemer`$B~: ff??8}$y?9nmo|qS($4B)$Adb7AC6--<A> g8!K !8-- -'a "@L>$? X[ADQV//Welcome to the first version of Unholy Smoke's 'Cluster Redeemer' Unreal //Tournament Mutator. Let it be known that almost all the code in this mutator //is either copied from the Unreal source code, or stolen (!) from other //people's stuff. Now that that's out of the way, let's get going. I've //annotated the code as well as I can. As with any mutator, don't be too scared //to play with a few numbers or settings, but don't go over the top. It's not //my fault if all your system gets screwed up. Stay within the bounds of //reason, and keep in mind your system - processor, RAM and graphics card //when going over those grenade numbers! class ClusterRedeemer expands TournamentWeapon; #exec OBJ LOAD FILE=..\Textures\LadrStatic.utx PACKAGE=Botpack.LadrStatic var GuidedWarShell GuidedShell; var int Scroll; var PlayerPawn GuidingPawn; var bool bGuiding, bCanFire, bShowStatic; var rotator StartRotation; replication { // Things the server should send to the client. reliable if( bNetOwner && (Role==ROLE_Authority) ) bGuiding, bShowStatic; } function SetWeaponStay() { bWeaponStay = false; // redeemer never stays } simulated function PostRender( canvas Canvas ) { local int i, numReadouts, OldClipX, OldClipY; local float XScale; bOwnsCrossHair = ( bGuiding || bShowStatic ); if ( !bGuiding ) { if ( !bShowStatic ) return; Canvas.SetPos( 0, 0); Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawIcon(Texture'LadrStatic.Static_a00', FMax(Canvas.ClipX, Canvas.ClipY)/256.0); if ( Owner.IsA('PlayerPawn') ) PlayerPawn(Owner).ViewTarget = None; return; } GuidedShell.PostRender(Canvas); OldClipX = Canvas.ClipX; OldClipY = Canvas.ClipY; XScale = FMax(0.5, int(Canvas.ClipX/640.0)); Canvas.SetPos( 0.5 * OldClipX - 128 * XScale, 0.5 * OldClipY - 128 * XScale ); if ( Level.bHighDetailMode ) Canvas.Style = ERenderStyle.STY_Translucent; else Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawIcon(Texture'GuidedX', XScale); numReadouts = OldClipY/128 + 2; for ( i = 0; i < numReadouts; i++ ) { Canvas.SetPos(1,Scroll + i * 128); Scroll--; if ( Scroll < -128 ) Scroll = 0; Canvas.DrawIcon(Texture'Readout', 1.0); } } function float RateSelf( out int bUseAltMode ) { local Pawn P, E; local Bot O; O = Bot(Owner); if ( (O == None) || (AmmoType.AmmoAmount <=0) || (O.Enemy == None) ) return -2; bUseAltMode = 0; E = O.Enemy; for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.bIsPlayer && (P != O) && (P != E) && (!Level.Game.bTeamGame || (O.PlayerReplicationInfo.Team != P.PlayerReplicationInfo.Team)) && (VSize(E.Location - P.Location) < 650) && (!Level.Game.IsA('TeamGamePlus') || TeamGamePlus(Level.Game).PriorityObjective(O) < 2) && FastTrace(P.Location, E.Location) ) { if ( VSize(E.Location - O.Location) > 500 ) return 2.0; else return 1.0; } return 0.35; } // return delta to combat style function float SuggestAttackStyle() { return -1.0; } simulated function PlayFiring() { PlayAnim( 'Fire', 0.3 ); PlayOwnedSound(FireSound, SLOT_None,4.0*Pawn(Owner).SoundDampening); } function setHand(float Hand) { if ( Hand == 2 ) { bHideWeapon = true; return; } else bHideWeapon = false; PlayerViewOffset.Y = Default.PlayerViewOffset.Y; PlayerViewOffset.X = Default.PlayerViewOffset.X; PlayerViewOffset.Z = Default.PlayerViewOffset.Z; PlayerViewOffset *= 100; //scale since network passes vector components as ints } function AltFire( float Value ) { if ( !Owner.IsA('PlayerPawn') ) { Fire(Value); return; } if (AmmoType.UseAmmo(1)) { PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); bPointing=True; Pawn(Owner).PlayRecoil(FiringSpeed); PlayFiring(); GuidedShell = GuidedWarShell(ProjectileFire(AltProjectileClass, ProjectileSpeed, bWarnTarget)); GuidedShell.SetOwner(Owner); PlayerPawn(Owner).ViewTarget = GuidedShell; GuidedShell.Guider = PlayerPawn(Owner); ClientAltFire(0); GotoState('Guiding'); } } simulated function bool ClientAltFire( float Value ) { if ( bCanClientFire && ((Role == ROLE_Authority) || (AmmoType == None) || (AmmoType.AmmoAmount > 0)) ) { if ( Affector != None ) Affector.FireEffect(); PlayOwnedSound(FireSound, SLOT_None,4.0*Pawn(Owner).SoundDampening); return true; } return false; } State Guiding { function Fire ( float Value ) { if ( !bCanFire ) return; if ( GuidedShell != None ) GuidedShell.Explode(GuidedShell.Location,Vect(0,0,1)); bCanClientFire = true; GotoState('Finishing'); } function AltFire ( float Value ) { Fire(Value); } function BeginState() { Scroll = 0; bGuiding = true; bCanFire = false; if ( Owner.IsA('PlayerPawn') ) { GuidingPawn = PlayerPawn(Owner); StartRotation = PlayerPawn(Owner).ViewRotation; PlayerPawn(Owner).ClientAdjustGlow(-0.2,vect(200,0,0)); } } function EndState() { bGuiding = false; if ( GuidingPawn != None ) { GuidingPawn.ClientAdjustGlow(0.2,vect(-200,0,0)); GuidingPawn.ClientSetRotation(StartRotation); GuidingPawn = None; } } Begin: Sleep(1.0); bCanFire = true; } State Finishing { ignores Fire, AltFire; function BeginState() { bShowStatic = true; } Begin: Sleep(0.3); bShowStatic = false; Sleep(1.0); GotoState('Idle'); } hVd ! #??, k= ] &--v!  =?9<::$$a $$ PJ;4a>-(a?q!S $A'o1 6a!>$@. l>*m6 >* s1Q-(Ow * L>#H e * o3"r '%w3- 2 &L0  0 r| %-'-(za/!  .. .L#HC q*x, -'fff?**PGt::$a$?6?6??6ʰ?,-(o$ xt6m*HC?6b? w) %e)`::$a  "@+a )+$a K //Welcome to the first version of Unholy Smoke's 'Cluster Redeemer' Unreal //Tournament Mutator. Let it be known that almost all the code in this mutator //is either copied from the Unreal source code, or stolen (!) from other //people's stuff. Now that that's out of the way, let's get going. I've //annotated the code as well as I can. As with any mutator, don't be too scared //to play with a few numbers or settings, but don't go over the top. It's not //my fault if all your system gets screwed up. Stay within the bounds of //reason, and keep in mind your system - processor, RAM and graphics card //when going over those grenade numbers! class ClusterWarheadAmmo extends TournamentAmmo; N.?w * a }GF%-33?a @A ;E ccVBcVyVOVMVlV^VjZ Vo[RVzV zNV[ze[wV{c0V[V}V?VaVJV|WVg[~VG{rVVVv|SWI{V-Oz`WiVEz{|JcVcXVhzxZZzbVpVTVHOVFVG{RWf{OP{#oOLVy}OM|fz/}KOz]zU[k{mO!zE{p{szjzdONWtO.Z+[_|A[H{QV]VDVKO"OSOV~zO|PVF/YzHzR{OOXVa{C{B|@{@OL{dzK|Dz@|zF||O|kOaOvhjdc`hhhln[v|\O%O*O'|}{QVOO6[Yzb_FO O&|rcLcsL/rMO1O VWVCceVBccVIO7OVzQzS/T/UVohWhXzAh`zccd/\fhe_^ FJ]x SJ2v`JRx VO]n cOcZ pO1k }OI~IPcV WPc[ cP]q pP1^ }P_u JQc]VQc\dQk rQ1: ~Q_N JRj VRs bRcb nRbp zR1a GSht SS_W `SQt lSi yS[m ETWu RTXu ^Tc^jT_Y xT__ DUNqPU1; ^Ulq jUTU wUc uDV1J yXT~ EYyU RYtX_Yyg mYVu zY&l FZXURZQn `Zrl mZ5[yZqU T`q~ a`brn`bs |`wU Ia3`Vahn vbl CcXf Oc]w \cWUiclC wcoX CdLl PdIi \dcv%hd<|Me4_IgIkhiE4_Hvi1-UCE4nBBE4GpBaowm!fXm GPVTal j1NvAi DcEPi!gU1D|m@i"9]c&VcL_Uizt16BnWX p]i }iBISl KcXPW1E4Uagc%c|cV#_&m BY_txUi lUl xbgE7MS!w`1A,WcE4\VC6_ IUcS^c'Bq*#sP1UV"3k&P !^PjniXTWtP e6rXD h bt7E4V V1.2lCN^|\ l[Public] Object=(Name=ClusterRedeemer.ClusterRedeemerMutator,Class=Class,MetaClass=Engine.Mutator,Description="Cluster Redeemer, Replaces the Redeemer with a Cluster-bomb Launcher") <html> <head> <title>Cluster Redeemer Readme</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body bgcolor="#FFFFFF" text="#000000" link="#FF0000"> <div align="left"> <table width="73%" border="2" align="center" height="571"> <tr> <td height="1502"> <div align="center"> <table width="36%" border="2" align="center"> <tr> <td> <div align="center"><b><font face="Arial, Helvetica, sans-serif" size="5">Cluster Redeemer Beta Version 1 Readme</font></b></div> </td> </tr> </table> <p align="center"><font face="Arial, Helvetica, sans-serif" size="2">by Unholy Smoke </font></p> <hr width="80%"> <p align="center">&nbsp;</p> <table width="75%" border="2" align="center"> <tr> <td height="42"> <p><font face="Arial, Helvetica, sans-serif" size="3">Introduction</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">Welcome to the readme for my first ever mutator - Cluster Redeemer. Basically, this mutator adds an option for a redeemer replacement - the cluster redeemer. This gun is identical in looks to the redeemer. It even looks identical when you fire it at something. However, when it goes off, something extremely different happens....</font></p> </td> </tr> </table> <p>&nbsp;</p> <table width="75%" border="2"> <tr> <td> <p><font face="Arial, Helvetica, sans-serif" size="3">Description</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">When the thing does go off, it sets off a huge explosion, and releases its contents - about two hundred grenades, flying around in all directions like angry bees, exploding on contact or after about ten seconds. However, these aren't your average grenades, They're extra-zippy, extra bouncy and extra volatile! There's nothing like rushing down a corridor trying to evade grenades as they fly around you!</font></p> </td> </tr> </table> <p>&nbsp;</p> <table width="75%" border="2"> <tr> <td> <p><font face="Arial, Helvetica, sans-serif" size="3">Internet and Network Play</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">As is stated above, this is a beta, first version. I don't promise perfect compatibility everywhere - my UT is patched to the latest version with no problems. However, the code is very simple, mostly copied from the UT source code anyway, so if the server is running the mod, it should work everywhere. I'll do a load of testing before the next release, but feedback would be brilliant - e-mail me at <a href="mailto:unholysmoke@yahoo.com">unholysmoke@yahoo.com</a></font></p> </td> </tr> </table> <p>&nbsp;</p> <table width="75%" border="2"> <tr> <td> <p><font face="Arial, Helvetica, sans-serif" size="3"> Beta 2 Wishlist</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">In one version, there'll definitely be some form of UWindows menu to play with the settings. When I figgers out how dat wurks. Till then, here's what I'm gonna try to get going for later:</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- Better code. This is really just a test to see whether this is worth doing. There's probably already a better version of this mutator out there somewhere.</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- Options for what comes out when the projectile goes off. For now, you'll just have to have a look at my notes in the code itself.</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- A number of grenades slider. This should be the best place to start on a UWindows menu, and then I'll put more stuff in later. Imagine a cluster redeemer containing rockets, flack, tracer fire, grenades, biosludge, more redeemers....</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- Fixed Death Messages - Not 'Smacked down by whoever's Rocket Launcher. Shouldn't take too much work.</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- The secondary fire doesn't work. I know that this would really rock, so I'll try to get this sorted.</font></p> </td> </tr> </table> <p>&nbsp;</p> <table width="75%" border="2"> <tr> <td> <p><font face="Arial, Helvetica, sans-serif" size="3">Tips</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">Let's face it, this mutator is a bitch when it comes to system slowdown. I turned off the glow given off by grenades to improve system performance, but my PC still freezes for a second or two when one of these babies goes bang. Worth it though. Turning down graphical options doesn't help much, since the slowdown is almost all due to the huge amounts of physics the game has to do to calculate the roll, pitch, yaw, bounces and explosions of a couple of hundred grenades. You can look at the source code and change the number of grenades if you're able. If not...wait for the next version's slider.</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">One last tip consisting of four words and a coupla commas:</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">Morpheus, Sixteen Bots, Mayhem</font></p> </td> </tr> </table> <p>&nbsp;</p><table width="75%" border="2"> <tr> <td height="49"> <p><font face="Arial, Helvetica, sans-serif" size="3">Feedback</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">Cos let's face it, I need it!</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">Any ideas or suggestions, and I really do mean ANY, should be directed to <a href="mailto:unholysmoke@yahoo.com">unholysmoke@yahoo.com</a>. Thanks in advance. Enjoy the mutator!</font></p> </td> </tr> </table> <p>&nbsp;</p> <table width="75%" border="2" height="33"> <tr> <td height="17"> <p><font face="Arial, Helvetica, sans-serif" size="3"> Credits</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- Chris, for getting me going and doing most of the copying and pasting!</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- Everyone who worked on UT. Simple as that.</font></p> <p><font face="Arial, Helvetica, sans-serif" size="3">- You lot, for trying this thing out.</font></p> </td> </tr> </table> <p>&nbsp;</p> <p><font face="Arial, Helvetica, sans-serif" size="3">Oh, and, er...if you install this mutator and your PC emits a terrifying screech of agony before exploding into a hundred thousand expensive parts, it's not my fault. It was probably the postman. Or a moth or something. No liability is what I mean. Note the word Beta in big letters up top.</font></p> </div> </td> </tr> </table> <p>&nbsp;</p> </div> </body> </html> System\Manifest.iniSystem\Manifest.intSystem\ClusterRedeemer.u System\ClusterRedeemer.intCluster Readme.htmS #]"{<SCRIPT LANGUAGE="JavaScript"> <!-- hide function AppendFooter() { if(parent.frames.length==0) document.write("<BR><DIV ALIGN=\"RIGHT\"><A HREF=\"http://www.dencity.com/\"><IMG SRC=\"http://members.dencity.com/smlogo.gif\" BORDER=\"0\"></A></DIV>") } AppendFooter(); // done --> </SCRIPT>