[Setup] Product=ca's Sniper ShockRifle Arena Mutator Version=3.0 Archive=caSniper.umod SrcPath=..\caSniper MasterPath=.. Visible=False Group=SetupGroup Group=SniperShockGroup [SniperShockGroup] Visible=True Selected=True Ini=System\UnrealTournament.ini,Engine.GameEngine.ServerPackages=caSniper File=(Src=System\caSniper.u,Size=61859) File=(Src=System\caSniper.int,Size=139) File=(Src=System\caSniper.ini,Size=387) File=(Src=Help\ReadmeSniper.txt,Size=3688) [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=496,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=259,Flags=3) [Setup] LocalProduct=ca's Sniper ShockRifle Arena SetupWindowTitle=ca's Sniper ShockRifle Mutator Developer=ca DeveloperURL=http://www.planetunreal.com/chimeric/ ReadMe=Help\ReadmeSniper.txt [SniperShockGroup] Caption=Sniper Shock Rifle Arena Mutator*D@wU~ HKK\wNonecaSniperShockArenaColor InternalTimeClientMessage caSniperUSizeVBits MaxColorPaletteUClampVClampUBitsVSizeMipZeroCoreEngineBotpackSystemUpdateSettingscaSniperBotReplicationInfoTickFire1caSniperPlayerReplicationInfo SpawnEffectBotcaSniperShockRifle caMedBoxDoZoom explosive LogPickup PlayerPawnPawn RemoteRoleTouchTexture GhostShotMsgDefaultWeaponEnhancedDmgMsgExplosiveShotMsgLaserSightMsgZoomMsg PlayerSpeed GhostShotLvl FastShotLvlEnhancedDmgLvlZoomLvl TakeDamage BeginPlayRenderOverlays FastShotMsg ShockCore AmmoString WeaponStringMedBoxbOwnsCrosshair AmmoName FiringSpeed RefireRate caLaserSightProcessTraceHitCheckReplacement ReplaceWithExplosiveShotLvlAltFirePickupPlayAltFiring ScoreKill PlayFiringStyle SetRespawn AdjustAim ValidTouch DrawScale TraceShot ModifyPlayer WeaponNamePlayPickupMessage hitdamageEffects LocationTeamObject HurtRadius Function DrawIcon FovAngleHealthRoleClassSetPos TextBufferPackagePlayOwnedSoundPingMedFont HitNormal DeltaTimeXActor ViewRotationbAdmin VoiceType PlayerID GroundSpeedTeamIDRollZSoundDampening ReturnValue ScriptTextStatebWaitingPlayer TalkTexture PlayerZoneRotatorRankLead DesiredFOVTimeAccStructStartSpreePKillerCalcDrawOffsetFontLevelTime bIsFemale Palette1bSuperRelevantValueClipY Rotation PickupSoundNameOldName PlayerName PacketLossPlayerLocation HitLocationOther TeamName FireOffset MyDamageType FireSound AdjustedAimbZoomGameOwner StrProperty ShockRifleIconsYStructPropertyClassPropertyTournamentWeapon NamePropertyTournamentHealthScoreDeathsHealingAmountHasFlagArenabFeigningDeath bSuperHealSuperShockRifleVectorRifleUT_Superring2 UT_ComboRingBotReplicationInfo ShockBeamsupershockbeam FireAdjustSmokeLocationSmokeDVector NumPointsSmokeRotationHealMax MoveAmount NumPuffs jenergy3ObjectPropertyFloatProperty WorldLog BoolProperty IntProperty BytePropertyPoints ShotsFired ShotsHit HeadShotsHeadShotsTaken LegShotsLegShotsTaken TorsoShotsTorsoShotsTaken bLaserSight bTrackingbExplosiveShotbEnhancedDamage bFastShot bGhostShotbHealthAccuracyMutatorLaserSightLvlWeapon LevelInfo GameInfo InventoryPlayerReplicationInfoStatLogInfoCanvas LocalLogbIsABot bIsSpectatornewInfooldInfosight SuicideTypezoomlv1zoomlv2zoomlv3 enhanceddmg fastshot lasersightFPHdamagem bHeadShot bLegShot WussSmokeaccEndmymuthitlhitn\ J ::$ p#fIn96   '!  @\[Z { n cY=1 TI# \N 0$ s hVe2!Ա~NY~NYoo p p p܄o p p p܄o p p p܄o p p p܄o p p p܄o p p p܄oooo|Jo p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|Jo|Joo|Jo p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|J p܂|Jo|Jo p܄o/Do p܄o|Jo|J."?"-" ,"+"*")]Zoom enabled.(]Lasersight enabled.']Explosive Shot enabled&]Enhanced Damage enabled.2]Fast Shot enabled$]Ghost Shot enabledL835]caSniper.caSniperShockRifle4]Botpack.ShockCore%;@7J(  :@_. ^ *&,]l; /D~NYooo~NY222~NYooo!E#I$>%182/D@@jcf ::$ 2K;vygJo p܄o111oo p܄ox p܆xx p܆xoxoxx p܆xx p܆xx p܆xxxxxx p p p p܆xxxx p܆xx p܄o pܛ`XIq`XIq?Q?Qo p p܅~NY p܅~NY~NY p܅~NYoo~NYooooo~NY p܄o pN"79$?:$333?@@<@@=@@>@@UI@E@3?@@A@#@F@G@H)  "@ "@ "@ "@**"-_K@n1@@                                                            @@  "@ "@ "@ "@**"lbK@A@@                                                            @@RN//============================================================================= // caSniperBotReplicationInfo. //============================================================================= class caSniperBotReplicationInfo expands caSniperPlayerReplicationInfo; OP puK] !7..K)DCR& P67-*a )* ?*&&a )& ?&&   "@ "@ "@ "@**"a]K@bT@@                                                                                 @@d=ta/!6a/!caSniperShockArena: Replacing a health (Medbox->caMedBox>ca.caMedBox(@ S//============================================================================= // caMedBox. //============================================================================= class caMedBox expands MedBox; auto state Pickup { function Touch( actor Other ) { local int HealMax; local Pawn P; local Mutator mymut; if ( ValidTouch(Other) ) { P = Pawn(Other); foreach AllActors(class'Mutator', mymut) { if (mymut.IsA('caSniperShockArena')) break; } if (mymut != None && mymut.IsA('caSniperShockArena')) { if (P.GroundSpeed != caSniperShockArena(mymut).PlayerSpeed) { P.ClientMessage("Leg injuries repaired. (Restored speed)"); P.GroundSpeed = caSniperShockArena(mymut).PlayerSpeed; } } HealMax = P.default.health; if (bSuperHeal) HealMax = Min(199, HealMax * 2.0); if (P.Health < HealMax) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax) P.Health = HealMax; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } } } }  "@ "@ "@ "@**"s>hK@j@@                                                @@  "@ "@ "@ "@* *"싼jK@z@@  @@Q1z .. %D?, -", ? ? Y?K -, ? ?.?, M?K2.?,- L?K S? -, ? ? t? -, ? ? [?8 -, ? ? X?, ? ?apPoints: S  ,  !%? (? !B? ?appAccuracy: SD%, ? ?#apShots Fired: S !, ? ?!apShots Hit: S (   "@ "@ "@ "@**"E[-eK@΍@@ @@m //============================================================================= // caSniperPlayerReplicationInfo. //============================================================================= class caSniperPlayerReplicationInfo expands BotReplicationInfo; var int Points; var int ShotsFired; var int ShotsHit; var int HeadShots; var int HeadShotsTaken; var int LegShots; var int LegShotsTaken; var int TorsoShots; var int TorsoShotsTaken; var bool bLaserSight, bZoom, bTracking, bExplosiveShot, bEnhancedDamage, bFastShot, bGhostShot, bHealthAccuracy; replication { // Things the server should send to the client. reliable if ( Role == ROLE_Authority ) bLaserSight, bZoom, bTracking, bExplosiveShot, bEnhancedDamage, bFastShot, ShotsFired, ShotsHit, HeadShots, HeadShotsTaken, LegShots, LegShotsTaken, TorsoShots, TorsoShotsTaken, Points; } Y//============================================================================= // caLaserSight. //============================================================================= class caLaserSight expands Actor; function BeginPlay() { Enable('Tick'); } simulated function Tick(float DeltaTime) { local vector x, y, z, hitl, hitn, start, end; local rotator adjustedaim; local actor other; local Inventory rifle; // log("calasersight: checking owner"); if (Owner == None) { Destroy(); return; } if (Pawn(Owner).Health < 0) Destroy(); // log("calasersight: getting rifle"); rifle = Pawn(owner).Weapon; if (rifle == None) { Destroy(); return; } GetAxes(Pawn(Owner).ViewRotation, x, y, z); start = Owner.Location + Weapon(rifle).CalcDrawOffset() + Weapon(rifle).FireOffset.Y * y + Weapon(rifle).FireOffset.Z * z; if (Owner.IsA('Bot')) adjustedaim = pawn(owner).ViewRotation; else adjustedaim = pawn(owner).AdjustAim(1000000, start, 0, False, False); end = start + (vector(adjustedaim) * 10000); other = pawn(Owner).traceshot(HitL,HitN,end,start); if (other == None) { SetLocation(end); } else { if (other == owner) log("tracing my owner"); SetLocation(hitl); } SetRotation(rotator(hitn)); } a Z5D~5..$.@5-a!>>?L=a!>>?,L= g `B b4&4..44- . mpA.B 4B.pA B .4B BqL.pcaSniperShockArena: Updating Settings for W B--' : E-"-"' DQ G--' = A--' ? I--' >J F-$-$' < fA2 9-"S20H-.-/a0 FEa/!F10w*a/!?.#/Leg injuries repaired. (Restored speed)?.#-,D?@0{w* w* Ma  @-bL>F o nY//============================================================================= // caSniperShockArena. //============================================================================= class caSniperShockArena expands Arena config(caSniper); var() config int ZoomLvl, LaserSightLvl, ExplosiveShotLvl, EnhancedDmgLvl, FastShotLvl, GhostShotLvl, PlayerSpeed; var() config string ZoomMsg, LaserSightMsg, ExplosiveShotMsg, EnhancedDmgMsg, FastShotMsg, GhostShotMsg; function ScoreKill(Pawn Killer, Pawn Other) { caSniperPlayerReplicationInfo(Killer.PlayerReplicationInfo).Points += 1; UpdateSettings(Killer); if (Other.PlayerReplicationInfo.Score > 0) Other.PlayerReplicationInfo.Score -= 1; Super.ScoreKill(Killer, Other); } function ModifyPlayer(Pawn Other) { local caSniperPlayerReplicationInfo newInfo, info; local PlayerReplicationInfo oldInfo; local caLaserSight sight; Other.GroundSpeed = PlayerSpeed; if (Other.IsA('PlayerPawn')) { if (!Other.PlayerReplicationInfo.IsA('caSniperPlayerReplicationInfo')) { log("caSniperShockArena: Spawned new ReplicationInfo, copying old ReplicationInfo data...(PlayerPawn)"); newInfo = Spawn(class'caSniper.caSniperPlayerReplicationInfo', Other); oldInfo = Other.PlayerReplicationInfo; newInfo.PlayerName = oldInfo.PlayerName; newInfo.OldName = oldInfo.OldName; newInfo.PlayerID = oldInfo.PlayerID; newInfo.TeamName = oldInfo.TeamName; newInfo.Team = oldInfo.Team; newInfo.TeamID = oldInfo.TeamID; newInfo.Score = oldInfo.Score; newInfo.Deaths = oldInfo.Deaths; newInfo.Spree = oldInfo.Spree; newInfo.VoiceType = oldInfo.VoiceType; newInfo.HasFlag = oldInfo.HasFlag; newInfo.Ping = oldInfo.Ping; newInfo.PacketLoss = oldInfo.PacketLoss; newInfo.bIsFemale = oldInfo.bIsFemale; newInfo.bIsABot = oldInfo.bIsABot; newInfo.bFeigningDeath = oldInfo.bFeigningDeath; newInfo.bIsSpectator = oldInfo.bIsSpectator; newInfo.bWaitingPlayer = oldInfo.bWaitingPlayer; newInfo.bAdmin = oldInfo.bAdmin; newInfo.TalkTexture = oldInfo.TalkTexture; newInfo.PlayerZone = oldInfo.PlayerZone; newInfo.PlayerLocation = oldInfo.PlayerLocation; newInfo.SuicideType = oldInfo.SuicideType; newInfo.Rank = oldInfo.Rank; newInfo.Lead = oldInfo.Lead; newInfo.FPH = oldInfo.FPH; newInfo.Time = oldInfo.Time; newInfo.TimeAcc = oldInfo.TimeAcc; Other.PlayerReplicationInfo = newInfo; oldInfo.Destroy(); } } else if (Other.IsA('Bot')) { if (!Other.PlayerReplicationInfo.IsA('caSniperBotReplicationInfo')) { log("caSniperShockArena: Spawned new ReplicationInfo, copying old ReplicationInfo data...(Bot)"); newInfo = Spawn(class'caSniper.caSniperPlayerReplicationInfo', Other); oldInfo = Other.PlayerReplicationInfo; newInfo.PlayerName = oldInfo.PlayerName; newInfo.OldName = oldInfo.OldName; newInfo.PlayerID = oldInfo.PlayerID; newInfo.TeamName = oldInfo.TeamName; newInfo.Team = oldInfo.Team; newInfo.TeamID = oldInfo.TeamID; newInfo.Score = oldInfo.Score; newInfo.Deaths = oldInfo.Deaths; newInfo.Spree = oldInfo.Spree; newInfo.VoiceType = oldInfo.VoiceType; newInfo.HasFlag = oldInfo.HasFlag; newInfo.Ping = oldInfo.Ping; newInfo.PacketLoss = oldInfo.PacketLoss; newInfo.bIsFemale = oldInfo.bIsFemale; newInfo.bIsABot = oldInfo.bIsABot; newInfo.bFeigningDeath = oldInfo.bFeigningDeath; newInfo.bIsSpectator = oldInfo.bIsSpectator; newInfo.bWaitingPlayer = oldInfo.bWaitingPlayer; newInfo.bAdmin = oldInfo.bAdmin; newInfo.TalkTexture = oldInfo.TalkTexture; newInfo.PlayerZone = oldInfo.PlayerZone; newInfo.PlayerLocation = oldInfo.PlayerLocation; newInfo.SuicideType = oldInfo.SuicideType; newInfo.Rank = oldInfo.Rank; newInfo.Lead = oldInfo.Lead; newInfo.FPH = oldInfo.FPH; newInfo.Time = oldInfo.Time; newInfo.TimeAcc = oldInfo.TimeAcc; Other.PlayerReplicationInfo = newInfo; oldInfo.Destroy(); } } UpdateSettings(Other); // spawn lasersight if necessary info = caSniperPlayerReplicationInfo(Other.PlayerReplicationInfo); if (Info.bLaserSight) { log("caSniperShockArena: Spawning lasersight for "$Other.Name); sight = Spawn(class'caSniper.caLaserSight'); sight.SetOwner(Other); } Super.ModifyPlayer(Other); } function UpdateSettings(Pawn Killer) { local caSniperPlayerReplicationInfo info; info = caSniperPlayerReplicationInfo(Killer.PlayerReplicationInfo); log("caSniperShockArena: Updating Settings for "$Killer.Name); if (info.Points >= ZoomLvl && !info.bZoom) { info.bZoom = true; Killer.ClientMessage(ZoomMsg); } if (info.Points >= LaserSightLvl && !info.bLaserSight) { info.bLaserSight = true; Killer.ClientMessage(LaserSightMsg); } if (info.Points >= FastShotLvl && !info.bFastShot) { info.bFastShot = true; Killer.ClientMessage(FastShotMsg); } if (info.Points >= ExplosiveShotLvl && !info.bExplosiveShot) { info.bExplosiveShot = true; Killer.ClientMessage(ExplosiveShotMsg); } if (info.Points >= EnhancedDmgLvl && !info.bEnhancedDamage) { info.bEnhancedDamage = true; Killer.ClientMessage(EnhancedDmgMsg); } if (info.Points >= GhostShotLvl && !info.bGhostShot) { info.bGhostShot = true; Killer.ClientMessage(GhostShotMsg); } } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (Other.IsA('MedBox') && !Other.IsA('caMedBox')) { log("caSniperShockArena: Replacing a health (Medbox->caMedBox"); ReplaceWith(Other, "ca.caMedBox"); return false; } else return Super.CheckReplacement(Other, bSuperRelevant); } " K^//============================================================================= // caSniperShockRifle. //============================================================================= class caSniperShockRifle expands SuperShockRifle; #exec TEXTURE IMPORT NAME=zoomlv1 FILE=Textures\zoomlv1.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=zoomlv2 FILE=Textures\zoomlv2.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=zoomlv3 FILE=Textures\zoomlv3.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=enhanceddmg FILE=Textures\enhanceddmg.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=fastshot FILE=Textures\fastshot.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=lasersight FILE=Textures\lasersight.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=explosive FILE=Textures\explosive.bmp GROUP="Icons" MIPS=OFF replication { unreliable if( Role==ROLE_Authority ) DoZoom; } simulated function AltFire( float Value ) { DoZoom(); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local int damagem; local bool bHeadShot, bLegShot; local caSniperPlayerReplicationInfo info; info = caSniperPlayerReplicationInfo(Pawn(Owner).PlayerReplicationInfo); info.ShotsFired++; damagem = 1; if (info.bEnhancedDamage) damagem += 2; if (Other == None) { HitNormal = -X; HitLocation = Owner.Location + X*10000.0; } if (!info.bGhostShot) SpawnEffect(HitLocation, Owner.Location + CalcDrawOffset() + (FireOffset.X + 20) * X + FireOffset.Y * Y + FireOffset.Z * Z); Spawn(class'ut_SuperRing2',,, HitLocation+HitNormal*8,rotator(HitNormal)); if ( (Other != self) && (Other != Owner) && (Other != None) && (Other.IsA('Pawn'))) { info.ShotsHit++; if (HitLocation.Z > (Other.Location.Z + 15)) { Pawn(Owner).ClientMessage("Head shot. (3x Damage)"); Pawn(Other).ClientMessage("Shot in head. (3x Damage)"); damagem += 2; } else if (HitLocation.Z < (Other.Location.Z - 15)) { Pawn(Owner).ClientMessage("Leg shot. (.5x Damage) (Movement decreased)"); Pawn(Other).ClientMessage("Shot in leg. (.5x Damage) (Movement decreased)"); Pawn(Other).GroundSpeed *= 0.75; damagem -= 0.5; } else { Pawn(Owner).ClientMessage("Torso shot. (Normal Damage)"); Pawn(Other).ClientMessage("Shot in torso. (Normal Damage)"); } Other.TakeDamage(HitDamage * damagem, Pawn(Owner), HitLocation, 20000.0*X, MyDamageType); } if (info.bExplosiveShot) { Spawn(Class'ut_ComboRing',,'',HitLocation, Pawn(Owner).Rotation); if (info.bEnhancedDamage) HurtRadius(HitDamage, 100, 'Explosive', 0, HitLocation); else HurtRadius(HitDamage, 80, 'Explosive', 0, HitLocation); } } function SpawnEffect(vector HitLocation, vector SmokeLocation) { local Supershockbeam Smoke; local ShockBeam WussSmoke; local Vector DVector; local int NumPoints; local rotator SmokeRotation; local caSniperPlayerReplicationInfo info; info = caSniperPlayerReplicationInfo(Pawn(Owner).PlayerReplicationInfo); DVector = HitLocation - SmokeLocation; NumPoints = VSize(DVector)/135.0; if ( NumPoints < 1 ) return; SmokeRotation = rotator(DVector); SmokeRotation.roll = Rand(65535); if (info.bEnhancedDamage) { Smoke = Spawn(class'SuperShockBeam',,,SmokeLocation,SmokeRotation); Smoke.MoveAmount = DVector/NumPoints; Smoke.NumPuffs = NumPoints - 1; } else { WussSmoke = Spawn(class'ShockBeam',,,SmokeLocation,SmokeRotation); WussSmoke.MoveAmount = DVector/NumPoints; WussSmoke.NumPuffs = NumPoints - 1; } } simulated event RenderOverlays( canvas Canvas ) { local caSniperPlayerReplicationInfo info; local int x, y; local float acc; info = caSniperPlayerReplicationInfo(Pawn(Owner).PlayerReplicationInfo); x = 0; y = Canvas.ClipY/4; if (info.bLaserSight) { y += 32; Canvas.SetPos(x, y); Canvas.DrawIcon(Texture'lasersight', 0.5); } if (info.bZoom) { y += 32; Canvas.SetPos(x, y); if (Pawn(Owner).FOVAngle == 15) Canvas.DrawIcon(Texture'zoomlv3', 0.5); else if (Pawn(Owner).FOVAngle == 45) Canvas.DrawIcon(Texture'zoomlv2', 0.5); else Canvas.DrawIcon(Texture'zoomlv1', 0.5); } if (info.bExplosiveShot) { y += 32; Canvas.SetPos(x, y); Canvas.DrawIcon(Texture'explosive', 0.5); } if (info.bEnhancedDamage) { y += 32; Canvas.SetPos(x, y); Canvas.DrawIcon(Texture'enhanceddmg', 0.5); } if (info.bFastShot) { y += 32; Canvas.SetPos(x, y); Canvas.DrawIcon(Texture'fastshot', 0.5); } y += 32; Canvas.Font = Canvas.MedFont; Canvas.SetPos(x, y); Canvas.DrawText("Points: "$info.points); y += 10; if (info.ShotsFired != 0) { acc = float(info.ShotsHit)/float(info.ShotsFired); acc *= 100.0; } else acc = 0.0; Canvas.SetPos(x, y); Canvas.DrawText("Accuracy: "$int(acc)$"%"); y += 10; Canvas.SetPos(x, y); Canvas.DrawText("Shots Fired: "$info.ShotsFired); y += 10; Canvas.SetPos(x, y); Canvas.DrawText("Shots Hit: "$info.ShotsHit); Super.RenderOverlays(canvas); } simulated function PlayFiring() { local caSniperPlayerReplicationInfo info; info = caSniperPlayerReplicationInfo(Pawn(Owner).PlayerReplicationInfo); PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*4.0); if (info.bFastShot) LoopAnim('Fire1', 0.30 + 0.30 * FireAdjust * 1.25,0.05); else LoopAnim('Fire1', 0.30 + 0.30 * FireAdjust / 2,0.05); } simulated function PlayAltFiring() { } simulated function DoZoom() { local caSniperPlayerReplicationInfo info; info = caSniperPlayerReplicationInfo(Pawn(Owner).PlayerReplicationInfo); if (!info.bZoom) return; switch (Pawn(Owner).FOVAngle) { case 15: PlayerPawn(Owner).DesiredFOV = 90; break; case 45: PlayerPawn(Owner).DesiredFOV = 15; break; case 90: default: PlayerPawn(Owner).DesiredFOV = 45; break; } } 0 u! kmr*a ,.%a.Ur*a . C38 . 6. 36. 8a/!%. <%. G$tI%((09%?'..J210r.*a 0r.tracing my ownera 2a+P1 CWe2nrMܴ 1p1po2!oo2!oo Ǣʔƪ! Ǣʔƪ!qr Ǣʔƪ! Ǣʔƪ!qrooo~NYp i rK?#.a/!+a/!caSniperShockArena: Spawned new ReplicationInfo, copying old ReplicationInfo data...(PlayerPawn)a ------------a==a/!=a/!caSniperShockArena: Spawned new ReplicationInfo, copying old ReplicationInfo data...(Bot)a ------------a6.6-"pcaSniperShockArena: Spawning lasersight for W9a /9a B+C u.+ &+c,?%,?&+,   "@ "@ "@ "@**"`:cmK@@@@@v <..!&P-,r *'    @F-$  ծ6?, 6J6Ha  '?,P'qw  w  w * a/! (6 6  ?,.Head shot. (3x Damage). !Shot in head. (3x Damage),66 6  ?,.3Leg shot. (.5x Damage) (Movement decreased). 6Shot in leg. (.5x Damage) (Movement decreased). @?D?6.#Torso shot. (Normal Damage). &Shot in torso. (Normal Damage) 2/. @F -a  ! . -?B! ?B!  T@ \YU\Y YcYX\YRyVxhYyY}Y[yUYQYTY|TZYYSYRYOY#TUYgz`YnYmYYYW}WzkY[[P[Py|eyUzaWO^_yczh}@yLYdWJY_}g|A}K}i~QyrYT}^}t\f|Z|[|eWI}fzzyq|p}u}wzvxsYzzVYX}NzZT1yYy{TS~X[dT}^HoATCTKY]YlT=YVzoY6Ty~zET0yGyRy_T]Yo}jzbY zlT"^QY~[v}wYkyQT<YjT[v}w}bY\|f\O#xT@[FTDTBbW9q] y:q\ F;ZX S;ZZ `;dW l;qN y;f{ F<ZW S<uN `<Zb m<uM y<F=d| T=uW a=Kn=Qs |=fu H>fm T>wBCa>li dNQr qNug ~NJKOly YOLfOTtOGCPVNJlQtXlZk flubrl@@mHNm* \mM hmlSumQj Cnu` PnA]nQp lnQq ynr| ForN SofN `olN mo;Lzoll Fslo Ssln `slZ mscW zs`W GtqW TtQW atlk ntq^ {t) HuI Uu$ ^2 j& v' BVCN? \. ilb v( CP O+ \, huk u- BuZOQM ]waNAjwbNAxuh FPn4YSXl;NDui Rw`NA^vD lVm x=ZDnn4^^wdNA|weNAJ;1r XwcNAJn4x X/n4dPBtN C;DYOCh;Bw;aUhvnA,^e"YJDcn4yYrGk;n4V^y/0 O/Dola sl@ElF{K_JCeiINwNA\;<k j;@!UYv[Public] Object=(Name=caSniper.caSniperShockArena,Class=Class,MetaClass=Engine.Mutator,Description="ca's Sniper Mutator,Sniper mod....") [caSniper.caSniperShockArena] ZoomLvl=1 LaserSightLvl=0 FastShotLvl=3 ExplosiveShotLvl=5 GhostShotLvl=7 EnhancedDmgLvl=10 PlayerSpeed=250 ZoomMsg="Zooming capabilities enabled." LaserSightLvl="Laser sight enabled." FastShotLvl="Fast shot enabled." ExplosiveShotLvl="Explosive shot enabled." GhostShotLvl="Shots are now invisible." EnhancedDmgLvl="Damage enhancer enabled." Sniper Shock Rifle Arena Mutator (v0.3) --------------------------------------------- Author: ca (ray davis - ca@planetunreal.com) URL: Chimeric - http://www.planetunreal.com/chimeric --------------------------------------------- About: This is my take on the old TF Sniper modification released for Quake1 so long ago (no, not the Teamfortress Sniper class, there was a seperate mod, so don't tell me about it!). Basically here are the rules: - Every player starts with the sniper rifle (modified shockrifle) - As players gain score they will be awarded points - Enhancemets are awarded at various point levels (configurable) - Players gain score for kills, lose score for dying - If you're hit in the head you'll take x3 damage - If you're hit in the leg you'll take 1/2 damage but have a movement penalty - If you're hit in the torso you take normal damage - MedBoxes will restore any leg injuries New to this version: Enhancements purchasing has been removed, back to the classic style. Playable in a network situation now - this version is to test for any bugs before a final version is released. Removed the shield belt, medkit, and stimpack enhancements. Changed package name to caSniper.u from ca.u for aesthetic reasons. Added caSniper.ini for customizing the enhancements levels and messages (see tech. notes below). Simple accuracy stats: shots fired, shots hit, and accuracy percentage. Now just medboxes are replaced, so no more funkiness on Tempest and Phobos with the kegs/vials. Note that this means vials and kegs will NOT heal leg injuries. Enhancements Overview: - Lasersight: This gives you a tiny red dot with which to aim with. - Zoom: This allows you to zoom (via AltFire). - Fast Shot: This halves the amount of time it takes to fire a shot. - Explosive Shot: This creates a small explosion at the point of impact causing area damage. - Enhanced Damage: This doubles the amount of damage each shot makes. - Ghost Shot: This makes your shots invisible, at the cost of damage capability. Installation: Double-click on the umod, just keep hitting next in the installer until it finishes. If it asks for a directory then type in your UT directory. (c:\games\ut) Then start up UT, and start practice session (or internet server) and select Sniper Shock Rifle Arena under the mutators...then start it up. Bots don't really make good snipers, but I've found that camping..er..sniping from one of the tips in DM-Morpheus is enjoyable. Also try editing the bots to increase their accuracy and camping skills, while decreasing their strafing skills...its seems to make for a more entertaining game. Technical Notes: All configurable items for caSniper are now stored in caSniper.ini, so to change anything just open it up in a text editor and edit away. If you want to disable any enhancements just set them higher than the frag limit, otherwise set them to whatever level you desire. I have set them at a level acceptable for a 15-20 frag limit game. Known Bugs/Issues: None that I know of at the moment, but thats what this release is for...to find them before I release a final version... :) Please note that there I have several ideas that I plan for the next release, but I wanted to test the network stability of this version and address any issues before continuing further. If you have any problems/suggestions/comments please direct them all to ca@planetunreal.com. Thanks... Ray - the one and only ca ----------------------------------------------- Thanks goes out to jbp, soul, c0mp, mongo, warren, and all the cool people that hang out in #unrealscript.System\Manifest.iniSystem\Manifest.intSystem\caSniper.uSystem\caSniper.int-System\caSniper.iniHelp\ReadmeSniper.txt;h㟣~_