[Setup] Product=ca's Sniper ShockRifle Arena Mutator Version=1.0 Archive=caSniper.umod SrcPath=..\ca MasterPath=.. Visible=False Group=SetupGroup Group=SniperShockGroup [SniperShockGroup] Visible=True Selected=True File=(Src=System\ca.u,Size=21072) File=(Src=System\ca.int,Size=388) File=(Src=Textures\caSniperIcons.utx,Size=26632) File=(Src=Help\ReadmeSniper.txt,Size=3025) [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=409,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@^LrHc'9yKK\^NoneClientMessageCoreEngineSystemcacaSniperShockArenaUpdateSettingsBotpackLightBrightnessLightSaturation ModifyPlayer SpawnEffectbStaticFireTimercaSniperShockRifle bNoDeleteTickBegin LightCone caNoLightLaserSightLvlZoomLvl caFlashlightTexture caSpotlightPawn caLitPlayersExplosiveShotLvl LightRadius LightType hitdamagebTravelBot DrawScaleLight PlayRecoilProjectileFireEnhancedDmgLvl ItemName caLightsOut explosive LightEffect LightPeriod caLaserSightVolumeBrightness TakeDamage TraceFirePostBeginPlayAltFire ShockCore PreBeginPlaybHidden NormalFireFindInventoryType BeginPlay DrawType bDirectionalRenderOverlays ScoreKillUseAmmo bMovable ActivatedStyle bActivatable ClientFireProcessTraceHitMyDefaultWeaponCheckReplacement LightHue StrPropertyPickupVectorAmmoStructWeaponEffectsRotator ReturnValueState AmbientGlow Inventory GameInfoRollPlayerReplicationInfo FunctionZXY HurtRadius Spotlight GroundSpeed ScriptText NamePropertyCalcDrawOffsetMutatorStructPropertyCanvas HitLocation HitNormal DeltaTimeOtherScoreEndStartGameKiller bWarnTargetOwner NewWeapon WeaponName LevelInfobSuperRelevantValue Rotation ViewRotation bTeamGameTeamClassProperty AmmoName AmmoType bPointing bInstantHit bRapidFire FiringSpeed FireOffsetProjectileClass MyDamageTypebZoomSuperShockRifle ShockRifleIcons LocationObjectPropertyTournamentWeaponFloatProperty AmmoString WeaponString FovAngleArenaTournamentPickupUT_Superring2 UT_ComboRing ShockBeamsupershockbeambCanClientFireSmokeLocationSmokeDVector NumPointsSmokeRotation MoveAmount NumPuffs jenergy3caSniperIconszoomlv3Level lasersightzoomlv1zoomlv2 enhanceddmg BoolProperty IntProperty BytePropertyActor PlayerPawnProjectileSpeedPackageObjectClassSetPos TextBuffer DesiredFOV DrawIcon MySpotLighthitlhitnnewLoc bLaserSight bTrackingbExplosiveShotbEnhancedDamageMySniperRifle WussSmokesightdamagem bHeadShot bLegShot\] 2(DWgJxxxdxdxxxxxx`XIq`XIq?Q?Qllllddldddddlddd]Pd+]Pd+]Pd+_Td "MKZ8  6)"(2V=-ldl@#$>$%&# 4!'P+ tv S5SS>:S9+ F  0@@1@/@7- L;29˺dll%8x.A(= flashlightD #5 @?,a +a=' Y5%=&q!6-'-'B5e- ?%. %|-0&- WXtr*a. ('  ?, (?,'?, $ ?'#a!%$ r#tracing my ownera !a+P% C3 F 3DC4& P6- a  ?&a  ?& <,26f&.a/!", 3-  . lpA.B 4B.pA B .4B | 27 "?)a&4"w)*&?w*a a +  E 4a/!$$$ $$$$$(' JA) BLAйllllllll?CSaC &- ,Sr* @F  ծ6?,666-a  ?,Pw w w*a/!66 ?,.Head shot. (Damage * 3).Shot in head. ,^66 ?,.3Leg shot. (Damage / 2) (Movement decreased).)Shot in leg. (Movement decreased).@? D?.#Torso shot. (Normal damage).Shot in torso.2/ .@FA- a  !. ?,B!* H*<V*D?%?&* : /  7 'r* D 0.-(.-' Laser Sight enabled...- (.- ' %Zoom enabled. (Altfire - lv1)/.- (.- ' -Enhanced Damage enabled. (Damage * 3)1.- (.- ' 5Explosive shots enabled. (Radius Damage + 30) QE,F0$Աdd|J**d**d**d**dddd|Jd|Jdd|JDWDWdDWDWdDWDWdDWDWdddd|Jd|J"""'"  $x$ $$$=,$ -$:%$:&$ OID  k //============================================================================= // caLightsOut. //============================================================================= class caLightsOut expands Mutator; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { // kill lights if (Other.IsA('Light')) { // log("calightsout: killing a light"); Other.AmbientGlow = 0; Other.LightEffect=LE_NonIncidence; Other.LightType=LT_None; Other.LightRadius=0; Other.LightSaturation=0; Other.LightBrightness=0; Other.LightHue = 0; return false; } return true; } T K //============================================================================= // caFlashlight. //============================================================================= class caFlashlight expands TournamentPickup; var Light MySpotLight; state Activated { function Timer() { local vector x,y,z, start, end, hitl, hitn, newLoc; local actor other; GetAxes(Owner.Rotation, x, y, z); start = Owner.Location; end = start + x * 5000; other = Trace(hitl, hitn, end, start); if (other != none) newLoc = hitl + x * -10; if (MySpotLight != None) MySpotLight.SetLocation(newLoc); else MySpotLight = Spawn(class'ca.caSpotLight',,, newLoc); } Begin: MySpotLight = Spawn(class'ca.caSpotlight'); SetTimer(0.1, True); } "^//============================================================================= // caLitPlayers - lights up players so they are easier to identify // - will use red/blue for teamgames, default for none teamgames //============================================================================= class caLitPlayers expands Mutator; function ModifyPlayer(Pawn Other) { local Weapon newWeapon; // Begin caLitPlayers Other.AmbientGlow = 120; Other.LightEffect=LE_NonIncidence; Other.LightType=LT_Steady; Other.LightRadius=20; Other.LightSaturation=142; Other.LightBrightness=255; Other.LightHue = 32; // default hue if (Level.Game.bTeamGame) { Other.LightSaturation = 0; if (Other.PlayerReplicationInfo.Team == 0) Other.LightHue = 0; else if (Other.PlayerReplicationInfo.Team == 1) Other.LightHue = 170; } // end caLitPlayers Super.ModifyPlayer(Other); } .4 N!!3ca.caSniperShockRifleBotpack.ShockCore \//============================================================================= // caSpotlight. //============================================================================= class caSpotlight expands Spotlight; Md#//============================================================================= // caSniperShockArena. //============================================================================= class caSniperShockArena expands Arena; var() config int ZoomLvl, LaserSightLvl, ExplosiveShotLvl, EnhancedDmgLvl; // arena mutators baffle me for some reason, so like this is how i got mine to work... // ie, i'm sure this isn't the _right_ way to do it, but it works function PreBeginPlay() { WeaponName = 'caSniperShockRifle'; AmmoName = 'ShockCore'; WeaponString = "ca.caSniperShockRifle"; AmmoString = "Botpack.ShockCore"; } function Class MyDefaultWeapon() { return class'ca.caSniperShockRifle'; } function ScoreKill(Pawn Killer, Pawn Other) { UpdateSettings(Killer); if (Other.PlayerReplicationInfo.Score > 0) Other.PlayerReplicationInfo.Score -= 1; Super.ScoreKill(Killer, Other); } function ModifyPlayer(Pawn Other) { UpdateSettings(Other); Other.GroundSpeed = Other.Default.GroundSpeed; Super.ModifyPlayer(Other); } function UpdateSettings(Pawn Killer) { local Inventory MySniperRifle; local int score; MySniperRifle = Killer.FindInventoryType(class'ca.caSniperShockRifle'); if (MySniperRifle == None) return; score = Killer.PlayerReplicationInfo.Score; if (score >= LaserSightLvl) { if (caSniperShockRifle(MySniperRifle).bLaserSight == false) { caSniperShockRifle(MySniperRifle).bLaserSight = true; Killer.ClientMessage("Laser Sight enabled."); } } if (score >= ZoomLvl) { if (caSniperShockRifle(MySniperRifle).bZoom == false) { caSniperShockRifle(MySniperRifle).bZoom = true; Killer.ClientMessage("Zoom enabled. (Altfire - lv1)"); } } if (score >= EnhancedDmgLvl) { if (caSniperShockRifle(MySniperRifle).bEnhancedDamage == false) { caSniperShockRifle(MySniperRifle).bEnhancedDamage = true; Killer.ClientMessage("Enhanced Damage enabled. (Damage * 3)"); } } if (score >= ExplosiveShotLvl) { if (caSniperShockRifle(MySniperRifle).bExplosiveShot == false) { caSniperShockRifle(MySniperRifle).bExplosiveShot = true; Killer.ClientMessage("Explosive shots enabled. (Radius Damage + 30)"); } } } 1 r9-(- (-8(- (- (a=' USqEk@%8x. SS!  ,.T//============================================================================= // caNoLight. //============================================================================= class caNoLight expands Light; i //============================================================================= // caLaserSight. //============================================================================= class caLaserSight expands Actor; function BeginPlay() { Enable('Tick'); } function Tick(float DeltaTime) { local vector x, y, z, hitl, hitn, start, end; local actor other; if (Owner == None) Destroy(); GetAxes(Pawn(Owner).ViewRotation, x, y, z); start = Owner.Location + x * 10 + y * 2 + z * 12; end = start + x * 10000; other = Trace(hitl, hitn, end, start); if (other == owner) log("tracing my owner"); SetLocation(hitl); SetRotation(rotator(hitn)); } 8 u! RG9 - 7r*a a [L SDE//============================================================================= // caSniperShockRifle. //============================================================================= class caSniperShockRifle expands SuperShockRifle; var bool bLaserSight, bZoom, bTracking, bExplosiveShot, bEnhancedDamage; var caLaserSight sight; function PostBeginPlay() { Super.PostBeginPlay(); // init settings bLaserSight = false; bZoom = false; bTracking = false; bExplosiveShot = false; bEnhancedDamage = false; SetTimer(0.1, true); } function Timer() { if (!bLaserSight) return; if (sight == None) { sight = Spawn(class'ca.caLaserSight'); sight.SetOwner(Owner); } } function Fire( float Value ) { if ( AmmoType.UseAmmo(1) ) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; ClientFire(value); if ( bRapidFire || (FiringSpeed > 0) ) Pawn(Owner).PlayRecoil(FiringSpeed); if ( bInstantHit ) TraceFire(0.0); else ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget); } } function AltFire( float Value ) { if (Pawn(Owner).IsA('Bot')) { Fire(Value); return; } if (!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; } } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local int damagem; local bool bHeadShot, bLegShot; damagem = 1; if (bEnhancedDamage) damagem += 2; if (Other == None) { HitNormal = -X; HitLocation = Owner.Location + X*10000.0; } 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'))) { if (HitLocation.Z > (Other.Location.Z + 8)) { Pawn(Owner).ClientMessage("Head shot. (Damage * 3)"); Pawn(Other).ClientMessage("Shot in head."); damagem += 2; } else if (HitLocation.Z < (Other.Location.Z - 15)) { Pawn(Owner).ClientMessage("Leg shot. (Damage / 2) (Movement decreased)"); Pawn(Other).ClientMessage("Shot in leg. (Movement decreased)"); Pawn(Other).GroundSpeed *= 0.75; damagem -= 0.5; } else { Pawn(Owner).ClientMessage("Torso shot. (Normal damage)"); Pawn(Other).ClientMessage("Shot in torso."); } Other.TakeDamage(HitDamage * damagem, Pawn(Owner), HitLocation, 20000.0*X, MyDamageType); } if (bExplosiveShot) { Spawn(Class'ut_ComboRing',,'',HitLocation, Pawn(Owner).Rotation); HurtRadius(HitDamage / 2, 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; DVector = HitLocation - SmokeLocation; NumPoints = VSize(DVector)/135.0; if ( NumPoints < 1 ) return; SmokeRotation = rotator(DVector); SmokeRotation.roll = Rand(65535); if (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 ) { if (bLaserSight) { Canvas.SetPos(0, 200); Canvas.DrawIcon(Texture'caSniperIcons.lasersight', 0.5); } if (bZoom) { Canvas.SetPos(0, 232); if (Pawn(Owner).FOVAngle == 15) Canvas.DrawIcon(Texture'caSniperIcons.zoomlv3', 0.5); else if (Pawn(Owner).FOVAngle == 45) Canvas.DrawIcon(Texture'caSniperIcons.zoomlv2', 0.5); else Canvas.DrawIcon(Texture'caSniperIcons.zoomlv1', 0.5); } if (bExplosiveShot) { Canvas.SetPos(0, 264); Canvas.DrawIcon(Texture'caSniperIcons.explosive', 0.5); } if (bEnhancedDamage) { Canvas.SetPos(0, 296); Canvas.DrawIcon(Texture'caSniperIcons.enhanceddmg', 0.5); } Super.RenderOverlays(canvas); } >;g;-HC ?- hC.?, ?.?,- ? ?- C ?Z- C ?  NG^сйddddddd_ R$Wdd|Jdd|JdhhjjejihKIjaFmjbjLjVjFjUj`jjjfjbjljcjBh[jLjQjPaEVnhDHWFUVkj$dFV jHHKjCa~HgHmd H\asd+d ddQdV1V<KNdvjRc V;H}jSjMj[jpVcTFyV_HXwb|bljJb{VZHgHYVEVDF]buatVjPjGbRbzV8jdjwP?cYVaXjOV4VCV jNcYaXGJGI^o^xhMFjV2VZ^@jH\*^_`a$uM.GfB5Cf P5]b ]5Ew j5Afw5Cc E6>V R6Ek ^6v k6Cz w6A D7u P7s \7Eg h7>U t7:f A8>W N89o [8CX h8Cd u8@r B9Df O9@i \9>T i9>x v9y C:=X P:@X ]:-$vj:>S `<=i m<=p z<@h G==f T==h a==q n=@p {==W H>=Y U>@f b>Dk o>$u|>?r q@CW }@F JAF' VAF bAF nA@Y zA>c GB@q TB<r aBCY mB@W zBt GC$DSCF 7WE9?JNF~XGhVI v~K2]tN;QQQBE|bS)$`^UC` ~WF<O^aFPmb$k}h^ QhpFD"ysHO[t)4v itAq_~4V m~Gn C^]4iPF4Zy4gS4o#z1@i$uiAO ^4_j-4t I8 }=e ]BiC{ kC| x4OED;TS$hg[Public] Object=(Name=ca.caLitPlayers,Class=Class,MetaClass=Engine.Mutator,Description="caLitPlayers,Lights up player for easier identification.") Object=(Name=ca.caLightsOut,Class=Class,MetaClass=Engine.Mutator,Description="caLightsOut,Kills all lights.") Object=(Name=ca.caSniperShockArena,Class=Class,MetaClass=Engine.Mutator,Description="Sniper Shock Rifle Arena,Sniper mod....") *D@gig`'9yKK\ InternalTimeColorNoneVClampUClampPaletteUSizeVSizeVBitsUBits MaxColorMipZeroCoreTextureEngineClassPackage Palette1IconscaSniperIconszoomlv3 explosive lasersightzoomlv1zoomlv2 enhanceddmg@\[Z { n cY=1 TI# \ "@"@"@"@ * *"LOB@@@                                                            @@ "@"@"@"@ * *"LOB@&&@@@@ "@"@"@"@ *  *"LOB@t6@@  @@ "@"@"@"@ * *"LOB@F@@                                                                                 @@ "@"@"@"@ * *"LOB@W@@                                                            @@ "@"@"@"@ * *"LOB@^g@@ @@      CQNATNAbWNApNA~NALNAZhSniper Shock Rifle Arena Mutator (v0.1) --------------------------------------------- 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 new enhancements: - a (cheesey) lasersight - the ability to zoom (altfire) - explosive shots (doesn't that animation look familiar?) - enhanced damage - 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 Thats pretty much it, I also made up some cheesy icons that show up as you gain the various enhancements, and if you look closely a message will tell you what kind of shot you just made (head/leg/torso). I doubt this version will work over a network game, well it may or may not (I don't have a connection to test any replication code), the only major problem I can think of would be that the lasersight would be whacked. Let is be said here and now that I'm not an artist, and I apologize for the lack of any cool new models/gfx/sounds/whatever...I'm programmer by heart, and damnit, that's the way it is. :) Now, if some talented person(s) out there would care to make some gfx, effects, or whatever, I'd be _more_ than happy to include them in the next release. Also, players! If you've got an idea of new enhancements, or just an overall suggestion, please let me know (ca@planetunreal.com). I really would like to make more cool stuff for this, and I would appreciate any creative ideas! Installation: Erm, double-click on the umod, just keep hitting next in the installer until it finishes. 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 against 'em. Technical Notes: To change the levels at which the various enhancements are awarded, just make a new section in unrealtournament.ini like this: [ca.caSniperShockArena] ZoomLvl=0 LaserSightLvl=0 EnhancedDmgLvl=0 ExplosiveShotLvl=0 And just change the 0's to the score at which you want them awarded. You can put this anywhere in the ini file, the bottom works just fine. If you have any problems/suggestions/comments please direct them all to ca@planetunreal.com. Thanks... ray ----------------------------------------------- Thanks goes out to jbp, soul, c0mp, and all the m0s that hang out in #unrealscript.System\Manifest.ini3System\Manifest.int3 System\ca.u6PRSystem\ca.intUTextures\caSniperIcons.utx WhHelp\ReadmeSniper.txt