[Setup] Product=DEMutators Version=101 Archive=DE.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=umodINIGroup Group=DeGroup Group=umodIncludeFilesGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=583,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=519,Flags=3) [umodINIGroup] Ini=System\UnrealTournament.ini,Engine.GameEngine.ServerPackages=De [DeGroup] File=(Src=System\de.int,Size=393) File=(Src=System\de.u,Size=72405) [umodIncludeFilesGroup] File=(Src=Help\demutators-readme.txt,Size=1627) File=(Src=System\de-logo.bmp,Size=7966) [Setup] LocalProduct=DEMutators ReadMe=Help\demutators-readme.txt SetupWindowTitle=DEMutators AutoplayWindowTitle=DEMutators Options ProductURL=www.digitalextremes.com VersionURL=www.digitalextremes.com Developer=Digital Extremes DeveloperURL=www.digitalextremes.com Logo=System\de-logo.bmp [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ [Public] Object=(Name=DE.VolatileAmmo,Class=Class,MetaClass=Engine.Mutator,Description="Volatile Ammo, Ammo explodes when shot.") Object=(Name=De.TeamBeacon,Class=Class,MetaClass=Engine.Mutator,Description="Team Beacon,Identifies team members.") Object=(Name=De.VolatileWeapon,Class=Class,MetaClass=Engine.Mutator,Description="Volatile Weapon,Killed players will discharge their weapon!") *E@fd/HgVdNone TakeDamage TakingDamageEnginedeSystemCore TraceShot ReplaceWith SetRespawn Sleeping bProjTargetBegin RespawnTimeBotpackshot TraceFireProcessTraceHit InternalTime ParentAmmoColorVBitsUSizebMaskedVSizeVClampUClampUBitsAdjustHitLocationPaletteCarcassMipZero VRocketPack VBulletBox VRifleShell VMiniAmmoVPAmmo VBioAmmo VFlakAmmoVEClip VBladeHopper VShockCore MaxColor ScoreKill SetSymbol AlwaysKeep PostRender RemoteRolePostBeginPlayAmmoSpawnNotificationTickTexture ActorClass TBNotifyVolatileWeaponIdentitySymbol VolatileAmmo TBMutator RifleShell RocketPack BulletBox Miniammo ShockCoresliced AmbientGlow mMaxScaleCheckReplacement FlakAmmo BladeHopperjoltedmMaxDischarges DrawTypezapped shredded AddMutator ScaleGlow TeamBeacon mMinScaleStyleEClipMassPAmmo explodedBioAmmo DamageType DrawScaleCollisionHeightPawnActorLevelCanvas Viewport InventorybHidden HurtRadius SpawnNotify Location FovAngleEffectsFloatProperty PlayerPawnHUDOtherPlayerReplicationInfoMutator ReturnValuePlayerATeam HitNormalrealHitSoundPRI Instigator LevelInfoWVSbSuperRelevant Palette1WeaponbIsPawn DesiredFOV HUDMutator instigatedBy PlayerID AmmoType bInstantHitProjectileClass ViewRotationbTemp AmmoAmountClass NamePropertyDam DirectionIconsDir hitdamageStructProperty Palette7General SpecialExpl IntPropertyObjectPropertyPackage PlasmaSphereUT_SpriteSmokePuff ShockProjRandPZ UT_BioGel MomentumKiller HitLocation Razor2AltRazor2 UT_WallHit StartTrace WarExplosionUT_SpriteBallChildBioGlob UT_Grenade UT_ComboRing ScriptTextUT_SpriteBallExplosion RocketMk2MTracer flakslugi UT_ShellCaseI_TeamRLoc bStartup NextMutatorRot TextBufferObjectdist EndTrace FunctionStateRotatorVectorStruct UnrealShareClassProperty TempActor BytePropertyR PlayerOwner BoolPropertyteam_id num_used player_id team_count symbol_count draw_scaleinterpDelta ammo_count num_shotsvecTSignBTSignRTSignGTSignYNumlZ8攜?G/HO4L$@AQ$y]a)u7/B@ kOD`YTkTK M~AxV^h*g,b3NsmjF2u8IJQLN&V?{AZRj!]gq! iEO0D$Q9fC'\Xq! (WUG: [z mՃC,Fo.;Fo.;攜?.;.;攜?攜?攜?攜?攜?FoFoFo攜?攜?攜?xՃC,攜?攜?攜?攜?攜?N$>B$`A +._F -`cq! f5Hnq! [EiZq1vpeq! tn6>X_q! :S@dq! ^oUhfq! D@@UUUUUUUUUUUUUsssgggWWWKKK;;;///###sg[O@__@@ \@ xl`TL|\@ plXT@@\@ t`|`\@@ sg[O@|\@ ppXX@@\@ |l\_`@@ %sg[O@ڟ_@ u`PEp5Z*@_@ opZZ@@տϰťp`_ZߊUЀPOzJpEj@e?`:_5Z0P/uO*oJ%_@ U?J:@0:/* ++O+w+ǟ+++w+O++3+_+Nj+Ƿ+++S/+[++++++W++%=oxP\q! Cm\4P"ypq! ;<YSYUplNB"@"@"@"@*4%**"yqT@$+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J@J@JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ@JJJ@JJJ@JJJJJJJ@@@@@J&&&&&&&&&&&&&&&@J@J&&@J@J&&@J@J&&@J@J&&@J@J&&@J@J&&@J@J&&@J@J&&@JJJ&&@JJJ&&@JJJ&&@JJJ&&@JJJ&&&&&&&&&&&&&&&@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJ@JJJJJJJJJJJJJJJ@@WT abIrYM^HP~HJK{is6qom5I5I5IՃC,5`//============================================================================= // VPAmmo. //============================================================================= class VPAmmo expands PAmmo; var Rotator r; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; num = AmmoAmount; Spawn( class'PlasmaSphere', Instigator,, Location, rot(49152,0,0) ); Spawn( class'PlasmaSphere', Instigator,, Location, rot(49152,0,0) ); PlaySound( Sound'UnrealShare.General.SpecialExpl',,20.0,,2000,0.6); HurtRadius(100, 250, 'zapped', 100000, Location ); sleep(0.05); for (i=0; i5b $pA vtD$tU,&6ra @?P?w w*dL>V?,&UY@;EV!-a/!a @??,  IpuB]l(2|ʘe $pA Zr|$2~ "W $pA \'//============================================================================= // VRifleShell. //============================================================================= class VRifleShell expands RifleShell; var Rotator r; var Vector v; var Vector Direction; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } function actor TraceShot(out vector HitLocation, out vector HitNormal, vector EndTrace, vector StartTrace) { local vector realHit; local actor Other; Other = Trace(HitLocation,HitNormal,EndTrace,StartTrace,True); if ( Pawn(Other) != None ) { realHit = HitLocation; if ( !Pawn(Other).AdjustHitLocation(HitLocation, EndTrace - StartTrace) ) Other = Pawn(Other).TraceShot(HitLocation,HitNormal,EndTrace,realHit); } return Other; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector Direction, Pawn instigatedBy) { local int HitDamage; HitDamage = 38; if (Other == Level) { Spawn(class'UT_WallHit',,, HitLocation+HitNormal, Rotator(HitNormal)); } else if ((Other != self) && (Other != None) ) { if ( FRand() < 0.2 ) Direction *= 5; Other.TakeDamage(HitDamage, instigatedBy, HitLocation, 3000.0*Direction, 'shot'); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function TraceFire( Vector Direction, Pawn instigatedBy ) { local Vector HitLocation, HitNormal, StartTrace, EndTrace; local Actor Other; StartTrace = Location; EndTrace = StartTrace + (10000 * Direction); Other = TraceShot(HitLocation, HitNormal, EndTrace, StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, Direction, instigatedBy); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; spawn( class'UT_SpriteBallChild',,,Location ); rand = FRand(); r = RotRand(True); v = VRand(); Spawn( class'UT_ShellCase',,, Location + (v+vect(0,0,1))*CollisionHeight*10*rand, r); Direction = vector(r); Spawn( class'MTracer',,, Location, r ); TraceFire( Direction, Instigator ); SetRespawn(); } o}KzGaO4F'w.*I.4F.O4I W"2E`2ԝXԝXԝX $pA M&K,&6ra BAPAw w*dL>{?,&KoB;E{!-a/!a BA?,  H[^JRaD=N'w.*M.=N.D=M LGCFI \]T%2QCwYtsl $pA _S BGGA  v[{9#Ud_'ՃC,RԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXՃC,RBC$ ROHU-'a oa@'ka k#??, oE9a E  KYZMg//============================================================================= // VBladeHopper. //============================================================================= class VBladeHopper expands BladeHopper; var Rotator r; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; num = AmmoAmount; Spawn( class'Razor2Alt', Instigator,, Location, rot(49152,0,0) ); HurtRadius(60, 150, 'sliced', 70000, Location ); sleep(0.07); for (i=0; i 0.6 ) Spawn( class'Razor2Alt', Instigator,, Location, r ); else Spawn( class'Razor2', Instigator,, Location, r ); sleep(0.05); } SetRespawn(); } A`abTGIC. cXeHw fW// TBNotify. // Steve Sinclair, Digital Extremes, Jan 4, 2000 class TBNotify expands SpawnNotify; //Called automatically anytime the class you specified in default properites // is spawned (also called if a subclass of that class is spawned). //Great way to catch things to modify or replace them - just make sure to use // if statements to avoid infinite recursion if you replace something by // spawning a new subclass. simulated event Actor SpawnNotification( Actor A ) { local Mutator tempActor; log("SpawnNotified!!"); if ( HUD(A).HUDMutator == none ) { //If there aren't any HUDMutators attached to the HUD, attach // your mutator. HUD(A).HUDMutator = spawn(class'TBMutator',A); } else { //If there is a HUDMutator attached to the HUD already, call // AddMutator on that hud, passing it a newly spawned mutator // of your own. Note that the AddMutator function will // automatically seek the end of the mutator chain. (If the // one you try to add yourself to has a NextMutator, the // function call is passed to that mutator.) HUD(A).HUDMutator.AddMutator(spawn(class'TBMutator',A)); } //Have to return the original actor (the HUD). If we had // completely replaced it we would return the replacement. return A; } FJ;f%A%?'J@HCA%@HCJm l}n }o pqrsmuN-'a   a  A D?%CzC!FHa=RD%DRa@'a  aL=Dw  }qB Axy_mgJ-'a pBzC!GV'%'Va@'L>a #??, >T9a T333?a #??,AB!G#??,a ף<'H  `t)2{^0_ $pA laM|ncՃC,R}~dXDyF  yG HIJaPEMK-'Z,a  "a  "%CzC!JHaL>C%CZWSa@'a  SaW=C  yN? ORv//============================================================================= // VRocketPack. //============================================================================= class VRocketPack expands RocketPack; var Rotator r; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; num = AmmoAmount; Spawn( class'WarExplosion',,,Location ); HurtRadius(165, 250, 'exploded', 140000, Location ); sleep(0.05); Spawn( class'RocketMk2', Instigator,, Location, rot(49152,0,0) ); for (i=0; i 0.5 ) Spawn( class'UT_Grenade', Instigator,, Location, r ); else Spawn( class'RocketMk2', Instigator,, Location, r ); sleep(rand*0.1); } SetRespawn(); } dVJl-'a pBzC!GL<%<L"a@' L>a  #??, ">T9"a "T333?a  #??,AB!G #??,aL=<H  CF;!f9J9?'FEPQJ9EPQFj RWH` __k\w^ wV  wz9f;Q;?'zPWSQ;PWSz^ abc]eU-'xa  %CzC!SHaL=a  "&%&x>a@'::?a  >a  >a:=&p  wfE ghijXDC; Y//============================================================================= // TeamBeacon. - spawns the notify actor to hook in the HUDMutator // Steve Sinclair, Digital Extremes, Jan 4, 2000 //============================================================================= class TeamBeacon expands Mutator; function PostBeginPlay() { if (Level.bStartup) { spawn(class'TBNotify'); } } Ek DEFewstrv rw xyz{u}B-'ua  "a  "a  A D?BzC!IPGaL=6%6uva@'a  va<6  r~6 @AB[&H,6ra 78P8w w*dL>I?,&Hi7;EI!-a/!a 78?,  L^n;.f1s1?'ntpqs1tpqnZ GJnCKLhN  hO PQRSMUH-'ma  "a  "a=2%2m5a@'ii333?a  5a  5a)\=2b  hV< WXYZG#a#M0N'w.*L#.#0N.#M0L g//============================================================================= // VBioAmmo. //============================================================================= class VBioAmmo expands bioammo; var Rotator r; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; num = AmmoAmount; Spawn( class'BioGlob', Instigator,, Location, rot(49152,0,0) ); Spawn( class'BioGlob', Instigator,, Location, rot(49152,0,0) ); sleep(0.1); for (i=0; i 0.7) Spawn( class'BioGlob', Instigator,, Location, r ); else Spawn( class'UT_BioGel', Instigator,, Location, r ); sleep(0.07); } SetRespawn(); } O&l,6ra /3P3w w*dL>j?,&l[/;Ej!-a/!a /3?,  KL&2_y $pA ccdef eg  hijkemT-'ga  "pBC!@Ga)\=,%,g-a@'ff?a  -a  -aL=,a  enH opqr 2 SpawnNotified!!Pr. *. a [ z. Ka [    G@Hj v- a/!%',a/!('Ba/!!'Xa/!''na/!&'a/!#'a/!$'a/!"'a/! 'a/!)'w* -( a//============================================================================= // VolatileWeapon. - Your active weapon discharges when you are killed. // Steve Sinclair, Digital Extremes, Jan 4, 2000 //============================================================================= class VolatileWeapon expands Mutator; var int mMaxDischarges; function ScoreKill(Pawn Killer, Pawn Other) { local Weapon w; local int ammo_count; local int num_shots; local int i; local Vector vec; local Rotator rot; local float rand; rand = FRand(); // get a random number 0.0 - 1.0 if (Other.Weapon != None) // if victim has a weapon { // we will be 'activating' the weapon through a base class reference // this is good because we don't require any specific knowledge of the actual object w = Other.Weapon; if ( w.AmmoType != None ) // has ammo? { ammo_count = w.AmmoType.AmmoAmount; if (ammo_count > mMaxDischarges) // cap the number of discharges ammo_count = 15; num_shots = ammo_count * ( rand + 0.3); for (i=0; ia/!#DE.VMiniAmmo(a/!Ra/!$DE.VPAmmo(_a/!;a/!"DE.VRifleShell(a/!<a/! DE.VRocketPack(a/!?a/!)DE.VShockCore(l$' xW7 |R˕ՃC,X'X'ѸBX'X'X'ՃC,G"@}s,//============================================================================= // VEClip. //============================================================================= class VEClip expands EClip; var Rotator r; var Vector v; var Vector Direction; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } function actor TraceShot(out vector HitLocation, out vector HitNormal, vector EndTrace, vector StartTrace) { local vector realHit; local actor Other; Other = Trace(HitLocation,HitNormal,EndTrace,StartTrace,True); if ( Pawn(Other) != None ) { realHit = HitLocation; if ( !Pawn(Other).AdjustHitLocation(HitLocation, EndTrace - StartTrace) ) Other = Pawn(Other).TraceShot(HitLocation,HitNormal,EndTrace,realHit); } return Other; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector Direction, Pawn instigatedBy) { local int HitDamage; HitDamage = 17; //same as the enforcer if (Other == Level) { Spawn(class'UT_WallHit',,, HitLocation+HitNormal, Rotator(HitNormal)); } else if ((Other != self) && (Other != None) ) { if ( FRand() < 0.2 ) Direction *= 5; Other.TakeDamage(HitDamage, instigatedBy, HitLocation, 3000.0*Direction, 'shot'); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function TraceFire( Vector Direction, Pawn instigatedBy ) { local Vector HitLocation, HitNormal, StartTrace, EndTrace; local Actor Other; StartTrace = Location; EndTrace = StartTrace + (10000 * Direction); Other = TraceShot(HitLocation, HitNormal, EndTrace, StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, Direction, instigatedBy); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; spawn( class'UT_SpriteBallExplosion',,,Location ); HurtRadius(25, 80, 'shot', 20000, Location ); num = AmmoAmount; for (i=0; i 0.2) { Spawn( class'UT_ShellCase',,, Location + (v+vect(0,0,1))*CollisionHeight*10*rand, r); if (rand > 0.4) { Direction = vector(r); Spawn( class'MTracer',,, Location, r ); TraceFire( Direction, Instigator ); } } sleep(rand*0.04); } SetRespawn(); } b,k #$ ] ?$ c [$ e w$ f  ] AN'2CJ\2 ƒԝXԝXԝX $pA UBc.(B> c<w* .c dEH3A= r * * ^ h%%%/a0 -'10/a0 ):*:)^)3a a-(/a0 ~}-'-(a~10+ 6+?_   a_ aG >?  D  ^ ? ?] baa +],*10,  /a0 a10 c1//============================================================================= // VMiniAmmo. //============================================================================= class VMiniAmmo expands Miniammo; var Rotator r; var Vector v; var Vector Direction; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } function actor TraceShot(out vector HitLocation, out vector HitNormal, vector EndTrace, vector StartTrace) { local vector realHit; local actor Other; Other = Trace(HitLocation,HitNormal,EndTrace,StartTrace,True); if ( Pawn(Other) != None ) { realHit = HitLocation; if ( !Pawn(Other).AdjustHitLocation(HitLocation, EndTrace - StartTrace) ) Other = Pawn(Other).TraceShot(HitLocation,HitNormal,EndTrace,realHit); } return Other; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector Direction, Pawn instigatedBy) { local int HitDamage; HitDamage = 17; //same as the enforcer if (Other == Level) { Spawn(class'UT_WallHit',,, HitLocation+HitNormal, Rotator(HitNormal)); } else if ((Other != self) && (Other != None) ) { if ( FRand() < 0.2 ) Direction *= 5; Other.TakeDamage(HitDamage, instigatedBy, HitLocation, 3000.0*Direction, 'shot'); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function TraceFire( Vector Direction, Pawn instigatedBy ) { local Vector HitLocation, HitNormal, StartTrace, EndTrace; local Actor Other; StartTrace = Location; EndTrace = StartTrace + (10000 * Direction); Other = TraceShot(HitLocation, HitNormal, EndTrace, StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, Direction, instigatedBy); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; spawn( class'UT_SpriteBallExplosion',,,Location ); HurtRadius(60, 250, 'shot', 70000, Location ); num = AmmoAmount; for (i=0; i 0.2) { Spawn( class'UT_ShellCase',,, Location + (v+vect(0,0,1))*CollisionHeight*10*rand, r); if (rand > 0.4) { Direction = vector(r); Spawn( class'MTracer',,, Location, r ); TraceFire( Direction, Instigator ); if (rand > 0.7) { Spawn( class'UT_SpriteBallChild',,, Location + (v+vect(0,0,1))*CollisionHeight*5*rand); HurtRadius(30, 100, 'shot', 35000, Location + (v+vect(0,0,1))*CollisionHeight*5*rand); } } } sleep(rand*0.02); } SetRespawn(); } q//============================================================================= // VFlakAmmo. //============================================================================= class VFlakAmmo extends flakammo; var Rotator r; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; num = AmmoAmount/2; Spawn( class'FlakSlug', Instigator,, Location, rot(49152,0,0) ); Spawn( class'FlakSlug', Instigator,, Location, rot(49152,0,0) ); HurtRadius(165, 250, 'shredded', 140000, Location ); sleep(0.2); for (i=0; ia K#??, !>O9!a !Oa #=$H  X a`.b'w. *d. .b . `.d  Iz#2Pm[52XԝXԝXԝX $pA L1//============================================================================= // VBulletBox. //============================================================================= class VBulletBox expands BulletBox; var Rotator r; var Vector v; var Vector Direction; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } function actor TraceShot(out vector HitLocation, out vector HitNormal, vector EndTrace, vector StartTrace) { local vector realHit; local actor Other; Other = Trace(HitLocation,HitNormal,EndTrace,StartTrace,True); if ( Pawn(Other) != None ) { realHit = HitLocation; if ( !Pawn(Other).AdjustHitLocation(HitLocation, EndTrace - StartTrace) ) Other = Pawn(Other).TraceShot(HitLocation,HitNormal,EndTrace,realHit); } return Other; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector Direction, Pawn instigatedBy) { local int HitDamage; HitDamage = 38; if (Other == Level) { Spawn(class'UT_WallHit',,, HitLocation+HitNormal, Rotator(HitNormal)); } else if ((Other != self) && (Other != None) ) { if ( FRand() < 0.2 ) Direction *= 5; Other.TakeDamage(HitDamage, instigatedBy, HitLocation, 3000.0*Direction, 'shot'); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function TraceFire( Vector Direction, Pawn instigatedBy ) { local Vector HitLocation, HitNormal, StartTrace, EndTrace; local Actor Other; StartTrace = Location; EndTrace = StartTrace + (10000 * Direction); Other = TraceShot(HitLocation, HitNormal, EndTrace, StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, Direction, instigatedBy); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; spawn( class'UT_SpriteBallExplosion',,,Location ); HurtRadius(60, 250, 'shot', 70000, Location ); num = AmmoAmount; for (i=0; i 0.2) { Spawn( class'UT_ShellCase',,, Location + (v+vect(0,0,1))*CollisionHeight*10*rand, r); if (rand > 0.4) { Direction = vector(r); Spawn( class'MTracer',,, Location, r ); TraceFire( Direction, Instigator ); if (rand > 0.7) { Spawn( class'UT_SpriteBallChild',,, Location + (v+vect(0,0,1))*CollisionHeight*5*rand); HurtRadius(30, 100, 'shot', 35000, Location + (v+vect(0,0,1))*CollisionHeight*5*rand); } } } sleep(rand*0.05); } SetRespawn(); } QS!2Sp бxԝXԝXԝX $pA [g://============================================================================= // TBMutator. // Steve Sinclair, Digital Extremes, Jan 4, 2000 // originally this was going to be a HUD mutation // but using actual sprites worked better than overlays // I stayed with the HUDmutator paradigm because it was the easiest // way for me to hook this into network clients and might also // be complimented by some more PostRender action //============================================================================= class TBMutator expands Mutator; var float mMinScale; var float mMaxScale; var PlayerPawn PlayerOwner; // sets the sprite's texture based on team id simulated function SetSymbol( IdentitySymbol s, byte team) { switch (team) { case 0: s.Texture = texture'TSignR'; break; case 1: s.Texture = texture'TSignB'; break; case 2: s.Texture = texture'TSignG'; break; case 3: s.Texture = texture'TSignY'; break; default: s.Texture = texture'TSignR'; } } simulated function PostRender(Canvas canvas) { PlayerOwner = Canvas.Viewport.Actor; // call the next HUDmutator if ( NextMutator != None ) { NextMutator.PostRender(Canvas); } } simulated function Tick(float Delta) { local Pawn P; local float dist; local Vector dir; local Vector loc; local byte team_id; local int num_used; local int player_id; local int team_count; local int symbol_count; local float draw_scale; local float interp; local PlayerReplicationInfo PRI; local IdentitySymbol s; if (PlayerOwner == None)// || !PlayerOwner.Level.Game.bTeamGame) { return; } // get the player's information team_id = PlayerOwner.PlayerReplicationInfo.Team; player_id = PlayerOwner.PlayerReplicationInfo.PlayerID; num_used = 0; team_count = 0; symbol_count = 0; // count the symbols in the client environment and set them available foreach AllActors (class 'IdentitySymbol', s) { symbol_count++; s.bHidden = True; // we use this to set the symbol as 'available' for assignment } // cycle through the Pawns and assign symbols to team mates // this is far from the optimal way to do it foreach AllActors (class'Pawn', P) { PRI = P.PlayerReplicationInfo; if ( team_id == PRI.Team && player_id != PRI.PlayerID) { team_count++; if (team_count > symbol_count)// spawn if need more { s = Spawn(class 'IdentitySymbol', P); s.SetOwner(P); s.bHidden = False; symbol_count++; } else // otherwise, assign a free IdentitySymbol to someone { foreach AllActors (class 'IdentitySymbol', s) { if (s.bHidden == True) { s.bHidden = False; s.SetOwner(P); break; } } } // set sprite location above their head loc = P.Location; loc.z += P.CollisionHeight * 1.75; // interp from min/max view distance, to scale the sprite based on distance dir = P.Location - PlayerOwner.Location; dist = VSize(Dir); interp = Dist/32768.0; // adjust sprite scale if zooming :kludged values: interp -= 0.3 * (1.0-(PlayerOwner.FOVAngle / PlayerOwner.DesiredFOV)); // clamp if (interp < 0.0) interp = 0.0; if (interp > 1.0) interp = 1.0; draw_scale = Lerp( interp, mMinScale, mMaxScale); s.SetLocation(loc); s.DrawScale = draw_scale; SetSymbol(s, team_id); // update the texture } } // destroy excess symbols if (symbol_count > 32 && symbol_count > team_count) { foreach AllActors (class 'IdentitySymbol', s) { if ( symbol_count > team_count) { s.Destroy(); symbol_count--; } else break; } } } ``\+'EUw* w * x`,YD?U>(%(Y - @|a@a \  |(*Cw*+\ RXD //============================================================================= // IdentitySymbol. - just a sprite displayed above team mates // instanced by the TBMutator // Steve Sinclair, Digital Extremes, Jan 4, 2000 //============================================================================= class IdentitySymbol expands Effects; #exec TEXTURE IMPORT NAME=TSignB FILE=Textures\Tsignb.pcx GROUP=DE Mips=Off Flags=2 #exec TEXTURE IMPORT NAME=TSignR FILE=Textures\Tsignr.pcx GROUP=DE Mips=Off Flags=2 #exec TEXTURE IMPORT NAME=TSignG FILE=Textures\Tsigng.pcx GROUP=DE Mips=Off Flags=2 #exec TEXTURE IMPORT NAME=TSignY FILE=Textures\Tsigny.pcx GROUP=DE Mips=Off Flags=2 A+//============================================================================= // VolatileAmmo //============================================================================= class VolatileAmmo extends Mutator; function bool AlwaysKeep(Actor Other) { local bool bTemp; if ( Other.IsA('VBioAmmo') ) return true; if ( Other.IsA('VBladeHopper') ) return true; if ( Other.IsA('VBulletBox') ) return true; if ( Other.IsA('VEClip') ) return true; if ( Other.IsA('VFlakAmmo') ) return true; if ( Other.IsA('VMiniAmmo') ) return true; if ( Other.IsA('VPAmmo') ) return true; if ( Other.IsA('VRifleShell') ) return true; if ( Other.IsA('VRocketPack') ) return true; if ( Other.IsA('VShockCore') ) return true; if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { // Other.Owner == None as well for initial level ammo if ( Level.bStartup && Other.IsA('Ammo') ) { if ( Other.IsA('BioAmmo') && !Other.IsA('VBioAmmo') ) { ReplaceWith(Other, "DE.VBioAmmo"); return false; } if ( Other.IsA('BladeHopper') && !Other.IsA('VBladeHopper') ) { ReplaceWith(Other, "DE.VBladeHopper"); return false; } if ( Other.IsA('BulletBox') && !Other.IsA('VBulletBox') ) { ReplaceWith(Other, "DE.VBulletBox"); return false; } if ( Other.IsA('EClip') && !Other.IsA('VEClip') ) { ReplaceWith(Other, "DE.VEClip"); return false; } if ( Other.IsA('FlakAmmo') && !Other.IsA('VFlakAmmo') ) { ReplaceWith(Other, "DE.VFlakAmmo"); return false; } if ( Other.IsA('MiniAmmo') && !Other.IsA('VMiniAmmo') ) { ReplaceWith(Other, "DE.VMiniAmmo"); return false; } if ( Other.IsA('PAmmo') && !Other.IsA('VPAmmo') ) { ReplaceWith(Other, "DE.VPAmmo"); return false; } if ( Other.IsA('RifleShell') && !Other.IsA('VRifleShell') ) { ReplaceWith(Other, "DE.VRifleShell"); return false; } if ( Other.IsA('RocketPack') && !Other.IsA('VRocketPack') ) { ReplaceWith(Other, "DE.VRocketPack"); return false; } if ( Other.IsA('ShockCore') && !Other.IsA('VShockCore') ) { ReplaceWith(Other, "DE.VShockCore"); return false; } } bSuperRelevant = 0; return true; } Xg|Z//============================================================================= // VShockCore. //============================================================================= class VShockCore extends ShockCore; var Rotator r; var int i; var int num; var float rand; function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Instigator = instigatedBy; GotoState('TakingDamage'); } State Sleeping { ignores TakeDamage, Touch; } State TakingDamage { ignores TakeDamage, Touch; Begin: bHidden = true; Spawn( class'UT_ComboRing',,, Location, Instigator.ViewRotation ); PlaySound( Sound'UnrealShare.General.SpecialExpl',,20.0,,2000,0.6); HurtRadius(165, 250, 'Jolted', 140000, Location ); sleep(0.1); num = AmmoAmount; for (i=0; iE<EjEcEgEEcP~QAoE;~mR{RNpOEhEPE]v.v2E^RIvCA@EYv+EdEav-Q\|Av3EUd{dbv0QYLBdXE\EkEREe4mdV{gC08yQ0v J2wgW2V e2V q2F }2WJ3H X3[@ d3slq3g 3t L4Cg Y4^g f4gs4g A5gN5[g \5g i5g v5E C6vO6V ]6\i6\w6\E7J S7u`7 n7{7uI8W8 e8[\r8k @9`M9k [9k h9k u9q B:BO:n ]:k j: w:uD;^\ R;[u_;E`m;k {;^nH<uV< d<k q<C\ ~<CnK=`Y=V g=`s=k A>uN> \>ni>\ w>nD?\R?_k `?k m?g z?HG@&U@CK {@CHGAuUAucA[o qA[n ~A[`KBH YB\fBn tBQ AC_NCH \CV iCQ uC_V AD&MDK sD_Q D:uLE[ AKG NKD ZKJ fKn sKt @L`ML[ [Lo hL&uLV [MQ gM&tMV ZN^HfNutN^K BOQ NOEH[OV iOE\uOEn CP'PPEuwPEg EQQ RQ _Q&lQQ RR_'^RHESHSSqaS'oSQ VTbTg pTu}TxCKUn Nen [eHhe`ve&Df\jfo xfHEgK SgQ _go kg`xgn Fhg Shu`h&nhn TiH aiK niHzi\HjX}Vj}djE}rj^}@k}NkNRA\k}nw}||G J[B V[N be}oy}}r}K}}YG}gC uC}B}Pm ^{wk}yh}G}U}c6qf4kp e[U @\LZZvhj^G l}y\G(eUZz$eHf4g'mtG T\aZoG }qJ"Q{yLG E}RG `U mU yZEqS\DGRG o%e| +aGL\i9AwRxcU}xU FZR\`jnf4r|}n}|\JZXU f}rG@G ]V jXv}G Sf4b`YB}Z[}U i +u}`G }}J\XZfU tE@}EZb}p\~ZL]Z)nwMbe+U G+ZS+\ayG oU |G HyZUyU c_ +oyZG w}D\RZ`\n_V|y R G o }|ZJf4AXU Y]eYB+}[RiG FwG S}\`U nwZzwU H +TwY\}u\CZQU _[kw$F%G c%}p%\~%ZL%U ZX-ff4dC +gV Rt}^rG lG yr\FrZTrU b +nr5Y6G v6}C6\Q6Z_6U m]yr<V=G s=}@=\N=Z\=U jsv[jiYwt\PtZ^hG ly\yh\GhZUhU c +ohMZNG wN}DN\RNZ`NU nNzhTHUG eU}rU\@UZNUU \qhGU Yf4resW&eJeG oU |e\HeZVeU d +pee[fG xf}Ef\SfZafU oQ{elLmG im}vm\DmZRmU `2rlG^sj{s} I-RV|f4lhwj TwC aC\ m7BI ZK{j Y \e U sf4~,[,@}'Q}+G N[.F[ja[3]oI Lf4n1XtU F_f4|RGZNG\\wjqa#RRf4W1dXU {!RGw\Y[f4r:gG Y|+vfXZ\X\jf4O xf4L+GXG SGG `LmU {f4eG0/l +[MKAF +QORA|PRANMC`cDigital Extremes' Mutators! Copyright (c) 2000 Digital Extremes Released: January 4, 2000 http://www.digitalextremes.com =================================== Volatile Ammo Mutator --------------------- Author: Adriano Bertucci (adriano@digitalextremes.com) This mutator replaces all the ammo on a level with an exploding version. When the ammo pickup is shot, it explodes like the ammunition type it contains. Since I had to create new exploding ammuntion classes, these actors can be placed on new levels during level design. This mutator does not work when used with the Arena Mutators because they don't allow the ammo or weapons to be replaced. TODO: When you kill someone with exploding ammo, the death message relates to the weapon you are holding, not the ammo that blew up. I've got some awesome death messages (thanks to James Edwards), but I didn't have a chance to get it working over the network. Team Beacon ----------- Author: Steve Sinclair (steve@digitalextremes.com) This places an icon above teammates during team games. The sprite doesn't scale so well when the sniper rifle is used. The icon is a 3d world object so it will, at times, intersect with the world geometry. (Thanks: Andrew "drunken master" Scholer) Volatile Weapon --------------- Author: Steve Sinclair Tiny mutator that causes a killed player to discharge their weapon. The weapon is destroyed (no pickup left behind). *Visit The Mutation Device: http://www.planetunreal.com/mutation/ **If you find any bugs, or have any comments, please send them to the author's email address noted above. BM6(RR )1 199#7!9BB!B)B!B*:!?#+9 J!JJ!J )D)J)B1F!J% FR%!J%-D%-J'7H15J!R!R)R\!R!!RZ` /S/]-V1`!)R5R)^5Z!Z!!Z)T1!Z!c!!c!)Z%%c&.R)5R)9R19R))Z))c).])9Z!k1c9c!9c!s!!k/l1w!%o!)s&3e!9k!!{!){!5s!1{)%k1)k)!s))s1)s)!{)){1){)5k)1s11k55k)9s)1{11s55s1!9{)3)9{))!)!3)1)9))11{19{1)1119)1119!9)9191!19)111-9"5!911)9&BN#DWEe'Gc3F\3Hg9R^9RiGwF*D{5E{Tx6YwBTqBau"B)B1B19999=991BPN+N7H]'\-d-q#B19!J)J995=1J9J%F)J1B9B%B5J)H5F&T9R9N9Z-V9N)V3Wp(o5a3g/,/5JemLh{EdJpFZHlVsNsJ~JF}H[{U|\eEOEWGhHhI]TZJ\NMnjhmhdQi|Xyaw()(((()" ))B( ))))" ))()B""(()BB(() ()))")(()))))")))"))))) ( NgNOsH`sss@cOOgsOssII`Ogxssc6[oKK,aaia.O|aOzgOptaxcih{hJi5Kgg.NsHQDŽ?ԄEM]st֧php_!d5Ş7QՎ6:11pY?Xpq\hnKh;I3KҺ͍?i{9SHya愑s]dNitoH5 X^oudN6đI<FoK{]Mhg懊ti.cGOIXi7nGF{{uuAohE2u,ٍ:hHp:9g{\h7dޅҕS^!Î{noƋh'̏ >E&P Y> +B+++*F+++FF.** *+FG+F.+FFFF!*AAA**AFGF.!*A*.F *AAA*.A.. ** %ؾŸ9!>!16A,66\JA8,,NXX>,66,X>>,,dJ>>>>>>6<><8,852h6:OtlsiOiHtI{%NN7%hp1C?nhnVS{hVh{hS1P11OYQ7{tYS=1 J8uo]tuPno7Y%N71?|{V1:dnhnSqPyuE1 !N1SPt{idY$\uY{7OHhoYYOdH\:u{SJt{uonnkk{qq{k HY==I]Y]]7 Ya-ol]wS7H{tolYik96%:unpuuuoou{h{qhS51$S17=YY]]P$OK,ѧoo|t]HYIHg{YYd\>Jp]<9zt,Jhho^]]hunnnunuunP5%`n5Y=Y]YS1 \po{i1Hhp]iYtSSHiX\lh]:5t:ih]okn]Yiu{nnh{qk17%5Y1MhMto== XPYth7HghnH{itu7IhlYt>O9h]]uh]kokhukhhnnP1 ]qSIY]lZS0 ]\$V{hH5SP4ueV5pVh{YJ6npnVnhuunSWnWSTTTTQ7$2P7$==koS$IK     %17%%11% ;ދ     ^1 sCBF .* " ! !!6,9 !! "++ # J7 hKՏ7% hKۿ⿿ʼԽ<$ oCԄP]9;;;;]% MK8,,8>>X?988,>JJ\>8>JJ,89\JJXK?XXX???999999998889889P0xuQPIS%MIIMI]kMhd]777D]`u51It]H?{th{uk^_^^ZPQ==Z==Z<=Z;S h]=1wS1MoQY_YtOtkHyMP=gutS%Yu8JYIhtk]olYPQZZ^ZPPY=Z=7$O=7HIHHghk^]{iiuhp7YnSt7EH,\\98hw]kYZZYkol^===Z^=H% I '1@IMt_Y]u{h]hkQPI]htSփo:Mwqnok^^YYYo^==ZYS1;10 gHI,ʾtѭl,%!%5PPEP77% ˾Y=J>;-*,J6,%,-Y{вo:-, /˿iS2oP;·;]{uK;ՄJtS1]i1%8ɏ΄.Joejzo?ÏՇ:9=hhP&t{P1t;8>6,i]{Ыz~{|\?Ä:?YkSi]P2{]^YgX9;Ç;:C\oYYJXdi{HGydX:Ǝ9XoqM]MoqS 1%YkSX7.C898866J=7171YNJ7PH]hhnH1MEHVhnhhYEVSPPHP]YJ1$171$111E%2{H .!!!!!6A6AA6..AAA,!,6,,!A67661!!!1AA.!%!!!!!16!    {E2h%3|uE28,,88,8>>8>>l\\>88>>>>>l>>>iX8JoodX,<,oo^l_J,J>,,,,,,,o{'3%>ӳ-YA/  /A-d///t{nkn%/a-///-Bh!3;8φo͗{Ē{:!A.%1n%3l򆑱܄ݗt]Л{%Q\?򆱺ݗ7ϛݧu7鳲i,[|\C򱗦 盷ݧśu=n7Ħ{pYQᄊك\ӷݱǗS={upI=\ѧޒnҲޱ׫kh7泗{tu==8Y=>߲ %1%/޳]1%517ݔ{1{{{P<:-Ӳ{fª߱8{5撧ioE=߳ҺpIppp߲Β֕u鳭u%_ҳ߳]HY=ױ]Ppײ߭|nYhh{hi>ЧuP5h1HVnЗqkVqѲqqnmknkqq{{t;X\\\X\__\X>6>l_=1!$17%1===XX=16YX_l^YYl_^\lY^7=%%<<<