[Setup] Product=Nevett's Mutator Pack Version=100 Archive=NevPack.umod SrcPath=. MasterPath=.. Group=SetupGroup Group=umodINIGroup Group=NevPackGroup [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=1340,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=239,Flags=3) [umodINIGroup] Ini=System\Mutators.ini,Nevpack.Realism.DefaultSpeed=0.75 Ini=System\Mutators.ini,Nevpack.Realism.FallDamageMultiplier=2 Ini=System\Mutators.ini,Nevpack.Realism.HeadshotMultiplier=5 Ini=System\Mutators.ini,Nevpack.Realism.HeadSpeedLoss=0.1 Ini=System\Mutators.ini,Nevpack.Realism.LegshotMultiplier=0.4 Ini=System\Mutators.ini,Nevpack.Realism.LegSpeedLoss=0.4 Ini=System\Mutators.ini,Nevpack.Realism.MaxSpeed=1.5 Ini=System\Mutators.ini,Nevpack.Realism.MediKitSpeed=0.2 Ini=Mutators.ini,Nevpack.Realism.MinSpeed=0.1 Ini=System\Mutators.ini,Nevpack.Realism.NoPickups=True Ini=System\Mutators.ini,Nevpack.Realism.TorsoshotMultiplier=3 Ini=System\Mutators.ini,Nevpack.Realism.TorsoSpeedLoss=0.1 Ini=System\Mutators.ini,Nevpack.Realism.WoundDamage=90 Ini=System\Mutators.ini,NevPack.SpeedFreak.MaxSpeed=3 Ini=System\Mutators.ini,NevPack.SpeedFreak.MinSpeed=0.1 Ini=System\Mutators.ini,Nevpack.TimeBomb.InitialTime=100 Ini=System\Mutators.ini,Nevpack.TimeBomb.TimeForKill=15 [NevPackGroup] File=(Src=System\NevPack.int,Size=1413) File=(Src=System\NevPack.u,Size=26556) File=(Src=Help\NevettsPackReadme.txt,Size=4201) [Setup] LocalProduct=Nevett's Mutator Pack ReadMe=Help\NevettsPackReadme.txt SetupWindowTitle=Nevett's Mutator Pack AutoplayWindowTitle=Nevett's Mutator Pack Options ProductURL=n/a VersionURL=n/a Developer=Nevett DeveloperURL=n/a [Public] Object=(Name=NevPack.TimeBomb,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - Timebomb,Everyone has a time bomb strapped to their chest. Stay alive by fragging!") Object=(Name=NevPack.AutoCannon,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - MakeACannon,People can make their own AutoCannon at the expense of 90 health.") Object=(Name=NevPack.Realism,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - Realism,Damage is more realistic.") Object=(Name=NevPack.SpeedFreak,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - Speed Freak,People speed up with kills and slow down with deaths.") Object=(Name=NevPack.EnforcerArena,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - Enforcer Arena,Start with an enforcer.") Object=(Name=NevPack.RedeemerArena,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - Redeemer Arena,The name says it all.") Object=(Name=NevPack.BioRifleArena,Class=Class,MetaClass=Engine.Mutator,Description="Nevett - BioRifle Arena,Gloop Guns!.") Preferences=(Caption="Mutators",Parent="Advanced Options") Preferences=(Caption="Nevett - Timebomb",Parent="Mutators",Class=Nevpack.Timebomb,Immediate=True) Preferences=(Caption="Nevett - Realism",Parent="Mutators",Class=Nevpack.Realism,Immediate=True) Preferences=(Caption="Nevett - Speed Freak",Parent="Mutators",Class=Nevpack.SpeedFreak,Immediate=True) Áƒ*žDScoreKillNoPickupsPawnOwnerShockWaveLevelInfoWoundPainä?N$"d$š™™>0$$T!˙˙ // AutoCannon. //============================================================================= class AutoCannon expands NevPack; function MakeGun ( Playerpawn Maker ) // This function makes the AutoCannon at the players feet { local vector X,Y,Z; local MinigunCannon Gun; // Make the Gun GetAxes(Maker.ViewRotation,X,Y,Z);// Sort out the angles if (Maker.Health < 91 ) // Only if the maker has more than 90 health return; // Uh, oh... Not enough health... Bye! Maker.Health -= 90; // Yep, lets get his health Gun = Spawn( Class'MinigunCannon',,,Maker.Location + 72 * Vector(Maker.Rotation)); // Spawn the gun Gun.Myteam = Maker.PlayerReplicationInfo.Team; // Set it up for his team } function Mutate ( string Command, Playerpawn Sender ) // Called on a player using the mutate command { switch Command // What's the command then? { case "MakeGun": // 'MakeGun', eh? MakeGun ( Sender ); // Go on then, lets make one! break; } } ä?N …// NevPack. //============================================================================= class NevPack expands Mutator; function int FindPRIIndex(Pawn P) { local int i; local Pawn PawnOwner; for (i=0; i<32; i++) if (Level.Game.GameReplicationInfo.PRIArray[i] != None) { PawnOwner=Pawn(Level.Game.GameReplicationInfo.PRIArray[i].Owner); if (PawnOwner==P) return i; } // Not found return -1; } ä?N …// EnforcerArena. //============================================================================= class EnforcerArena expands NevArena; event PreBeginPlay() { DefaultWeapon = class'DoubleEnforcer'; WeaponString = "Enforcer"; WeaponName = 'Enforcer'; AmmoString ="MiniAmmo"; AmmoName = 'MiniAmmo'; } ä?N …// Timebomb // // Every person starts with a certain amount of time (configurable) for every // frag he scores, his time increases (also configurable) If, however, his // time runs out, the Nuke strapped to him goes BANG! with all the force of // a Redeemer. // // The source code has alot of comments to help people new to UT editing //============================================================================= #exec OBJ LOAD FILE=..\Sounds\NevSounds.uax // Just loads my warning sound // BTW, adding custom sounds, models, textures etc. will make your mutator a client-side // mod, not server-side. This means clients will also need a copy of the mod, // or it will either crash UT, refuse to work, or the client will not be able to // see/hear any new things. class Timebomb expands NevPack config (Mutators); // This is a mutator called TimeBomb, from NevPack, its configurable var bool bBeenRun; // Just so the PostBeginPlay function runs only once. var config int InitialTime; // How much time do players start with on their bombs? Configurable. var config int TimeForKill; // How much time do players get for a frag? Configurable. var int TimeLeft[32]; // An array, how much time each player has on his bomb. function PostBeginPlay() // This sets up the mutator { local int i; if (bBeenRun) // Only run once return; // Already been run bBeenRun=True; // To show that this function has been run SetTimer(1, True); // Make the Timer() function run every 1 second if (InitialTime < 5) // Initial time is a stupid number or not set InitialTime = 60; // Reset it to the default if (TimeForKill == 0) // Time for kill is not set TimeForKill = 10; // Reset to default for (i=0;i<32;i++) // Run this 32 times { TimeLeft[i] = InitialTime; // Set each TimeLeft to the Initial Time } Super.PostBeginPlay(); } function Bomb (Pawn Bomb) // Called upon a players time reaching zero. Creates a big explosion { spawn(class'ShockWave',,,Bomb.Location); // Thats it! The shockwave creates its own RadiusDamage and stuff } function CheckForSound ( Pawn Ent , int Time ) // To be fixed next version, supposed to announce someones imminent death... { // Nothing here! } function MakeWarningBeep (Pawn Beeper) { local Sound Beep; Beep = Sound(DynamicLoadObject("NevSounds.WarningBeep", class'Sound')); // ClientPlaySound(Announcement, true, true); PlayOwnedSound(Beep, SLOT_Talk, 1.5, true, 1200, 1.0 ); } function Timer() // Run every second { local Pawn PawnOwner; local int i; for (i=0; i<32; i++) // Go through every player { if (Level.Game.GameReplicationInfo.PRIArray[i] != None) { PawnOwner=Pawn(Level.Game.GameReplicationInfo.PRIArray[i].Owner); if (PawnOwner!=None) { if (PawnOwner.IsA('TournamentPlayer') || PawnOwner.IsA('Bot')) // Found one! { TimeLeft[i]--; // Decrease his time... if (TimeLeft[i]<=-3 && !PawnOwner.IsInState('Dying')) // Check if it has run out, but wait till he is alive { TimeLeft[i] = InitialTime; // Reset his timer Bomb( PawnOwner ); // Make him explode } //CheckForSound(PawnOwner, TimeLeft[i]); // Does nothing at the moment if (TimeLeft[i] > 0) { if (TimeLeft[i] > 10) // Does he have more than 10 seconds on the clock? PawnOwner.ClientMessage("You have "$TimeLeft[i]@" seconds left", 'CriticalEvent'); // Yes, give him his time else PawnOwner.ClientMessage("You have "$TimeLeft[i]@" seconds left", 'CriticalEvent', true); // No, make it beep a warning } else if (TimeLeft[i] > -3) PawnOwner.ClientMessage("Tick...", 'CriticalEvent'); // Send annoying message else PawnOwner.ClientMessage("KABOOOM!", 'CriticalEvent'); // Send even more annoying message if (TimeLeft[i] == 0) MakeWarningBeep (PawnOwner); } } } } } function ScoreKill(Pawn Killer, Pawn Other) // Run every time someone scores a kill { local int killerindex; local int victimindex; killerindex = FindPRIIndex ( Killer ); victimindex = FindPRIIndex ( Other ); // Find the array number for each one if (TimeLeft[killerindex] < 0) // Killer is on his 3 second death count goto Noway; If (killerindex != victimindex) // Is it suicide? { If (killerindex != -1) // Nope TimeLeft[killerindex] += TimeForKill; // Bump up the killers time } else { // Yep, suicide } Noway: if ( NextMutator != None ) NextMutator.ScoreKill(Killer, Other); // Lets be good coders and let other mutators do ScoreKill stuff } // THE END ! ;) // NevArena. //============================================================================= class NevArena expands Arena; // BioRifleArena. //============================================================================= class BioRifleArena expands NevArena; event PreBeginPlay() { DefaultWeapon = class'ut_biorifle'; WeaponString = "ut_biorifle"; WeaponName = 'ut_biorifle'; AmmoString = "bioammo"; AmmoName = 'bioammo'; } // RedeemerArena. //============================================================================= class RedeemerArena expands NevArena; event PreBeginPlay() { DefaultWeapon = class'WarheadLauncher'; WeaponString = "WarheadLauncher"; WeaponName = 'WarheadLauncher'; AmmoString = "WarHeadAmmo"; AmmoName = 'WarHeadAmmo'; } // Realism. //============================================================================= class Realism expands NevPack config (Mutators); var bool bInit; // Has PostBeginPlay been run? var int LastHealth[32]; // Has the player grabbed a medikit? var int WoundPain[32]; // Or is he wounded? var name LastDamageType[32]; // Yes? How? var Pawn LastAttacker[32]; // Oh dear, and by who? var float SpeedMultiplier[32]; // Slow the injured var config float LegshotMultiplier; // See readme for details of var config float HeadshotMultiplier; var config float TorsoshotMultiplier; // all var config float MaxSpeed; var config float LegSpeedLoss; // of var config float HeadSpeedLoss; var config float TorsoSpeedLoss; // these! var config float FallDamageMultiplier; var config int WoundDamage; var config float MinSpeed; var config float DefaultSpeed; var config float MediKitSpeed; var config bool NoPickups; // Wow, alot of configurable stuff here! function PostBeginPlay() { local int i; if (bInit) // Only run once return; // Been run. Bugger off! Level.Game.RegisterDamageMutator( Self ); // So that the MutatorTakeDamage will work SetTimer (0.2,true); // Run Timer every 0.2 seconds bInit=True; // Been run Super.PostBeginPlay(); } function SetSpeed (Pawn P,int i) // Update a certain plavers speed { if (SpeedMultiplier[i] < MinSpeed) // Can't go below minimum speed SpeedMultiplier[i] = MinSpeed; if (SpeedMultiplier[i] > MaxSpeed) // Or above maximum SpeedMultiplier[i] = MaxSpeed; P.GroundSpeed=P.class.default.GroundSpeed*SpeedMultiplier[i]; // Update Groundspeed P.WaterSpeed=P.class.default.WaterSpeed*SpeedMultiplier[i]; // And Waterspeed P.AirSpeed=P.class.default.AirSpeed*SpeedMultiplier[i]; // And Airspeed } function Timer() // Run every 0.2 seconds { local Pawn PawnOwner; local int i; for (i=0; i<32; i++) // Go through every player { if (Level.Game.GameReplicationInfo.PRIArray[i] != None) { PawnOwner=Pawn(Level.Game.GameReplicationInfo.PRIArray[i].Owner); if (PawnOwner!=None) { if (PawnOwner.IsA('TournamentPlayer') || PawnOwner.IsA('Bot')) // Found one! { if (WoundPain[i] > 1) // Is this man wounded? PawnOwner.TakeDamage (WoundPain[i],LastAttacker[i],vect(0,0,0),vect(0,0,0),LastDamageType[i]); // Lets take some damage then! if (PawnOwner.health < 0) // Is he dead? WoundPain[i] = 0; // Then he isn't wounded! if (PawnOwner.health > LastHealth[i]) // Has he gained health since last check? { SpeedMultiplier[i] += MediKitSpeed; // Give him a speed boost SetSpeed (PawnOwner,i); // Update his speed WoundPain[i] = 0; // And heal his wounds } LastHealth[i] = PawnOwner.health; // Reset the counter } } } } } function ModifyPlayer(Pawn Other) // Called every respawn { local int i; i = FindPRIIndex(Other); // Get this guy's index no. SpeedMultiplier[i] = DefaultSpeed; // Reset his speed SetSpeed(Other,i); // And update it LastHealth[i] = Other.Health; // Reset his health counter to prevent a speed boost if ( NextMutator != None ) // Any other mutators out there? NextMutator.ModifyPlayer(Other); } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) // Someone's took some damage! { local int i; local int wound; wound = ActualDamage; i = FindPRIIndex(Victim); if (Victim.IsA('Pawn')) // Is it human? { // Yep! if ( (HitLocation.Z-Victim.Location.Z < -0.05*Victim.CollisionHeight) || (DamageType=='fell')) { // Legs hit, or fall damage taken if (i>-1) // We have a victim! { if (DamageType=='fell') // Fall? ActualDamage*=FallDamageMultiplier; else // Or bullet? ActualDamage *= LegshotMultiplier; SpeedMultiplier[i]-= LegSpeedLoss; // Either way he loses speed } } else if (HitLocation.Z-Victim.Location.Z>0.62*Victim.CollisionHeight) { // We have a headshot! if (i>-1)// And a victim! { ActualDamage *= HeadshotMultiplier; // Ooh, painful! SpeedMultiplier[i]-=HeadSpeedLoss; // Slow the poor sod down } } else // Any other damage. (Torso, arm, splash, drowning, whatever else) { if (i>-1) { ActualDamage *= TorsoshotMultiplier;// We have pain! SpeedMultiplier[i]-=TorsoSpeedLoss; // And loss of speed if ((wound > 2) && (WoundPain[i] == 0) && (Victim.health < WoundDamage)) {// Yes! this guy is woundable! WoundPain[i] = wound; // Add the damage LastAttacker[i] = InstigatedBy; // Give cred to the guy who dealt the wound LastDamageType[i] = DamageType; // And the gun that hurt 'im Victim.ClientMessage("Wounded by"@InstigatedBy.PlayerReplicationInfo.PlayerName, 'DeathMessage', true); InstigatedBy.ClientMessage("You wounded"@Victim.PlayerReplicationInfo.PlayerName, 'DeathMessage', true); // Tell them both } } } } SetSpeed(Victim,i); // Update speeds! if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } function bool CheckReplacement (Actor Other, out byte bSuperRelevant) { If (Other.IsA('TournamentPickup') && (NoPickups == true)) // We dont want pickups! ReplaceWith(Other,"MedBox"); // Replace it with a health kit If (Other.IsA('HealthPack') && (NoPickups == true)) // We don't want that UNREALISTIC keg ReplaceWith(Other,"MedBox"); // Replace that also bSuperRelevant = 0; return true; } // SpeedFreak. //============================================================================= class SpeedFreak expands NevPack config (Mutators); var config float MaxSpeed; var config float MinSpeed; var float speed[32]; var bool bInit; function PostBeginPlay() { local int i; if (bInit) return; SetTimer (0.2,true); bInit=True; for (i=0;i<32;i++) Speed[i] = 1; // Set all the speeds to 1 Super.PostBeginPlay(); } function SetSpeed (Pawn P,int i) // Updated the various types of speeds { P.GroundSpeed=P.class.default.GroundSpeed*Speed[i]; P.WaterSpeed=P.class.default.WaterSpeed*Speed[i]; P.AirSpeed=P.class.default.AirSpeed*Speed[i]; } function Timer() { local Pawn PawnOwner; local int i; for (i=0; i<32; i++) { if (Level.Game.GameReplicationInfo.PRIArray[i] != None) { PawnOwner=Pawn(Level.Game.GameReplicationInfo.PRIArray[i].Owner); if (PawnOwner!=None) { if (PawnOwner.IsA('TournamentPlayer') || PawnOwner.IsA('Bot')) { SetSpeed (PawnOwner,i); //Update speeds } else Speed[i] = 1; } else Speed[i] = 1; // Client disconnected, reset to 1 } } } function ScoreKill(Pawn Killer, Pawn Other) { local int vict,kill; vict = FindPRIIndex (Other); kill = FindPRIIndex (Killer); if ((Killer != Other) && (Other != None) && (Killer != None)) { if (speed[kill] > MaxSpeed) speed[kill] = MaxSpeed; else speed[kill] += 0.1; // Speed up the killer speed[vict] -= 0.1; // Slow down the victim if (speed[vict] < MinSpeed) speed[vict] = MinSpeed; } if ( (Other != None) && ((Killer == None) || (Killer == Other)) ) { speed[vict] -= 0.1; // Slow down the suicider if (speed[vict] < MinSpeed) speed[vict] = MinSpeed; } Super.ScoreKill(Killer, Other); } | Nevett's Mutator Pack for Unreal Tournament (Demo?) | | dumbass4hire@hotmail.com | |-----------------------------------------------------| | Version 100 | |-----------------------------------------------------| This is a pack of mutators that contains these: Timebomb mutator, MakeACannon mutator, Realism mutator, Redeemer, Biorifle, and Enforcer arena, They're not too complicated, so do look at the source code. It's pretty well commented, so newbies will be allright. Timebomb ======== Everyone has a good old Redeemer strapped to them, and they can't do anything about it. Each bomb starts with a configurable time set on it, and the clock is ticking. The only way to extend your time is to make frags. Fast. You can configure the time people start with and the time people get for frags in the Advanced Options->Mutators->Timebomb menu. If you don't know, type 'preferences' in the console to open the Advanced Options dialog. MakeACannon =========== Teammates can't be in all places at once, right? If a place needs defending, set up an Autocannon there. How? Simply type 'Mutate MakeGun' into the beloved console and an auto minigun appears at your feet. The cost? Only 90 health. We don't wan't to make it tooo easy no do we? Realism ======= Think Counter-Strike. Now take out weapon buying, hostages, terrorists and anti-terrorists. What do you have left? Realistic damage! This is for anyone who has asked why they have shot Drimacus 3 times in the head and he is STILL standing. A shot or two in the head are almost gauranteed to floor an enemy. Plus, health = speed. People who have been shot twice in the legs can't sprint back to base, they can crawl back hoping that no-one notices them. Also, people shot in the stomach are likely to get wounded if they don't die, losing so much health per second. Oh, and everything I just mentioned is configurable in advanced options: Name ------------------ Default ----- Description ---------------- LegshotMultiplier 0.3 Default UT Damage * This = Damage when shot in leg HeadshotMultiplier 5.0 Default UT Damage * This = Damage when shot in head TorsoshotMultiplier 3.0 Ditto for when shot in torso (stomach, arms) LegSpeedLoss 0.3 When shot in leg, your speed multiplier loses this HeadSpeedLoss 0.1 Ditto for head TorsoSpeedLoss 0.1 Ditto for torso FallDamageMultiplier 2.0 Default UT Fall damage * this amount = falldamage WoundDamage 75 Above this health, you cannot get wounded DefaultSpeed 0.75 Peoples default speed. Times normal UT speed MaxSpeed 1.5 The fastest someone will get (medikits speed you up) MinSpeed 0.1 The slowest someone will get MediKitSpeed 0.2 Increase for SpeedMultiplier on grabbing a medikit NoPickups true Pickups replace with MediKits, including armour and the keg 'o' health. *defaults have probably changed by the time you are reading this, I've tried to get a good realism to fun ratio* Speed works like this: If DefaultSpeed is 0.4, people move at 3/10 the normal UT speed. If shot in the leg, that person now runs at 0.1 * UT speed (one tenth)because 0.2 is subtracted from their multiplier. If they get shot again, they won't get any slower because the MinSpeed is 0.1. It all looks complicated but it isnt really. Look at the code if you want to know how it works. Speed Freak =========== This works the same as Fatboy, except fatness is traded for pure speed. Minimum and maximum speeds are configurable, and are 0.1 and 3 by default. (1 being normal UT speed) Greets ====== Nimzicki, Richard, the beta tester Steven, for getting a shit computer after you said it would trounce mine Vincent, with the G400 Max, lucky twat Bane, for his kickass muator pack Copyright ========= This mod is copyright 1999 Chris Nevett Please do not try to make money with this, or distribute it under a different name, if you want to put this on a magazine, please do. Tell me though.System\Manifest.ini