[Setup] Product=NIUT124 Version=124 Archive=NIUT124.umod SrcPath=. MasterPath=.. Requires=UnrealTournament400Requirement Group=SetupGroup Group=NIUT124Group [UnrealTournament400Requirement] Product=UnrealTournament Version=400 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=432,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=428,Flags=3) [NIUT124Group] File=(Src=Help\niut.txt,Size=13313) File=(Src=System\niut124.u,Size=136310) File=(Src=System\Niut.int,Size=659) File=(Src=System\NIUT.ini,Size=3054) [Setup] LocalProduct=NIUT124 ReadMe=Help\niut.txt SetupWindowTitle=NIUT124 AutoplayWindowTitle=NIUT124 Options ProductURL=www.unrealplanet.com/niu VersionURL=www.unrealplanet.com/niu Developer=ArtfulDodger DeveloperURL=www.unrealplanet.com/niu [UnrealTournament400Requirement] LocalProduct=UnrealTournament ProductURL=www.epicgames.com VersionURL=www.epicgames.com Developer=Epic DeveloperURL=www.epicgames.com ------------------------------------------------------------------------------- NIUT 1.24 Mutator for UT (No Item Unreal Tournament) ------------------------------------------------------------------------------- Version: 1.24 Created: 03/07/00 Author: Mike Fox (a.k.a. ArtfulDodger) Contact: mfox@legendent.com URL: www.planetunreal.com/niu ------------------------------------------------------------------------------- Overview -------- Everyone plays with the same weapon(s) and has more or less the same items at all times. This makes the game play focus on combat skills, rather than item gathering and controlling. Most matchups are very even and the winner is be the one who makes the best use of the current weapon / items. If you are killed, it *won't* be because the other guy has a better weapon or the power armor etc. . Weapons can be cycled (default) or you can have everyone have all the specified weapons at all times so you can have a Redeemer + Sniper Rifle + Minigun game, for example. ------------------------------------------------------------------------------- Features -------- New UI for setting almost all NIUT options in-game. Everyone plays with the same weapon(s) at all times. Weapon changes every X seconds. Weapon is chosen from a configurable list of weapons and this *should* work with any Weapon-derived classes, even non-UT weapons (including the Unreal weapons, although this hasn't been tested yet). Weapons are selected randomly or sequentially. If weapons are selected randomly can optionally force all weapons to be used at least once before restarting the selection process. Plays a warning sound just before weapon is changed. To have some weapons used more frequently that others, just put these in ExtraWeaponClassStrings in niut.ini so they are specified more than once. Can optionally have the server increment everyone's health automatically. Can specify health that everyone starts out with (e.g. 5 or 1999) and maximum health that server will increment health to (health vials are still limited to 199). Can optionally have server give everyone jumpboots, invisibility and/or the damage amplifier at random times and for random durations. Can optionally use NIUT to give everyone all specified weapons (ammo increments automatically and pickups become health vials). Can optionally have server automatically increment ammo for current weapon (pickups become health vials). Replaces all pickup items in the level with ammo for the current weapon. If the current weapon doesn't require ammo, uses health vials. Flags, runes etc. and the translocator aren't affected. If weapons aren't being cycled or if ammo is being given out automatically, pickups are health vials. Can control rate at which ammo is given out and the amount of ammo that weapons start out with (e.g. 99 Redeemer warheads ). Should work with most other mutators, including the Fatboy mutator. Tested and should work with all UT gametypes (CTF, Domination, Assault, Last Man Standing). Tested and works with the UT bots. ------------------------------------------------------------------------------- Installation ------------ After installing NIUT, you should end up with the following files in your UT system folder: niut.ini NIUT configuration file niut.int mutator information niut.u NIUT mutator code and in your UT help folder: niut.txt this file Fire up UT and start a practice session or multiplayer game. Click on the mutators button and make sure the NIUT mutator is included (in the right-hand pane) along with any other mutators that you want to use. To configure NIUT, access the "NIUT123 Mutator Options" dialog through the "Mods" entry at the top of the main UT screen. NIUT should work with any of the game types available in the full version of Unreal Tournament, although it has a few problems with Last Man Standing as noted below. ------------------------------------------------------------------------------- Configuration ------------- All the main NIUT options can now be set through the in-game UI accessed through the NIUT123 Mutator Options dialog (under the "Mods" entry at the top of the main UT screen). Changes to these settings are saved to the file niut.ini and you can restore the defaults by clicking on the "Defaults" button. There are a couple of options (mainly sound related) which can be changed by modifying niut.ini directly. The NIUT options screen requires a 640x480 or greater resolution to be entirely visible. How do I specify the weapons to use? Just check off the weapons that you want to use on the right. Note that the Unreal I weapons only work in singleplayer -- they won't fire correctly in networked games. How do I make weapons cycle (switch periodically)? Make sure the "Cycle Weapons" checkbox is checked. When this is checked, the "Random Weapons" and "Use All Weapons" settings are used. If "Random Weapons" is set, the next weapon to use is chosen randomly, otherwise they are cycled in order. If "Use All Weapons" is set (and "Random Weapons is set), all weapons will be used at least once each time through the list of weapons. How do I control how often the weapons switch? Set the Min and Max "Time Between Weapons Switches Settings". These can be the same value, otherwise the server will constantly pick a random time between Min and Max. I recommend keeping the weapon switch time at 75.0 seconds or greater, and/or limiting how long a particular level is played to 30 mins or less. It seems that Unreal Tournament servers can become unstable (more likely to crash) if many objects are destroyed/created during a game. Since most of what NIUT does involves destroying and creating objects every time the weapon changes, following these guidelines may make NIUT servers less likely to crash. How can I cycle weapons but also have ammo increment automatically? Check "Cycle Weapons" and set "Time Between Ammo Increments" to 1.0 or so. How do I give everyone multiple weapons at all times? Make sure the "Cycle Weapons" checkbox is *not* checked. Everyone will have all the specified weapons at all times and ammo will increment automatically for all the weapons. All pickups will be health vials (depending on the game type). How do I control the ammo for weapons? You can specify the Initial, Max and Rate for the ammo for all types of weapons (the Enforcer and Minigun and most UT and Unreal I equivalents share the same settings). The Initial and Max amounts should be obvious. The Rate is the amount of ammo per second that is given to the weapon. A value of 10 means 10 units are given every second, a value of 0.05 means 1/20th of a unit per second (so you should get a unit every 20 seconds). Most of the default values are reasonable -- you should have lots of ammo as long as you don't shoot like a monkey. By default, when weapons aren't cycled, the server checks on whether to give everyone ammo every 1.0 seconds. You can change this through the "Time Between Ammo Increments" setting but 1.0 should be fine in most cases. The Redeemer shows up then goes away as soon as the game starts. What's up? By default the initial Redeemer ammo is set to 0. This is so players don't blow themselves up with it if they hit fire 2x after dying. Also in team games it can be annoying to take out the other team's base then have everyone respawn with (armed) Redeemers. If you are cycling weapons without automatic ammo, or if you really want people to be able to fire the Redeemer as soon as they spawn you probably want to change this to 1 or higher. What are the health options? By default, NIUT servers will give 5 units of health to all players every second (so your health will regenerate if you are injured). You can control the following: "Time Between Health Increments": change this to increase/decrease the rate at which the server gives out health. "Health Increment Amount": controls the amount of health that is given out each time. "Initial Health": the amount of health that players start out with when they spawn into the game. "Maximum Incremented Health": the maximum that the server will increment health to. These settings don't affect health pickups -- these will still increment the player's health to a max of 199. Games where players can have their health get up to 5000 or so with Super Shock Rifles and/or Redeemers are... different. A game with the initial and max health set to 5 can be fun too (hit = kill). What are power up options? If you want you can have the server give everyone one or more power ups (the damage amplifier, jumpboots and invisibility) periodically. Set the "Min Delay" to 0.0 if you don't want the power up to be used. Otherwise, set the Min and Max Delay (these can be the same value otherwise the server will constantly pick a random time between Min and Max) to the amount of time that you want the server to wait before giving out the power up. Similarly, the Min and Max Duration controls how long the power up stays active (when the time is up, the power up is removed from everyone). While any power up is active, everyone will have it, even if they die and respawn. Tip: the bots tend to see invisible players pretty well... What is the file sloop.bat available on the NIUT site? Its a fact of life that most game servers eventually crash. If you use NIUT with weapon cycling and a low time between weapon switches, the server will be more likely to crash (see How do I control how often the weapons switch? above). This "batch" file can be used to run the server so that if it does crash, the batch file will restart it automatically. If you run an NIUT (or any) UT server, you might want to check this out. What's with Last Man Standing games? The Last Man Standing game type doesn't seem to interact very well with some types of mutators, including NIUT. If weapons are being cycled, everything seems to work as expected: +if auto-incrementing ammo +pickups are health vials, ammo increments fine +otherwise pickups are ammo for the current weapon +only the current weapon is available If weapons are not being cycled: +all non-melee weapons are always available +NIUT can be used to add +Super Shock Rifle +Redeemer +Chainsaw, Impact Hammer +but other weapons can't be removed (and I pbly won't look at this) +no health in the level (can always auto-increment health if desired) +weapons occasionally get tossed by killed players Settings in niut.ini which can be modified directly (not on the options menu). WarningSound: controls the switch warning sound WarningSoundRepeats: controls number of times to play warning sound HealthIncrementSound: sound to play when incrementing health ------------------------------------------------------------------------------- History ------- 1.24: +Made NIUT work better with other mutators (no longer an Arena mutator). +Fix for conflict between Low Gravity and NIUT mutators (Low Gravity was forcing jumpboots to be stripped out even if NIUT was set up to use these). Solution: have AlwaysKeep() return true for jumpboots. +Fix for accessed None warnings in RateSelf (give ammo before putting into Pawn's inventory etc.). 1.23: +Added UI support for specifying NIUT settings through Mod menu. +Changed bAllWeapons to !bCycleWeapons (less confusing?) +WeaponClassStrings -> ExtraWeaponClassStrings (support for new weapons not already in UT -- otherwise weapons controlled by individual flags now). +Can specify max ammo that any weapon can carry (e.g. limit Redeemer to only carrying 1 warhead at a time). +Added MaxHealth option for auto-incremented health (199 with Redeemer is fun). 1.21: Better, more flexible way to specify how quickly ammo regenerates. Can also specify how much ammo weapons should start out with. 1.20: Option to have all specified weapons available at all times (ammo increments automatically for all weapons). This can be used to have Redeemer only or Sniper Rifle + Redeemer games for example. Additionally, weapons can be cycled as usual with an option to have ammo increment automatically ("classic" No Item mode like NIQ for Q2). Couple of optimizations. 1.10: Fix for translocator being stripped out of games where it is specified. 1.00: Initial version for full release of UT including support for random jumpboots, invisibility and power amplifiers (to all players at once). *E@(s%7ZNone NIUTMutator SetValueAddLabelControl RangeFloat AddCheckBoxAddFltEditControlRoundRangeIntAddIntEditControlMaybeAddWeaponMoreOrLessInt GiveAmmo AdjustAmmoNIUTCoreSetText ReplaceWith SetHelpTextCreateControl RegisterSystemSetFont AlwaysKeepSetInventoryGiveJumpBootsToGiveWeaponToFilterWeaponTouch EightballStingerASMDGiveInvisibilityToGiveDamageAmplifierTo RazorjackWeaponSetMaxLengthTransformPickupsResetUsedWeapons FlakCannonUWindowMinigunRifle GESBioRifleAutoMagUsedUpEngineAmmo RangeIntFlakBoxRemoveAllJumpBootsRemoveAllDamageAmplifiersRemoveAllInvisibilitySludge RazorAmmoIncrementAllAmmoAddInventory BecomeItem RifleRound ShellBox ShockRifle SniperRifleChooseWeaponripperRestoreDefaults StingerAmmoModifyPlayerCheckReplacement WarHeadAmmo HealthVial enforcerDispersionPistol ut_biorifleSetHelpSetNumericOnly RocketCan ASMDAmmoWeaponPowerUp minigun2 PulseGunWarheadLauncherUT_FlakCannonUT_EightballAddAmmoMyDefaultWeaponDeleteInventoryIdle2 WeaponSetSetSwitchPriorityFindInventoryTypeCloseDamageAmplifierDurationMinRateRifleAmmoPerSecRatePulseAmmoPerSecInitialStingerAmmoSpacingOffsetInitialOtherAmmoNIUTConfigMenuItemTickDummyArenaMutatorMaxStingerAmmoPAmmoMaxOtherAmmo MaxGunAmmo MaxBioAmmo ChainSawImpactHammerMaxRifleAmmoMaxShockAmmoMaxPulseAmmoMaxRocketAmmoMaxRedeemerAmmoSuperShockRifle MaxFlakAmmo flakammoRateStingerAmmoPerSecRateGunAmmoPerSecRateOtherAmmoPerSecMaxRipperAmmoRateShockAmmoPerSecRateFlakAmmoPerSecRateRocketAmmoPerSecRateRedeemerAmmoPerSecInitialGunAmmoCreatedNotifyPaintGetLookAndFeelTextureRateBioAmmoPerSecRateRipperAmmoPerSecBroadcastMessagePreBeginPlay ClientClass Miniammo BulletBoxInitialRifleAmmoInitialShockAmmoInitialPulseAmmoSetNumericFloatTournamentAmmoInitialRocketAmmoInitialRedeemerAmmoInitialFlakAmmoInitialBioAmmoDamageAmplifierDelayMaxDamageAmplifierDurationMaxInvisibilityDurationMaxInvisibilityDurationMinInitialRipperAmmo UMutatorTimeBetweenHealthIncrementsHealthIncrementAmountWarningSoundRepeatsTimeBetweenWeaponSwitchesMax WindowTitleTournamentWeaponbUseRedeemerut_jumpbootsbUseAllWeaponsbRandomWeaponsNIUTConfigMenuNIUTConfigDialog MenuCaptionWarningSound MenuHelp BladeHopperbioammo ShockCoreJumpBootsDurationMax RocketPackExecuteUMenuClipTimeBetweenWeaponSwitchesMin ResetOwnerBotpackJumpBootsDurationMin RifleAmmo PlayerPawn ItemNametInvisibilityVapour bCanThrow ScriptTextActorPickupsOther JumpBoots CloseButtonLevelOffset WinWidth WeaponClass StatusBar MenuItem DeltaTimeAlignEditBoxCanvasUDamageMinCreateWindowNumUWindowDialogControlUWindowCheckboxP Inventory NewWeaponPickup bByParentGetSoundDurationUMenuRootWindowValRoot Ammocount UTSuperHeal LabelText WinHeightNamePropertyUMenuStatusBarDefaultsButtonAmountMaxAmmoUMenuModMenuItemEditBoxWidthbCycleWeaponsbUseChainSawbUseEnforcerbUseImpactHammer bUseMiniGunbUsePulseGun bUseRipperbUseShockRiflebUseSniperRiflebUseSuperShockRiflebUseBioRiflebUseRocketLauncherbUseFlakCannon HelpTextbUseUnrealIFlakCannonbUseUnrealIGESBioRiflebUseUnrealIMinigunObjectPropertyFloatPropertybUseUnrealIASMDi StrPropertybUseUnrealIEightballbUseUnrealIStingerExtraWeaponClassStringsUWindowLabelControlUWindowPulldownMenuTimeBetweenAmmoIncrementsUWindowWindowHealthIncrementSoundUWindowRootWindow StartHealth MaxHealthUWindowClientWindowInvisibilityDelayMinInvisibilityDelayMaxUWindowDialogClientWindowUWindowFramedWindowDamageAmplifierDelayMin LevelInfoYUWindowPulldownMenuItemJumpBootsDelayMinJumpBootsDelayMaxUWindowSmallButtonUWindowSmallCloseButton GameInfoUWindowEditControlUWindowEditBoxMutator NumPlayersGameClassProperty RandRange Instigator AmmoNameMax nextPawnOwnerbSuperRelevant TimeSecondsActivateSound bCheckedDynamicLoadObjectStaticSaveConfig NextMutatorNetMode PawnListInvValue ReturnValueWidthChargeHealthSizeYSizeXUT_invisibilityArenaPawn NumWeaponsFilteredWeaponClassStringsCurrentWeaponClassCurrentWeaponIndexNumUsedWeapons UsedWeapons NumWarningsNextChooseWeaponTimeChooseWeaponWarningTimeNextIncrementHealthTimeNextInvisibilityTimeNextKillInvisibilityTimeNextDamageAmplifierTimeNextKillDamageAmplifierTimeNextJumpBootsTimeNextKillJumpBootsTimeNextAmmoIncrementTimeCountRedeemerAmmoCountRocketAmmoCountFlakAmmoCountShockAmmoCountRifleAmmoCountPulseAmmoCountRipperAmmoCountBioAmmoCountGunAmmoCountStingerAmmoCountOtherAmmo bDidTickbForceWeaponSpawn LOTSATIME AmmoAmountbUseWeaponClassStringPPSoundTextureWClassPackageConst WeaponIndexExpireMessage TextBufferAInv DrawTypeObjectX FunctionDamageAmplifierCNameEbRetValAmmoTableHOffsetAmmoTableSizeEditControlVerticalSpacingPowerUpsTableOffsetPowerUpsTableSizeTablesVOffsetCycleWeaponsCheckBoxRandomWeaponsCheckBoxUseAllWeaponsCheckBoxTimeBetweenWeaponSwitchesMinLCTimeBetweenWeaponSwitchesMaxLCTimeBetweenAmmoIncrementsLCTimeBetweenHealthIncrementsLCHealthIncrementAmountLCStartHealthLC MaxHealthLCTimeBetweenAmmoIncrementsECTimeBetweenWeaponSwitchesMinECTimeBetweenWeaponSwitchesMaxECTimeBetweenHealthIncrementsECHealthIncrementAmountECStartHealthEC MaxHealthECUseBioRifleCheckBoxUseChainSawCheckBoxUseEnforcerCheckBoxUseFlakCannonCheckBoxUseImpactHammerCheckBoxUseMiniGunCheckBoxUsePulseGunCheckBoxUseRipperCheckBoxUseRocketLauncherCheckBoxUseRedeemerCheckBoxUseShockRifleCheckBoxUseSniperRifleCheckBoxUseSuperShockRifleCheckBoxUseUnrealIASMDCheckBoxUseUnrealIAutoMagCheckBox#UseUnrealIDispersionPistolCheckBoxUseUnrealIFlakCannonCheckBoxUseUnrealIEightballCheckBoxUseUnrealIGESBioRifleCheckBoxUseUnrealIMinigunCheckBoxUseUnrealIRazorjackCheckBoxUseUnrealIRifleCheckBoxUseUnrealIStingerCheckBoxInitialAmmoLC MaxAmmoLC RateAmmoLC BioAmmoLC GunAmmoLC FlakAmmoLC PulseAmmoLCRedeemerAmmoLC RifleAmmoLCRipperAmmoLCRocketAmmoLC ShockAmmoLCStingerAmmoLCInitialBioAmmoECRateBioAmmoPerSecECMaxBioAmmoECInitialGunAmmoECRateGunAmmoPerSecECMaxGunAmmoECInitialFlakAmmoECRateFlakAmmoPerSecECMaxFlakAmmoECInitialPulseAmmoECRatePulseAmmoPerSecECMaxPulseAmmoECInitialRedeemerAmmoECRateRedeemerAmmoPerSecECMaxRedeemerAmmoECInitialRifleAmmoECRateRifleAmmoPerSecECMaxRifleAmmoECInitialRipperAmmoECRateRipperAmmoPerSecECMaxRipperAmmoECInitialRocketAmmoECRateRocketAmmoPerSecECMaxRocketAmmoECInitialShockAmmoECRateShockAmmoPerSecECMaxShockAmmoECInitialStingerAmmoECRateStingerAmmoPerSecECMaxStingerAmmoECPowerUpDelayMinLCPowerUpDelayMaxLCPowerUpDurationMinLCPowerUpDurationMaxLCDamageAmplifierLC JumpbootsLCInvisibilityLCInvisibilityDelayMinECInvisibilityDelayMaxECInvisibilityDurationMinECInvisibilityDurationMaxECDamageAmplifierDelayMinECDamageAmplifierDelayMaxECDamageAmplifierDurationMinECDamageAmplifierDurationMaxECJumpBootsDelayMinECJumpBootsDelayMaxECJumpBootsDurationMinECJumpBootsDurationMaxEC AmmoTypeDeActivateSoundHOffsetVOffsetBoolProperty HorzOffsetHorzInc VertOffsetVertIncCB IntPropertyLC UnrealShareECMaxLenBytePropertybUseUnrealIAutoMagbUseUnrealIDispersionPistolbUseUnrealIRazorjackbUseUnrealIRifleWdV̀l===========================ll9 }ɫɫɫ=ɫɫɫɫɫ8 8 8 =8 8 8 8 8 8 8 q;q;q;=q;q;q;q;R9 }9 }j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@9 }ѸBѸBѸBѸBѸB9 }j@j@9 }j@j@ttttttttttttttttttttttttti tttttttttttttttttttttt9 }tttt9 }tttѸBtѸBtѸBtt9 }ttѸBtѸBtѸBtѸBtѸBtѸBtѸBtѸBRRùRj@j@j@j@j@ttѸBj@j@j@j@tѸBtj@j@j@j@ѸBRRRRRR9 }9 }9 }RR9 }9 }RRR9 }9 }9 }9 }9 }9 }9 }RRR9 }R9 }q;9 }RRRRRR9 }R9 }8 9 }RRRRRR9 }R9 }ɫ9 }RRRRRR9 }9 }-^][l$BX$BbW"V"U$?R$AQ$AO$pCZ$AP$Ao$pAg$pAL"2K" M" G" F" H"2S"N"2z"d]"2_"2y$?x$>w$L>v$+?[$?\$@@$?$>s$@r$@t$@n"2m"0p"2k"2j"2l"u"Kg"df"c"e" V*_BB@lhPdb8H@@uxq0t9F @@?@@@G@G@%@bdb.(W@ -3>l2=1<;x@{@&@D@wt@ @E@~@Q@N@S@PQ@R@U@Y@U@^@Z@T@OV@T@\@]@T@W@S@a@b@S@X[@L@e@f@i@g@n@m7P@y@O@o@p@q@:r@u@v@w@|@"@z@@#@}@I@s@cj@cg@@@$@HK@DM@Y@_@!@k@t/@N@R@U@`@d@C@qF@EZJK^J`B\hcHgiakjmlneQprsqyuVgvdz|}~{AZCVDGK[LfRPN\oWUSOI][X@TI`a^_YrAonturW^xpsZA@GFwxyz}~@ABCDEvMH|{CL_2K%jM'C{Y]^\NIUT124 Mutator Options (see www.planetunreal.com/niu and/or niut.txt for more information)64+E@V@M@bi}X\s_@`@e@c@ehijklmxah@p@jsfv@w@z]A~`c{N~imim{O)imim{O|.Xڇ|.Xڇ|.Xڄttttttttttttttttttttttttttttttttttttt|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڄtttttttttttt̀|.Xڅ̀|.Xڅ̀|.Xڅ̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀|.Xڅ̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀tU K/̀7Xö7XÅ̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀̀ttttttttU K/tttttttttttU K/ttt|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.Xڇ|.X'T^"YN z a/!Q a/!P a/!E a/!M a/!N a/!> a/!; a/!< a/!o a/!G a/!O a/!i a/!h a/!& a/!* a/!( a/!! a/!) a/! a/!+ a/!F a/! a/!''%v', l{'!b'! lwb* a/b''( ZC`2 ~ ͷ;aGնmo ;aGնmo ;aGնmo j'a]NIUT124 Mutator Optionsc]('Configure the NIUT124 Mutator options.K,3/a0 ,|lw,* %w.,*,a  A,,10 z//============================================================================ // NIUTConfigDialog. //============================================================================= class NIUTConfigDialog expands UWindowDialogClientWindow; var UWindowSmallCloseButton CloseButton; var UWindowSmallButton DefaultsButton; const AmmoTableHOffset = 120; const AmmoTableSize = 48; const EditControlVerticalSpacing = 18; const PowerUpsTableOffset = 120; const PowerUpsTableSize = 80; const TablesVOffset = 8; // NIUT main options var UWindowCheckBox CycleWeaponsCheckBox, RandomWeaponsCheckBox, UseAllWeaponsCheckBox; var UWindowLabelControl TimeBetweenWeaponSwitchesMinLC, TimeBetweenWeaponSwitchesMaxLC, TimeBetweenAmmoIncrementsLC, TimeBetweenHealthIncrementsLC, HealthIncrementAmountLC, StartHealthLC, MaxHealthLC; var UWindowEditControl TimeBetweenAmmoIncrementsEC, TimeBetweenWeaponSwitchesMinEC, TimeBetweenWeaponSwitchesMaxEC, TimeBetweenHealthIncrementsEC, HealthIncrementAmountEC, StartHealthEC, MaxHealthEC; // weapons var UWindowCheckBox UseBioRifleCheckBox, UseChainSawCheckBox, UseEnforcerCheckBox, UseFlakCannonCheckBox, UseImpactHammerCheckBox, UseMiniGunCheckBox, UsePulseGunCheckBox, UseRipperCheckBox, UseRocketLauncherCheckBox, UseRedeemerCheckBox, UseShockRifleCheckBox, UseSniperRifleCheckBox, UseSuperShockRifleCheckBox, UseUnrealIASMDCheckBox, UseUnrealIAutoMagCheckBox, UseUnrealIDispersionPistolCheckBox, UseUnrealIFlakCannonCheckBox, UseUnrealIEightballCheckBox, UseUnrealIGESBioRifleCheckBox, UseUnrealIMinigunCheckBox, UseUnrealIRazorjackCheckBox, UseUnrealIRifleCheckBox, UseUnrealIStingerCheckBox; // ammo labels var UWindowLabelControl InitialAmmoLC, MaxAmmoLC, RateAmmoLC, BioAmmoLC, GunAmmoLC, FlakAmmoLC, PulseAmmoLC, RedeemerAmmoLC, RifleAmmoLC, RipperAmmoLC, RocketAmmoLC, ShockAmmoLC, StingerAmmoLC; // ammo edits - disabled if cycling weapons and not incrementing ammo var UWindowEditControl InitialBioAmmoEC, RateBioAmmoPerSecEC, MaxBioAmmoEC, InitialGunAmmoEC, RateGunAmmoPerSecEC, MaxGunAmmoEC, InitialFlakAmmoEC, RateFlakAmmoPerSecEC, MaxFlakAmmoEC, InitialPulseAmmoEC, RatePulseAmmoPerSecEC, MaxPulseAmmoEC, InitialRedeemerAmmoEC, RateRedeemerAmmoPerSecEC, MaxRedeemerAmmoEC, InitialRifleAmmoEC, RateRifleAmmoPerSecEC, MaxRifleAmmoEC, InitialRipperAmmoEC, RateRipperAmmoPerSecEC, MaxRipperAmmoEC, InitialRocketAmmoEC, RateRocketAmmoPerSecEC, MaxRocketAmmoEC, InitialShockAmmoEC, RateShockAmmoPerSecEC, MaxShockAmmoEC, InitialStingerAmmoEC, RateStingerAmmoPerSecEC, MaxStingerAmmoEC; // power ups var UWindowLabelControl PowerUpDelayMinLC, PowerUpDelayMaxLC, PowerUpDurationMinLC, PowerUpDurationMaxLC, DamageAmplifierLC, JumpbootsLC, InvisibilityLC; var UWindowEditControl InvisibilityDelayMinEC, InvisibilityDelayMaxEC, InvisibilityDurationMinEC, InvisibilityDurationMaxEC, DamageAmplifierDelayMinEC, DamageAmplifierDelayMaxEC, DamageAmplifierDurationMinEC, DamageAmplifierDurationMaxEC, JumpBootsDelayMinEC, JumpBootsDelayMaxEC, JumpBootsDurationMinEC, JumpBootsDurationMaxEC; var class UMutator; // used to vertically position the components var int SpacingOffset; var int HOffset, VOffset; //----------------------------------------------------------------------------- function AddCheckBox( out int HorzOffset, int HorzInc, out int VertOffset, int VertInc, out UWindowCheckBox CB, string LabelText, string HelpText, bool bChecked ) { CB = UWindowCheckBox( CreateControl(class'UWindowCheckBox', HorzOffset, VertOffset, (WinWidth/4)-16, 16) ); CB.SetText( LabelText ); CB.SetHelpText( HelpText ); CB.SetFont(F_Normal); CB.bChecked = bChecked; CB.Align = TA_Left; CB.Register(self); HorzOffset += HorzInc; VertOffset += VertInc; } //----------------------------------------------------------------------------- function AddLabelControl( out int HorzOffset, int HorzInc, out int VertOffset, int VertInc, int Width, out UWindowLabelControl LC, string LabelText, string HelpText ) { LC = UWindowLabelControl( CreateControl(class'UWindowLabelControl', HorzOffset, VertOffset, Width, 16) ); LC.SetText( LabelText ); LC.SetHelpText( HelpText ); LC.SetFont(F_Normal); LC.Align = TA_Left; LC.Register(self); HorzOffset += HorzInc; VertOffset += VertInc; } //----------------------------------------------------------------------------- function AddIntEditControl( out int HorzOffset, int HorzInc, out int VertOffset, int VertInc, int Width, out UWindowEditControl EC, string LabelText, string HelpText, int Val, optional int MaxLen ) { EC = UWindowEditControl(CreateControl(class'UWindowEditControl', HorzOffset, VertOffset, Width, 16)); EC.SetText( LabelText ); EC.SetHelpText( HelpText ); EC.SetFont(F_Normal); EC.SetNumericOnly(True); if( MaxLen != 0 ) EC.SetMaxLength( MaxLen ); else EC.SetMaxLength(3); EC.Align = TA_Right; EC.EditBox.Offset = 0; EC.EditBoxWidth = WinWidth/22; EC.SetValue(string(Val)); EC.Register(self); HorzOffset += HorzInc; VertOffset += VertInc; } //----------------------------------------------------------------------------- function AddFltEditControl( out int HorzOffset, int HorzInc, out int VertOffset, int VertInc, int Width, out UWindowEditControl EC, string LabelText, string HelpText, float Val ) { EC = UWindowEditControl(CreateControl(class'UWindowEditControl', HorzOffset, VertOffset, Width, 16)); EC.SetText( LabelText ); EC.SetHelpText( HelpText ); EC.SetFont(F_Normal); EC.SetNumericOnly(True); EC.SetNumericFloat(True); EC.SetMaxLength(8); EC.Align = TA_Right; EC.EditBox.Offset = 0; EC.EditBoxWidth = WinWidth/11; EC.SetValue(string(Val)); EC.Register(self); HorzOffset += HorzInc; VertOffset += VertInc; } //----------------------------------------------------------------------------- function Created() { local int Offset; Super.Created(); // close button CloseButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', WinWidth-48, WinHeight-19, 48, 16)); // defaults button DefaultsButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth-96-8, WinHeight-19, 48, 16)); DefaultsButton.SetText( "Defaults" ); DefaultsButton.SetHelpText( "Restore default settings." ); // main options HOffset = 8; VOffset = 8; AddCheckBox( HOffset, 0, VOffset, SpacingOffset, CycleWeaponsCheckBox, "Cycle Weapons:", "If checked, specified weapons are cycled, otherwise everyone has all specified weapons at all times (and ammo is given out automatically).", UMutator.default.bCycleWeapons ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, RandomWeaponsCheckBox, "Random Weapons:", "If checked and cycling weapons, weapons are selected randomly, otherwise weapons are selected in order.", UMutator.default.bRandomWeapons ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseAllWeaponsCheckBox, "Use All Weapons:", "If checked and cycling weapons randomly, each weapon will be used once each time through the list.", UMutator.default.bUseAllWeapons ); HOffset = 168; VOffset = 8; AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, TimeBetweenWeaponSwitchesMinLC, "Min Time Between Weapon Switches:", "Minimum time (seconds) server waits between weapon switches (when cycling weapons)." ); AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, TimeBetweenWeaponSwitchesMaxLC, "Max Time Between Weapon Switches:", "Maximum time (seconds) server waits between weapon switches (when cycling weapons)." ); AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, TimeBetweenAmmoIncrementsLC, "Time Between Ammo Increments:", "Time (seconds) between ammo increments. Use 0.0 to disable (pickups become ammo). If set to 0.0 and weapons not cycled will default to 1.0." ); AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, TimeBetweenHealthIncrementsLC, "Time Between Health Increments:", "Time (seconds) server waits between health increments." ); AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, HealthIncrementAmountLC, "Health Increment Amount:", "Amount of health server will give to everyone when it is time to give out health." ); AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, StartHealthLC, "Initial Health:", "Health that everyone starts out with (if 0, uses default for pawns)." ); AddLabelControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/3, MaxHealthLC, "Maximum Incremented Health:", "Maximum that health can be incremented to by server (if 0, uses default for pawns). Health vials still increment to 199." ); HOffset = 360; VOffset = 8; AddFltEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/11, TimeBetweenWeaponSwitchesMinEC, "", "Minimum time (seconds) server waits between weapon switches (when cycling weapons).", UMutator.default.TimeBetweenWeaponSwitchesMin ); AddFltEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/11, TimeBetweenWeaponSwitchesMaxEC, "", "Maximum time (seconds) server waits between weapon switches (when cycling weapons).", UMutator.default.TimeBetweenWeaponSwitchesMax ); AddFltEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/11, TimeBetweenAmmoIncrementsEC, "", "Time (seconds) server waits between giving out ammo to everyone (if 0.0, pickups become ammo for the current weapon).", UMutator.default.TimeBetweenAmmoIncrements ); AddFltEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/11, TimeBetweenHealthIncrementsEC, "", "Time (seconds) server waits between giving out health to everyone.", UMutator.default.TimeBetweenHealthIncrements ); AddIntEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/22, HealthIncrementAmountEC, "", "Amount of health server will give to everyone when it is time to give out health.", UMutator.default.HealthIncrementAmount ); AddIntEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/22, StartHealthEC, "", "Health that everyone starts out with (if 0, uses default for pawns).", UMutator.default.StartHealth, 4 ); AddIntEditControl( HOffset, 0, VOffset, EditControlVerticalSpacing, WinWidth/22, MaxHealthEC, "", "Maximum that health can be incremented to by server (if 0, uses default for pawns). Health vials still increment to 199.", UMutator.default.MaxHealth, 4 ); // ammo HOffset = 8 + AmmoTableHOffset; VOffset += TablesVOffset; AddLabelControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/20, InitialAmmoLC, "Initial", "Amount of ammo that the weapon starts out with." ); AddLabelControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/20, MaxAmmoLC, "Max", "Maximum amount of ammo for the weapon (0 = default)." ); AddLabelControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/20, RateAmmoLC, "Rate", "Rate (amount per second) at which the weapon's ammo increments (if not cycling weapons or if AmmoIncrementRate is set)." ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, BioAmmoLC, "Bio Rifle Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialBioAmmoEC, "", "", UMutator.default.InitialBioAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxBioAmmoEC, "", "", UMutator.default.MaxBioAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateBioAmmoPerSecEC, "", "", UMutator.default.RateBioAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, GunAmmoLC, "Gun Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialGunAmmoEC, "", "", UMutator.default.InitialGunAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxGunAmmoEC, "", "", UMutator.default.MaxGunAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateGunAmmoPerSecEC, "", "", UMutator.default.RateGunAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, FlakAmmoLC, "Flak Cannon Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialFlakAmmoEC, "", "", UMutator.default.InitialFlakAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxFlakAmmoEC, "", "", UMutator.default.MaxFlakAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateFlakAmmoPerSecEC, "", "", UMutator.default.RateFlakAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, PulseAmmoLC, "Pulse Gun Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialPulseAmmoEC, "", "", UMutator.default.InitialPulseAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxPulseAmmoEC, "", "", UMutator.default.MaxPulseAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RatePulseAmmoPerSecEC, "", "", UMutator.default.RatePulseAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, RedeemerAmmoLC, "Redeemer Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialRedeemerAmmoEC, "", "", UMutator.default.InitialRedeemerAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxRedeemerAmmoEC, "", "", UMutator.default.MaxRedeemerAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateRedeemerAmmoPerSecEC, "", "", UMutator.default.RateRedeemerAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, RifleAmmoLC, "Rifle Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialRifleAmmoEC, "", "", UMutator.default.InitialRifleAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxRifleAmmoEC, "", "", UMutator.default.MaxRifleAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateRifleAmmoPerSecEC, "", "", UMutator.default.RateRifleAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, RipperAmmoLC, "Ripper Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialRipperAmmoEC, "", "", UMutator.default.InitialRipperAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxRipperAmmoEC, "", "", UMutator.default.MaxRipperAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateRipperAmmoPerSecEC, "", "", UMutator.default.RateRipperAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, RocketAmmoLC, "Rocket Launcher Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialRocketAmmoEC, "", "", UMutator.default.InitialRocketAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxRocketAmmoEC, "", "", UMutator.default.MaxRocketAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateRocketAmmoPerSecEC, "", "", UMutator.default.RateRocketAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, ShockAmmoLC, "Shock Rifle Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialShockAmmoEC, "", "", UMutator.default.InitialShockAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxShockAmmoEC, "", "", UMutator.default.MaxShockAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateShockAmmoPerSecEC, "", "", UMutator.default.RateShockAmmoPerSec ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, AmmoTableHOffset, VOffset, 0, WinWidth/5, StingerAmmoLC, "Stinger Ammo:", "" ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, InitialStingerAmmoEC, "", "", UMutator.default.InitialStingerAmmo ); AddIntEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/22, MaxStingerAmmoEC, "", "", UMutator.default.MaxStingerAmmo ); AddFltEditControl( HOffset, AmmoTableSize, VOffset, 0, WinWidth/11, RateStingerAmmoPerSecEC, "", "", UMutator.default.RateStingerAmmoPerSec ); // power-ups HOffset = 8 + PowerUpsTableOffset; VOffset += TablesVOffset; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/10, PowerUpDelayMinLC, "Min Delay", "Min time (seconds) before power up is given to everyone (0.0 disables power up)." ); AddLabelControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/10, PowerUpDelayMaxLC, "Max Delay", "Max time (seconds) before power up is given to everyone (if enabled)." ); AddLabelControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/10, PowerUpDurationMinLC, "Min Duration", "Min duration (seconds) of power up (if enabled)." ); AddLabelControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/10, PowerUpDurationMaxLC, "Max Duration", "Max duration (seconds) of power up (if enabled)." ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, PowerUpsTableOffset, VOffset, 0, WinWidth/5, DamageAmplifierLC, "Damage Amplifier:", "" ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, DamageAmplifierDelayMinEC, "", "", UMutator.default.DamageAmplifierDelayMin ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, DamageAmplifierDelayMaxEC, "", "", UMutator.default.DamageAmplifierDelayMax ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, DamageAmplifierDurationMinEC, "", "", UMutator.default.DamageAmplifierDurationMin ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, DamageAmplifierDurationMaxEC, "", "", UMutator.default.DamageAmplifierDurationMax ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, PowerUpsTableOffset, VOffset, 0, WinWidth/5, JumpBootsLC, "JumpBoots:", "" ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, JumpBootsDelayMinEC, "", "", UMutator.default.JumpBootsDelayMin ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, JumpBootsDelayMaxEC, "", "", UMutator.default.JumpBootsDelayMax ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, JumpBootsDurationMinEC, "", "", UMutator.default.JumpBootsDurationMin ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, JumpBootsDurationMaxEC, "", "", UMutator.default.JumpBootsDurationMax ); HOffset = 8; VOffset += EditControlVerticalSpacing; AddLabelControl( HOffset, PowerUpsTableOffset, VOffset, 0, WinWidth/5, InvisibilityLC, "Invisibility:", "" ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, InvisibilityDelayMinEC, "", "", UMutator.default.InvisibilityDelayMin ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, InvisibilityDelayMaxEC, "", "", UMutator.default.InvisibilityDelayMax ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, InvisibilityDurationMinEC, "", "", UMutator.default.InvisibilityDurationMin ); AddFltEditControl( HOffset, PowerUpsTableSize, VOffset, 0, WinWidth/11, InvisibilityDurationMaxEC, "", "", UMutator.default.InvisibilityDurationMax ); // weapons HOffset = (3*WinWidth/4) + 8; VOffset = 8; AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseBioRifleCheckBox, "Bio Rifle", "If checked Bio Rifle will be used.", UMutator.default.bUseBioRifle ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseChainSawCheckBox, "Chainsaw", "If checked Chainsaw will be used.", UMutator.default.bUseChainSaw ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseEnforcerCheckBox, "Enforcer", "If checked Enforcer will be used.", UMutator.default.bUseEnforcer ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseFlakCannonCheckBox, "Flak Cannon", "If checked Flak Cannon will be used.", UMutator.default.bUseFlakCannon ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseImpactHammerCheckBox, "Impact Hammer", "If checked Impact Hammer will be used.", UMutator.default.bUseImpactHammer ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseMiniGunCheckBox, "Minigun", "If checked Minigun will be used.", UMutator.default.bUseMiniGun ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UsePulseGunCheckBox, "Pulse Gun", "If checked Pulse Gun will be used.", UMutator.default.bUsePulseGun ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseRedeemerCheckBox, "Redeemer", "If checked Redeemer will be used.", UMutator.default.bUseRedeemer ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseRipperCheckBox, "Ripper", "If checked Ripper will be used.", UMutator.default.bUseRipper ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseRocketLauncherCheckBox, "Rocket Launcher", "If checked Rocket Launcher will be used.", UMutator.default.bUseRocketLauncher ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseShockRifleCheckBox, "Shock Rifle", "If checked Shock Rifle will be used.", UMutator.default.bUseShockRifle ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseSniperRifleCheckBox, "Sniper Rifle", "If checked Sniper Rifle will be used.", UMutator.default.bUseSniperRifle ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseSuperShockRifleCheckBox, "Super Shock Rifle", "If checked Super Shock Rifle will be used.", UMutator.default.bUseSuperShockRifle ); VOffset += SpacingOffset; AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIASMDCheckBox, "UnrealI ASMD*", "If checked UnrealI ASMD will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIASMD ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIAutoMagCheckBox, "UnrealI Auto Mag*", "If checked UnrealI Auto Mag will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIAutoMag ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIDispersionPistolCheckBox,"UnrealI Dispersion Pistol*", "If checked UnrealI Dispersion Pistol will be used (*only works in singleplayer games).",UMutator.default.bUseUnrealIDispersionPistol ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIEightballCheckBox, "UnrealI Eightball*", "If checked UnrealI Eightball will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIEightball ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIFlakCannonCheckBox, "UnrealI Flak Cannon*", "If checked UnrealI Flak Cannon will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIFlakCannon ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIGESBioRifleCheckBox, "UnrealI GES Bio Rifle*", "If checked UnrealI GES Bio Rifle will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIGESBioRifle ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIMinigunCheckBox, "UnrealI Minigun*", "If checked UnrealI Minigun will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIMinigun ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIRazorjackCheckBox, "UnrealI Razorjack*", "If checked UnrealI Razorjack be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIRazorjack ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIRifleCheckBox, "UnrealI Rifle*", "If checked UnrealI Rifle will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIRifle ); AddCheckBox( HOffset, 0, VOffset, SpacingOffset, UseUnrealIStingerCheckBox, "UnrealI Stinger*", "If checked UnrealI Stinger will be used (*only works in singleplayer games).", UMutator.default.bUseUnrealIStinger ); } //----------------------------------------------------------------------------- function Paint(Canvas C, float X, float Y) { local Texture T; Super.Paint(C, X, Y); T = GetLookAndFeelTexture(); } //----------------------------------------------------------------------------- function Close(optional bool bByParent) { // save NIUTMutator config UMutator.default.bCycleWeapons = CycleWeaponsCheckBox.bChecked; UMutator.default.bRandomWeapons = RandomWeaponsCheckBox.bChecked; UMutator.default.bUseAllWeapons = UseAllWeaponsCheckBox.bChecked; UMutator.default.TimeBetweenWeaponSwitchesMin = RangeFloat( float(TimeBetweenWeaponSwitchesMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.TimeBetweenWeaponSwitchesMax = RangeFloat( float(TimeBetweenWeaponSwitchesMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.TimeBetweenAmmoIncrements = RangeFloat( float(TimeBetweenAmmoIncrementsEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.TimeBetweenHealthIncrements = RangeFloat( float(TimeBetweenHealthIncrementsEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.HealthIncrementAmount = RoundRangeInt( float(HealthIncrementAmountEC.EditBox.Value), 0, 999 ); UMutator.default.StartHealth = RoundRangeInt( float(StartHealthEC.EditBox.Value), 0, 9999 ); UMutator.default.MaxHealth = RoundRangeInt( float(MaxHealthEC.EditBox.Value), 0, 9999 ); UMutator.default.InitialBioAmmo = RoundRangeInt( float(InitialBioAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxBioAmmo = RoundRangeInt( float(MaxBioAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateBioAmmoPerSec = RangeFloat( float(RateBioAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialGunAmmo = RoundRangeInt( float(InitialGunAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxGunAmmo = RoundRangeInt( float(MaxGunAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateGunAmmoPerSec = RangeFloat( float(RateGunAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialFlakAmmo = RoundRangeInt( float(InitialFlakAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxFlakAmmo = RoundRangeInt( float(MaxFlakAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateFlakAmmoPerSec = RangeFloat( float(RateFlakAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialPulseAmmo = RoundRangeInt( float(InitialPulseAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxPulseAmmo = RoundRangeInt( float(MaxPulseAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RatePulseAmmoPerSec = RangeFloat( float(RatePulseAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialRedeemerAmmo = RoundRangeInt( float(InitialRedeemerAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxRedeemerAmmo = RoundRangeInt( float(MaxRedeemerAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateRedeemerAmmoPerSec = RangeFloat( float(RateRedeemerAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialRifleAmmo = RoundRangeInt( float(InitialRifleAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxRifleAmmo = RoundRangeInt( float(MaxRifleAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateRifleAmmoPerSec = RangeFloat( float(RateRifleAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialRipperAmmo = RoundRangeInt( float(InitialRipperAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxRipperAmmo = RoundRangeInt( float(MaxRipperAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateRipperAmmoPerSec = RangeFloat( float(RateRipperAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialRocketAmmo = RoundRangeInt( float(InitialRocketAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxRocketAmmo = RoundRangeInt( float(MaxRocketAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateRocketAmmoPerSec = RangeFloat( float(RateRocketAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialShockAmmo = RoundRangeInt( float(InitialShockAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxShockAmmo = RoundRangeInt( float(MaxShockAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateShockAmmoPerSec = RangeFloat( float(RateShockAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.InitialStingerAmmo = RoundRangeInt( float(InitialStingerAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.MaxStingerAmmo = RoundRangeInt( float(MaxStingerAmmoEC.EditBox.Value), 0, 999 ); UMutator.default.RateStingerAmmoPerSec = RangeFloat( float(RateStingerAmmoPerSecEC.EditBox.Value), 0.0, 100.0 ); UMutator.default.bUseBioRifle = UseBioRifleCheckBox.bChecked; UMutator.default.bUseChainSaw = UseChainSawCheckBox.bChecked; UMutator.default.bUseEnforcer = UseEnforcerCheckBox.bChecked; UMutator.default.bUseFlakCannon = UseFlakCannonCheckBox.bChecked; UMutator.default.bUseImpactHammer = UseImpactHammerCheckBox.bChecked; UMutator.default.bUseMiniGun = UseMiniGunCheckBox.bChecked; UMutator.default.bUsePulseGun = UsePulseGunCheckBox.bChecked; UMutator.default.bUseRedeemer = UseRedeemerCheckBox.bChecked; UMutator.default.bUseRipper = UseRipperCheckBox.bChecked; UMutator.default.bUseRocketLauncher = UseRocketLauncherCheckBox.bChecked; UMutator.default.bUseShockRifle = UseShockRifleCheckBox.bChecked; UMutator.default.bUseSniperRifle = UseSniperRifleCheckBox.bChecked; UMutator.default.bUseSuperShockRifle = UseSuperShockRifleCheckBox.bChecked; UMutator.default.bUseUnrealIASMD = UseUnrealIASMDCheckBox.bChecked; UMutator.default.bUseUnrealIAutoMag = UseUnrealIAutoMagCheckBox.bChecked; UMutator.default.bUseUnrealIDispersionPistol = UseUnrealIDispersionPistolCheckBox.bChecked; UMutator.default.bUseUnrealIEightball = UseUnrealIEightballCheckBox.bChecked; UMutator.default.bUseUnrealIFlakCannon = UseUnrealIFlakCannonCheckBox.bChecked; UMutator.default.bUseUnrealIGESBioRifle = UseUnrealIGESBioRifleCheckBox.bChecked; UMutator.default.bUseUnrealIMinigun = UseUnrealIMinigunCheckBox.bChecked; UMutator.default.bUseUnrealIRazorjack = UseUnrealIRazorjackCheckBox.bChecked; UMutator.default.bUseUnrealIRifle = UseUnrealIRifleCheckBox.bChecked; UMutator.default.bUseUnrealIStinger = UseUnrealIStingerCheckBox.bChecked; UMutator.default.DamageAmplifierDelayMin = RangeFloat(float(DamageAmplifierDelayMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.DamageAmplifierDelayMax = RangeFloat(float(DamageAmplifierDelayMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.DamageAmplifierDurationMin = RangeFloat(float(DamageAmplifierDurationMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.DamageAmplifierDurationMax = RangeFloat(float(DamageAmplifierDurationMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.JumpBootsDelayMin = RangeFloat(float(JumpBootsDelayMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.JumpBootsDelayMax = RangeFloat(float(JumpBootsDelayMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.JumpBootsDurationMin = RangeFloat(float(JumpBootsDurationMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.JumpBootsDurationMax = RangeFloat(float(JumpBootsDurationMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.InvisibilityDelayMin = RangeFloat(float(InvisibilityDelayMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.InvisibilityDelayMax = RangeFloat(float(InvisibilityDelayMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.InvisibilityDurationMin = RangeFloat(float(InvisibilityDurationMinEC.EditBox.Value), 0.0, 999.0 ); UMutator.default.InvisibilityDurationMax = RangeFloat(float(InvisibilityDurationMaxEC.EditBox.Value), 0.0, 999.0 ); UMutator.static.StaticSaveConfig(); Super.Close(bByParent); } //----------------------------------------------------------------------------- function RestoreDefaults() { // restore default NIUTMutator config -- can't figure out a way to get at class defaults // so far before these are overridden by values in the config file (no can do?). CycleWeaponsCheckBox.bChecked = true; RandomWeaponsCheckBox.bChecked = true; UseAllWeaponsCheckBox.bChecked = true; TimeBetweenWeaponSwitchesMinEC.SetValue( "75.000000" ); TimeBetweenWeaponSwitchesMaxEC.SetValue( "75.000000" ); TimeBetweenAmmoIncrementsEC.SetValue( "0.000000" ); TimeBetweenHealthIncrementsEC.SetValue( "1.000000" ); HealthIncrementAmountEC.SetValue( "5" ); StartHealthEC.SetValue( "0" ); MaxHealthEC.SetValue( "0" ); InitialBioAmmoEC.SetValue( "50" ); MaxBioAmmoEC.SetValue( "100" ); RateBioAmmoPerSecEC.SetValue( "0.250000" ); InitialGunAmmoEC.SetValue( "100" ); MaxGunAmmoEC.SetValue( "199" ); RateGunAmmoPerSecEC.SetValue( "5.000000" ); InitialFlakAmmoEC.SetValue( "12" ); MaxFlakAmmoEC.SetValue( "50" ); RateFlakAmmoPerSecEC.SetValue( "0.200000" ); InitialPulseAmmoEC.SetValue( "50" ); MaxPulseAmmoEC.SetValue( "199" ); RatePulseAmmoPerSecEC.SetValue( "2.000000" ); InitialRedeemerAmmoEC.SetValue( "0" ); MaxRedeemerAmmoEC.SetValue( "1" ); RateRedeemerAmmoPerSecEC.SetValue( "0.050000" ); InitialRifleAmmoEC.SetValue( "12" ); MaxRifleAmmoEC.SetValue( "50" ); RateRifleAmmoPerSecEC.SetValue( "0.500000" ); InitialRipperAmmoEC.SetValue( "25" ); MaxRipperAmmoEC.SetValue( "75" ); RateRipperAmmoPerSecEC.SetValue( "1.500000" ); InitialRocketAmmoEC.SetValue( "12" ); MaxRocketAmmoEC.SetValue( "48" ); RateRocketAmmoPerSecEC.SetValue( "0.250000" ); InitialShockAmmoEC.SetValue( "12" ); MaxShockAmmoEC.SetValue( "50" ); RateShockAmmoPerSecEC.SetValue( "0.670000" ); InitialStingerAmmoEC.SetValue( "50" ); MaxStingerAmmoEC.SetValue( "200" ); RateStingerAmmoPerSecEC.SetValue( "5.000000" ); UseBioRifleCheckBox.bChecked = false; UseChainSawCheckBox.bChecked = false; UseEnforcerCheckBox.bChecked = false; UseFlakCannonCheckBox.bChecked = false; UseImpactHammerCheckBox.bChecked = false; UseMiniGunCheckBox.bChecked = true; UsePulseGunCheckBox.bChecked = false; UseRedeemerCheckBox.bChecked = false; UseRipperCheckBox.bChecked = true; UseRocketLauncherCheckBox.bChecked = true; UseShockRifleCheckBox.bChecked = false; UseSniperRifleCheckBox.bChecked = true; UseSuperShockRifleCheckBox.bChecked = false; UseUnrealIASMDCheckBox.bChecked = false; UseUnrealIAutoMagCheckBox.bChecked = false; UseUnrealIDispersionPistolCheckBox.bChecked = false; UseUnrealIEightballCheckBox.bChecked = false; UseUnrealIFlakCannonCheckBox.bChecked = false; UseUnrealIGESBioRifleCheckBox.bChecked = false; UseUnrealIMinigunCheckBox.bChecked = false; UseUnrealIRazorjackCheckBox.bChecked = false; UseUnrealIRifleCheckBox.bChecked = false; UseUnrealIStingerCheckBox.bChecked = false; DamageAmplifierDelayMinEC.SetValue( "240.000000" ); DamageAmplifierDelayMaxEC.SetValue( "240.000000" ); DamageAmplifierDurationMinEC.SetValue( "30.000000" ); DamageAmplifierDurationMaxEC.SetValue( "30.000000" ); JumpBootsDelayMinEC.SetValue( "0.000000" ); JumpBootsDelayMaxEC.SetValue( "0.000000" ); JumpBootsDurationMinEC.SetValue( "15.000000" ); JumpBootsDurationMaxEC.SetValue( "15.000000" ); InvisibilityDelayMinEC.SetValue( "0.000000" ); InvisibilityDelayMaxEC.SetValue( "0.000000" ); InvisibilityDurationMinEC.SetValue( "30.000000" ); InvisibilityDurationMaxEC.SetValue( "30.000000" ); } //----------------------------------------------------------------------------- function int RangeInt(int Num, int Min, int Max) { if (Num > Max) return Max; else if (Num < Min) return Min; else return Num; } //----------------------------------------------------------------------------- function float RangeFloat( float Num, float Min, float Max) { if (Num > Max) return Max; else if (Num < Min) return Min; else return Num; } //----------------------------------------------------------------------------- function int RoundRangeInt(float Num, int Min, int Max) { return RangeInt( int(Num + 0.5), Min, Max ); } //----------------------------------------------------------------------------- function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if(E == DE_MouseMove) { if(UMenuRootWindow(Root) != None) if(UMenuRootWindow(Root).StatusBar != None) UMenuRootWindow(Root).StatusBar.SetHelp(C.HelpText); } if(E == DE_MouseLeave) { if(UMenuRootWindow(Root) != None) if(UMenuRootWindow(Root).StatusBar != None) UMenuRootWindow(Root).StatusBar.SetHelp(""); } if( E == DE_Click ) { switch( C ) { case DefaultsButton: RestoreDefaults(); break; } } } '}JKJw*ha/!".J Ta-/H%HH JHw*J Cn *!n?Dn? #< RLrO6a Mw6*66 L6a D) 1ki b)Db?i)))) Xm. ?m?i?sA q p%$mWit kF6C:M 2N 3S ;V -^ =Z >Y <T 1U .W (T *w***w*a/!.ea/!ha/!J .2a/!qa/!0 .3a/!C .:a/!9a/!E .;Wa/!:a/!D .-a/!d .=a/!Ka/!f .>a/!5a/!d .<Ia/!ea/!4 .1ua/!@ .. .(** :: 22 33 ;;5 --N ==g >> << 11 .. (( j 18INO+a Mw+*++ N+a l//============================================================================= // NIUTConfigMenu. //============================================================================= class NIUTConfigMenu expands UWindowFramedWindow; z 8cc {e-A'aP[w*8a/!Qa/! uda/!O vVa/!Pa/!& r[Ja/!;a/! p\a/!<a/!) O]a/!N kT a/!>a/!! nU|a/!Ma/!Ea/!+a/!( Qaa/!Ga/!* P`a/! Rb US-( 7 W V-A( @M \O4a Mw4*44 M4a Gk.. ?k?j?fA d c%I'e% #e#,$?, Sekrju \I%h7I%.IIi$Ih% O52΢/a0 5uw5* %w.5*5a  A5,10z Ap  has expired. UAϨw* AD^  x&%& E1Ŧ/a0 lw* %w.*a  Am,10 SZ//============================================================================= // NIUTMutator. //============================================================================= class NIUTMutator extends Mutator config(NIUT); /*============================================================================= Mutator for NIUT (No Item Unreal Tournament). =============================================================================== Author: Mike Fox (a.k.a. ArtfulDodger) Contact: mfox@legendent.com URL: www.planetunreal.com/niu =============================================================================== tbd: Check zone before healing (shouldn't heal if drowning, in lava etc.). =============================================================================== Version: 1.24 Created: 02/05/00 +Made NIUT work better with other mutators. +Derive from Mutator instead of Arena so it can be used with other Arena mutators (e.g. grapple hook mod). This messes up Last Man Standing a bit because it only keeps ammo in the level if there is an Arena mutator being used. The work-around is to either have ammo auto-increment or use any arena mutator (e.g. the grappling hook mod) to force the ammo to stay (I don't think there is another way -- the LastManStanding Game type should really be a bit more mutator friendly). I've also created a dummy arena mutator (DummyArenaMutator) for this purpose. +The good news is that LastManStanding now works with exactly the specified weapons, so you can have a Redeemer + super shock rifle Last Man Standing match. About the only thing that doesn't work is the fact that the weapons are always given their full complement of ammo initially instead of the InitialSettings that NIUT specifies. There doesn't seem to be an easy workaround to this and I don't think its a big deal, so I probably won't look into it. +NIUT no longer strips anything but "known" weapons from pawns so it doesn't interfere with stuff that other mutators want to give them. Each time a pawn (player / bot) joins the game or respawns, any "known" weapons in the pawn's inventory at that point are removed. This is also done when cycling weapons and when the current weapon changes. The list of "known" weapons includes all the UT and Unreal I weapons currently. If someone adds a new weapon (e.g. the BattleAxe) and gives this to players, it will *not* be filtered out by default. To have the new weapon behave just like other weapons add it to the ExtraWeaponClassStrings list. This means that a grapple (for example) which has a class derived from weapon should not be affected by having the NIUT mutator loaded. +CheckReplacement also only strips out known weapons (unless bForceWeaponSpawn is set internally. +Fix for conflict between Low Gravity and NIUT mutators (Low Gravity was forcing jumpboots to be stripped out even if NIUT was set up to use these). Solution: have AlwaysKeep() return true for jumpboots. +Fix for accessed None warnings in RateSelf (give ammo before putting into Pawn's inventory etc.). =============================================================================== Version: 1.23 Created: 01/28/00 +Added UI support for specifying NIUT settings through Mod menu. +bAllWeapons -> !bCycleWeapons +WeaponClassStrings -> ExtraWeaponClassStrings (support for new weapons not already in UT). +Can specify max ammo that any weapon can carry (e.g. limit Redeemer to only carrying 1 warhead at a time). +Added MaxHealth option for auto-incremented health (5000 with Redeemer is fun). +Added StartHealth option to control health that pawns start with. =============================================================================== Version: 1.21 Created: 01/04/00 +Made it possible to specify how much ammo should be given per second (ammo is still incremented on each TimeBetweenAmmoIncrements). +Added InitialAmmoXXX settings to specify how much ammo weapons should have when given to players (bots). Setting this to 0 means that the weapon will have no ammo (and won't be available until ammo is found/given to the player). +Can actually give more ammo to a weapon that it normally allows (e.g. can start out with redeemers with 99 warheads) and this becomes the new maximum for the weapon. +Tweaked default ammo rates for all weapons. =============================================================================== Version: 1.20 Created: 12/21/99 +If bCycleWeapons is false players get all weapons specified in niut.ini and ammo auto-increments -- pickups are health vials. +If TimeBetweenAmmoIncrements is > 0.0, ammo auto-increments by 1 unit every N seconds where N is determined by settings in niut.ini. Pickups are health vials. +Several optimizations (replace ForEach AllActors with, e.g. iterating PawnList where possible. =============================================================================== Version: 1.11 Created: 12/09/99 +Fix for translocator getting stripped out in games where it should be kept. =============================================================================== Version: 1.10 Created: 12/08/99 +Fix for Redeemer ammo not working. TBD: how will UT release handle this -- currently ammo class has no mesh and gives 0 ammo. Change was to make ammo a sprite and to give it 1 charge (update -- will stick with this approach for NIUT 1.10). +Change to support UnrealI and UnrealShare weapons and WeaponPowerUp (UT normally replaces these with UT equivalents or filters them out). +When dispersion pistol is in use, all pickups in the level are turned into powerups so you can upgrade the pistol. +Don't allow jumpboots, invisibility, damage amplifier to run out before their time is up (probably no one will even notice this change). +Added logging in PreBeginPlay (number of weapons) and log info if no weapons found. +Added logging each time the weapon is changed, including the number of (real) players in the game. +Default to just 1 weapon in slot 0 of the WeaponClassStrings -- rocket launcher so that you don't have to override a pile of unused slots if you have < N weapons. +Default time between weapon switches is now 75 secs. Might help to avoid server crashes which can occur when many objects created and destroyed before a level ends. +Don't zap searchlights (darkmatch support). +Only play sounds through playerpawns (not bots). +Weapon switch sound shouldn't get overridden as much now. =============================================================================== Version: 1.00 Created: 11/05/99 +Weapon changes every MinTimeBetweenWeaponSwitches..MaxTimeBetweenWeaponSwitches secs instead of every TimeBetweenWeaponSwitches secs. +Server automatically increments health of all players by HealthIncrementRate units per second. +Option to randomly give everyone jump boots, invisibility, power amplifier. =============================================================================== Version: 0.99 Created: 11/01/99 +Everyone plays with the same weapon at all times. +Current weapon is chosen from a configurable list of weapons and should support any Weapon-derived classes, even non-UT weapons. +Current weapon changes every TimeBetweenWeaponSwitches. +Weapons are selected randomly/sequentially (bRandomWeapons=true/false). +If weapons are selected randomly can force all weapons to be used at least once before restarting the selection process (bUseAllWeapons=true). +Replaces all pickup items in the level with ammo for the current weapon. If the current weapon doesn't require ammo, uses health vials. Flags, runes etc. and the translocator aren't affected. +Plays a warning sound just before weapon is changed (WarningSound). +To have some weapons used more frequently that others, just put them in WeaponClassStrings more than once. =============================================================================== Notes: +Doesn't work with double enforcers special case -- single only +Unreal I weapons don't fire for clients so can only be used against bots in a standalone (non-server) game. =============================================================================*/ var() config bool bRandomWeapons; // (true): true ==> weapons selected randomly, false ==> weapons cycled sequentially var() config bool bUseAllWeapons; // (true): true ==> if bWeaponsRandom is true, all weapons used once per cycle var() config bool bCycleWeapons; // (true): false ==> players get all weapons in weapons list with auto-incrementing ammo // weapons var() config bool bUseChainSaw; // (false) var() config bool bUseEnforcer; // (false) var() config bool bUseImpactHammer; // (false) var() config bool bUseMiniGun; // (false) var() config bool bUsePulseGun; // (false) var() config bool bUseRipper; // (false) var() config bool bUseShockRifle; // (false) var() config bool bUseSniperRifle; // (false) var() config bool bUseSuperShockRifle; // (false) var() config bool bUseBioRifle; // (false) var() config bool bUseRocketLauncher; // (false) var() config bool bUseFlakCannon; // (false) var() config bool bUseRedeemer; // (false) var() config bool bUseUnrealIFlakCannon; // (false) var() config bool bUseUnrealIGESBioRifle; // (false) var() config bool bUseUnrealIMinigun; // (false) var() config bool bUseUnrealIRazorjack; // (false) var() config bool bUseUnrealIRifle; // (false) var() config bool bUseUnrealIASMD; // (false) var() config bool bUseUnrealIAutoMag; // (false) var() config bool bUseUnrealIDispersionPistol; // (false) var() config bool bUseUnrealIEightball; // (false) var() config bool bUseUnrealIStinger; // (false) var() config string ExtraWeaponClassStrings[32]; // list of weapons to use (for adding weapons not in UT / Unreal I) var() config float TimeBetweenWeaponSwitchesMin; // (45): min secs between weapon switches var() config float TimeBetweenWeaponSwitchesMax; // (45): max secs between weapon switches var() config float TimeBetweenAmmoIncrements; // (0.0): >0.0 ==> auto-increment ammo at this rate var() config Sound WarningSound; // (UTSuperHeal): sound to use for "about to switch" warning var() config int WarningSoundRepeats; // (3): # times to repeat WarningSound var() config Sound HealthIncrementSound; // (None): sound to play when incrementing player's health var() config int HealthIncrementAmount; // (0): rate at which health of players is incremented var() config int StartHealth; // (100): health that pawns start out with var() config int MaxHealth; // (100): max that health can be auto-incremented to var() config float TimeBetweenHealthIncrements; // (5): secs between health updates if HealthIncrementRate >= 1 var() config float InvisibilityDelayMin; // (0.0): min time to wait before giving everyone invisibility var() config float InvisibilityDelayMax; // (0.0): max time to wait before giving everyone invisibility var() config float InvisibilityDurationMin; // (0.0): min time to wait before giving everyone invisibility var() config float InvisibilityDurationMax; // (0.0): max time to wait before giving everyone invisibility var() config float DamageAmplifierDelayMin; // (0.0): min time to wait before giving everyone damage amplifier var() config float DamageAmplifierDelayMax; // (0.0): max time to wait before giving everyone damage amplifier var() config float DamageAmplifierDurationMin; // (0.0): min time to wait before giving everyone damage amplifier var() config float DamageAmplifierDurationMax; // (0.0): max time to wait before giving everyone damage amplifier var() config float JumpBootsDelayMin; // (0.0): min time to wait before giving everyone jump boots var() config float JumpBootsDelayMax; // (0.0): max time to wait before giving everyone jump boots var() config float JumpBootsDurationMin; // (0.0): min time to wait before giving everyone jump boots var() config float JumpBootsDurationMax; // (0.0): max time to wait before giving everyone jump boots // ammo incrementing (number of TimeBetweenAmmoIncrements before ammo is incremented by 1) var() config int InitialRedeemerAmmo; var() config int InitialRocketAmmo; var() config int InitialFlakAmmo; var() config int InitialShockAmmo; var() config int InitialRifleAmmo; var() config int InitialPulseAmmo; var() config int InitialRipperAmmo; var() config int InitialBioAmmo; var() config int InitialGunAmmo; var() config int InitialStingerAmmo; var() config int InitialOtherAmmo; // ammo incrementing (number of TimeBetweenAmmoIncrements before ammo is incremented by 1) var() config float RateRedeemerAmmoPerSec; var() config float RateRocketAmmoPerSec; var() config float RateFlakAmmoPerSec; var() config float RateShockAmmoPerSec; var() config float RateRifleAmmoPerSec; var() config float RatePulseAmmoPerSec; var() config float RateRipperAmmoPerSec; var() config float RateBioAmmoPerSec; var() config float RateGunAmmoPerSec; var() config float RateStingerAmmoPerSec; var() config float RateOtherAmmoPerSec; // ammo incrementing (number of TimeBetweenAmmoIncrements before ammo is incremented by 1) var() config int MaxRedeemerAmmo; var() config int MaxRocketAmmo; var() config int MaxFlakAmmo; var() config int MaxShockAmmo; var() config int MaxRifleAmmo; var() config int MaxPulseAmmo; var() config int MaxRipperAmmo; var() config int MaxBioAmmo; var() config int MaxGunAmmo; var() config int MaxStingerAmmo; var() config int MaxOtherAmmo; var int NumWeapons; // number of weapons in ExtraWeaponClassStrings list var string FilteredWeaponClassStrings[64]; // filtered list of weapons to use var Class CurrentWeaponClass; // current weapon class var int CurrentWeaponIndex; // index into FilteredWeaponClassStrings for current weapon var int NumUsedWeapons; // number of weapons used so far (used with bUseAllWeapons) var byte UsedWeapons[64]; // list of weapons used so far (used with bUseAllWeapons) var int NumWarnings; // did "about to switch" warning var float NextChooseWeaponTime; // when to switch again var float ChooseWeaponWarningTime; // secs before weapon switch to warn clients var float NextIncrementHealthTime; // when to do another pass through player health values var float NextInvisibilityTime; // when to give everyone invisibility var float NextKillInvisibilityTime; // when to remove invisibility from everyone (also indicates everyone is invisible) var float NextDamageAmplifierTime; // when to give everyone damage amplifier var float NextKillDamageAmplifierTime; // when to remove damage amplifier from everyone (also indicates everyone has damage amplifier) var float NextJumpBootsTime; // when to give everyone jump boots var float NextKillJumpBootsTime; // when to remove jump boots (also indicates everyone has jump boots) var float NextAmmoIncrementTime; // when to increment ammo var float CountRedeemerAmmo; var float CountRocketAmmo; var float CountFlakAmmo; var float CountShockAmmo; var float CountRifleAmmo; var float CountPulseAmmo; var float CountRipperAmmo; var float CountBioAmmo; var float CountGunAmmo; var float CountStingerAmmo; var float CountOtherAmmo; // utility variables var bool bDidTick; // set after first tick occurs //var bool bForceSpawn; // set to force CheckReplacement to return true var bool bForceWeaponSpawn; // set to force CheckReplacement to return true for weapons const LOTSATIME = 99999.0; //----------------------------------------------------------------------------- function MaybeAddWeapon( bool bUse, string WeaponClassString, out int NumWeapons ) { if( bUse ) { if( DynamicLoadObject( WeaponClassString, class'Class' ) != None ) { FilteredWeaponClassStrings[ NumWeapons ] = WeaponClassString; NumWeapons++; } else { warn( Self $ ": WeaponClassString is invalid in MaybeAddWeapon: " $ WeaponClassString ); } } } //----------------------------------------------------------------------------- // Prepare list of weapon classes to use, initialize stuff. The first tick that // this mutator receives will select the first weapon to use and give it to // all players. function PreBeginPlay() { local int i; Super.PreBeginPlay(); // determine how many valid weapons we have NumWeapons=0; // standard weapons MaybeAddWeapon( bUseChainSaw, "Botpack.ChainSaw", NumWeapons ); MaybeAddWeapon( bUseEnforcer, "Botpack.Enforcer", NumWeapons ); MaybeAddWeapon( bUseImpactHammer, "Botpack.ImpactHammer", NumWeapons ); MaybeAddWeapon( bUseMiniGun, "Botpack.MiniGun2", NumWeapons ); MaybeAddWeapon( bUsePulseGun, "Botpack.PulseGun", NumWeapons ); MaybeAddWeapon( bUseRipper, "Botpack.Ripper", NumWeapons ); MaybeAddWeapon( bUseShockRifle, "Botpack.ShockRifle", NumWeapons ); MaybeAddWeapon( bUseSniperRifle, "Botpack.SniperRifle", NumWeapons ); MaybeAddWeapon( bUseSuperShockRifle, "Botpack.SuperShockRifle", NumWeapons ); MaybeAddWeapon( bUseBioRifle, "Botpack.UT_BioRifle", NumWeapons ); MaybeAddWeapon( bUseRocketLauncher, "Botpack.UT_Eightball", NumWeapons ); MaybeAddWeapon( bUseFlakCannon, "Botpack.UT_FlakCannon", NumWeapons ); MaybeAddWeapon( bUseRedeemer, "Botpack.WarheadLauncher", NumWeapons ); MaybeAddWeapon( bUseUnrealIFlakCannon, "UnrealI.FlakCannon", NumWeapons ); MaybeAddWeapon( bUseUnrealIGESBioRifle, "UnrealI.GESBioRifle", NumWeapons ); MaybeAddWeapon( bUseUnrealIMinigun, "UnrealI.Minigun", NumWeapons ); MaybeAddWeapon( bUseUnrealIRazorjack, "UnrealI.Razorjack", NumWeapons ); MaybeAddWeapon( bUseUnrealIRifle, "UnrealI.Rifle", NumWeapons ); MaybeAddWeapon( bUseUnrealIASMD, "UnrealShare.ASMD", NumWeapons ); MaybeAddWeapon( bUseUnrealIAutoMag, "UnrealShare.AutoMag", NumWeapons ); MaybeAddWeapon( bUseUnrealIDispersionPistol,"UnrealShare.DispersionPistol", NumWeapons ); MaybeAddWeapon( bUseUnrealIEightball, "UnrealShare.Eightball", NumWeapons ); MaybeAddWeapon( bUseUnrealIStinger, "UnrealShare.Stinger", NumWeapons ); // weapons specified through ExtraWeaponClassStrings for( i=0; i 0.0 ) { CountRedeemerAmmo = 0.0; CountRocketAmmo = 0.0; CountFlakAmmo = 0.0; CountShockAmmo = 0.0; CountRifleAmmo = 0.0; CountRipperAmmo = 0.0; CountBioAmmo = 0.0; CountGunAmmo = 0.0; CountStingerAmmo = 0.0; CountPulseAmmo = 0.0; CountOtherAmmo = 0.0; } NextChooseWeaponTime = 0.0; NextIncrementHealthTime = 0.0; NextInvisibilityTime = 0.0; NextKillInvisibilityTime = 0.0; NextDamageAmplifierTime = 0.0; NextKillDamageAmplifierTime = 0.0; NextJumpBootsTime = 0.0; NextKillJumpBootsTime = 0.0; NumWarnings = WarningSoundRepeats; ChooseWeaponWarningTime = 0.0; if( WarningSound != None ) { ChooseWeaponWarningTime = GetSoundDuration( WarningSound ); } CurrentWeaponIndex = -1; ResetUsedWeapons(); if( MaxHealth <= 0) { MaxHealth = class'Pawn'.default.Health; } if( StartHealth <= 0) { StartHealth = class'Pawn'.default.Health; } } //----------------------------------------------------------------------------- // Perform weapon switching etc. when the time is right. function Tick( float DeltaTime ) { local Pawn P; local PlayerPawn PP; local Inventory Inv; Super.Tick( DeltaTime ); // setup if( !bDidTick ) { if( InvisibilityDelayMin > 0.0 ) { NextInvisibilityTime = Level.TimeSeconds + RandRange(InvisibilityDelayMin, InvisibilityDelayMax); } if( DamageAmplifierDelayMin > 0.0 ) { NextDamageAmplifierTime = Level.TimeSeconds + RandRange(DamageAmplifierDelayMin, DamageAmplifierDelayMax); } if( JumpBootsDelayMin > 0.0 ) { NextJumpBootsTime = Level.TimeSeconds + RandRange(JumpBootsDelayMin, JumpBootsDelayMax); } if( TimeBetweenAmmoIncrements > 0.0 ) { NextAmmoIncrementTime = Level.TimeSeconds + TimeBetweenAmmoIncrements; } bDidTick = true; } else { // weapon switch warning if( (NumWarnings < WarningSoundRepeats) && (Level.TimeSeconds >= (NextChooseWeaponTime - (WarningSoundRepeats-NumWarnings)*ChooseWeaponWarningTime )) ) { // warn that we are about to switch the weapon if( WarningSound != None ) { for( P=Level.PawnList; P != None; P=P.NextPawn ) { if( P.IsA( 'PlayerPawn' ) ) { PlayerPawn(P).PlaySound( WarningSound,, 8 ); } } } NumWarnings++; } } // weapon switch if( bCycleWeapons && Level.TimeSeconds >= NextChooseWeaponTime ) { // time to change everybody's weapon ChooseWeapon(); for( P=Level.PawnList; P != None; P=P.NextPawn ) { SetInventory( P ); } NumWarnings = 0; NextChooseWeaponTime = Level.TimeSeconds + RandRange(TimeBetweenWeaponSwitchesMin, TimeBetweenWeaponSwitchesMax); } // increment health if( (HealthIncrementAmount >= 1) && (Level.TimeSeconds >= NextIncrementHealthTime) ) { for( P=Level.PawnList; P != None; P=P.NextPawn ) { if( (P.Health > 0) && (P.Health < MaxHealth) ) { P.Health += Min( HealthIncrementAmount, MaxHealth - P.Health ); // play sound only if we won't spam the weapons switch warning (not playing if NumWarnings is 0 if( HealthIncrementSound != None && (NumWarnings == 0) && (PlayerPawn(P) != None) ) { P.PlaySound( HealthIncrementSound ); } } } NextIncrementHealthTime = Level.TimeSeconds + TimeBetweenHealthIncrements; } // invisibility if( (InvisibilityDelayMin > 0.0) && (Level.TimeSeconds >= NextInvisibilityTime) ) { for( P=Level.PawnList; P != None; P=P.NextPawn ) { GiveInvisibilityTo( P ); // play sound only if we won't spam the weapons switch warning (not playing if NumWarnings is 0 // sound always plays in singleplayer? if( Level.NetMode != NM_Standalone && (NumWarnings == 0) && (PlayerPawn(P) != None) ) { P.PlaySound( class'UT_invisibility'.default.ActivateSound,, 8 ); } } NextInvisibilityTime = Level.TimeSeconds + LOTSATIME; NextKillInvisibilityTime = Level.TimeSeconds + RandRange(InvisibilityDurationMin, InvisibilityDurationMax); } if( (NextKillInvisibilityTime > 0.0) && (Level.TimeSeconds >= NextKillInvisibilityTime) ) { RemoveAllInvisibility(); NextKillInvisibilityTime = 0.0; NextInvisibilityTime = Level.TimeSeconds + RandRange(InvisibilityDelayMin, InvisibilityDelayMax); } // damage amplifier if( (DamageAmplifierDelayMin > 0.0) && (Level.TimeSeconds >= NextDamageAmplifierTime) ) { for( P=Level.PawnList; P != None; P=P.NextPawn ) { GiveDamageAmplifierTo( P ); // play sound only if we won't spam the weapons switch warning (not playing if NumWarnings is 0 // sound always plays in singleplayer? if( Level.NetMode != NM_Standalone && (NumWarnings == 0) && (PlayerPawn(P) != None) ) { P.PlaySound( class'UDamage'.default.ActivateSound,, 8 ); } } NextDamageAmplifierTime = Level.TimeSeconds + LOTSATIME; NextKillDamageAmplifierTime = Level.TimeSeconds + RandRange(DamageAmplifierDurationMin, DamageAmplifierDurationMax); } if( (NextKillDamageAmplifierTime > 0.0) && (Level.TimeSeconds >= NextKillDamageAmplifierTime) ) { RemoveAllDamageAmplifiers(); NextKillDamageAmplifierTime = 0.0; NextDamageAmplifierTime = Level.TimeSeconds + RandRange(DamageAmplifierDelayMin, DamageAmplifierDelayMax); } // jump boots if( (JumpBootsDelayMin > 0.0) && (Level.TimeSeconds >= NextJumpBootsTime) ) { for( P=Level.PawnList; P != None; P=P.NextPawn ) { GiveJumpBootsTo( P ); // play sound only if we won't spam the weapons switch warning (not playing if NumWarnings is 0 // sound always plays in singleplayer? if( Level.NetMode != NM_Standalone && (NumWarnings == 0) && (PlayerPawn(P) != None) ) { P.PlaySound( class'ut_jumpboots'.default.ActivateSound,, 8 ); } } NextJumpBootsTime = Level.TimeSeconds + LOTSATIME; NextKillJumpBootsTime = Level.TimeSeconds + RandRange(JumpBootsDurationMin, JumpBootsDurationMax); } if( (NextKillJumpBootsTime > 0.0) && (Level.TimeSeconds >= NextKillJumpBootsTime) ) { RemoveAllJumpBoots(); NextKillJumpBootsTime = 0.0; NextJumpBootsTime = Level.TimeSeconds + RandRange(JumpBootsDelayMin, JumpBootsDelayMax); } // ammo if( (TimeBetweenAmmoIncrements > 0.0) && (Level.TimeSeconds >= NextAmmoIncrementTime) ) { IncrementAllAmmo(); NextAmmoIncrementTime = Level.TimeSeconds + TimeBetweenAmmoIncrements; } } //----------------------------------------------------------------------------- // Clear used weapon list used to make sure all weapons are used at least once // when bUseAllWeapons is set. function ResetUsedWeapons() { local int i; for( i=0; i 0.0 ) { // replace pickups with health vials -- weapon ammo will be incremented if( !Inv.IsA( 'HealthVial' ) ) { ReplaceWith( Inv, "Botpack.HealthVial" ); Inv.Destroy(); } } else if( CurrentWeaponClass == Class'DispersionPistol' ) { // put powerups in level for dispersion pistol if( !Inv.IsA( 'WeaponPowerUp' ) ) { ReplaceWith( Inv, "UnrealShare.WeaponPowerUp" ); Inv.Destroy(); } } else if( (CurrentWeaponClass.default.AmmoName == None) || (CurrentWeaponClass.default.AmmoName.Name == '') || (CurrentWeaponClass == Class'SuperShockRifle') ) { // replace with vials of health -- keeps bot destination code happy if( !Inv.IsA( 'HealthVial' ) ) { ReplaceWith( Inv, "Botpack.HealthVial" ); Inv.Destroy(); } } else { if( Inv.Class.Name != CurrentWeaponClass.default.AmmoName.Name ) { ReplaceWith( Inv, string(CurrentWeaponClass.default.AmmoName) ); Inv.Destroy(); } } } } if( CurrentWeaponClass == Class'WarheadLauncher' ) { // UT400 WarheadAmmo currently has no mesh/texture and 0 ammo foreach AllActors( class'Inventory', Inv ) { if( Inv.Owner == None && Inv.IsA( 'WarheadAmmo') ) { Inv.DrawType = DT_Sprite; Ammo(Inv).AmmoAmount = 1; } } } } //----------------------------------------------------------------------------- // Select the next weapon to use and replace all pickup items in the level with // ammo for this weapon, or health vials if the weapon doesn't require ammo. function ChooseWeapon() { local int i; local Inventory Inv; if( CurrentWeaponIndex == -1 ) { CurrentWeaponIndex = 0; } if( NumWeapons >= 1) { if( NumUsedWeapons == NumWeapons ) { ResetUsedWeapons(); } if( bRandomWeapons ) { CurrentWeaponIndex = Rand( NumWeapons ); if( bUseAllWeapons ) { while( UsedWeapons[CurrentWeaponIndex] != 0 ) { CurrentWeaponIndex++; if( CurrentWeaponIndex >= NumWeapons ) { CurrentWeaponIndex=0; } } } NumUsedWeapons++; UsedWeapons[CurrentWeaponIndex] = 1; } CurrentWeaponClass = class( DynamicLoadObject( FilteredWeaponClassStrings[CurrentWeaponIndex], class'Class' ) ); if( CurrentWeaponClass == None ) { warn( Self $ ": CurrentDefaultWeapon is None!" ); } if( !bRandomWeapons ) { CurrentWeaponIndex++; if( CurrentWeaponIndex >= NumWeapons ) { CurrentWeaponIndex=0; } } } else { warn( Self $ ": ExtraWeaponsClassStrings contain no valid weapon(s)!" ); } log( "NIUT: " $ Level.TimeSeconds $ " (" $ Level.Game.NumPlayers $ ") -- selected: " $ CurrentWeaponClass ); TransformPickups(); NextChooseWeaponTime = Level.TimeSeconds + RandRange( TimeBetweenWeaponSwitchesMin, TimeBetweenWeaponSwitchesMax ); } //----------------------------------------------------------------------------- // Give W Amount units of ammo, increasing ammo's MaxAmmo if necessary and make // sure the weapon doesn't end up with *more* than Amount units of ammo. function GiveAmmo( Weapon W, Pawn Other, int Amount, int Max ) { if ( W.AmmoName != None ) { W.AmmoType = Ammo(Other.FindInventoryType(W.AmmoName)); if ( W.AmmoType != None ) { if( W.AmmoType.MaxAmmo < Amount ) { W.AmmoType.MaxAmmo = Amount; } W.AmmoType.AddAmmo(Amount); } else { W.AmmoType = Spawn(W.AmmoName); // Create ammo type required Other.AddInventory(W.AmmoType); // and add to player's inventory W.AmmoType.BecomeItem(); if( W.AmmoType.MaxAmmo < Amount ) { W.AmmoType.MaxAmmo = Amount; } W.AmmoType.AmmoAmount = Amount; W.AmmoType.GotoState('Idle2'); } if( Max > 0 ) { // might override temporary MaxAmmo set above to give initial amount W.AmmoType.MaxAmmo = Max; } } // make sure weapon doesn't have *more* than the specified amount. if( W.AmmoType.AmmoAmount > Amount ) { W.AmmoType.AmmoAmount = Amount; } } //----------------------------------------------------------------------------- function GiveWeaponTo( Pawn P, Class WeaponClass ) { local Weapon newWeapon; // bForceSpawn = true; bForceWeaponSpawn = true; newWeapon = Spawn(WeaponClass); if( newWeapon != None ) { newWeapon.Instigator = P; newWeapon.BecomeItem(); if( newWeapon.IsA( 'ut_eightball' ) || newWeapon.IsA( 'Eightball' )) { GiveAmmo( newWeapon, P, InitialRocketAmmo, MaxRocketAmmo ); } else if( newWeapon.IsA( 'WarheadLauncher' ) ) { GiveAmmo( newWeapon, P, InitialRedeemerAmmo, MaxRedeemerAmmo ); } else if( newWeapon.IsA( 'ut_flakcannon' ) || newWeapon.IsA( 'FlakCannon' )) { GiveAmmo( newWeapon, P, InitialFlakAmmo, MaxFlakAmmo ); } else if( newWeapon.IsA( 'shockrifle' ) || newWeapon.IsA( 'ASMD') ) { GiveAmmo( newWeapon, P, InitialShockAmmo, MaxShockAmmo ); } else if( newWeapon.IsA( 'sniperrifle' ) || newWeapon.IsA( 'Rifle' )) { GiveAmmo( newWeapon, P, InitialRifleAmmo, MaxRifleAmmo ); } else if( newWeapon.IsA( 'PulseGun' ) ) { GiveAmmo( newWeapon, P, InitialPulseAmmo, MaxPulseAmmo ); } else if( newWeapon.IsA( 'ripper' ) || newWeapon.IsA( 'razorjack' ) ) { GiveAmmo( newWeapon, P, InitialRipperAmmo, MaxRipperAmmo ); } else if( newWeapon.IsA( 'minigun2' ) || newWeapon.IsA( 'enforcer' ) || newWeapon.IsA( 'AutoMag' ) || newWeapon.IsA( 'Minigun' ) ) { GiveAmmo( newWeapon, P, InitialGunAmmo, MaxGunAmmo ); } else if( newWeapon.IsA( 'ut_biorifle' ) || newWeapon.IsA( 'gesbiorifle' ) ) { GiveAmmo( newWeapon, P, InitialBioAmmo, MaxBioAmmo ); } else if( newWeapon.IsA( 'stinger' ) ) { GiveAmmo( newWeapon, P, InitialStingerAmmo, MaxStingerAmmo ); } else { // not one of the standard UT or Unreal I weapons -- handle all of these // using "other" initial, max ammo etc. which might not be right... GiveAmmo( newWeapon, P, InitialOtherAmmo, MaxOtherAmmo ); } // make sure weapon can't be tossed newWeapon.bCanThrow = false; P.AddInventory(newWeapon); newWeapon.SetSwitchPriority(P); newWeapon.WeaponSet(P); // mdf-tbd: might be bad to do this... // newWeapon.BringUp(); } // bForceSpawn = false; bForceWeaponSpawn = false; } //----------------------------------------------------------------------------- // Only filter weapons that we know about (including weapons added to the // ExtraWeaponClassStrings so we don't remove anything that shouldn't be such // as the CGrapple mutator classes. function bool FilterWeapon( Weapon W ) { local int i; local Class C; // standard UT and Unreal I weapons if( W.IsA( 'UT_Eightball' ) || W.IsA( 'UT_FlakCannon' ) || W.IsA( 'Enforcer' ) || W.IsA( 'MiniGun2' ) || W.IsA( 'PulseGun' ) || W.IsA( 'Ripper' ) || W.IsA( 'ShockRifle' ) || W.IsA( 'SniperRifle' ) || W.IsA( 'SuperShockRifle' ) || W.IsA( 'UT_BioRifle' ) || W.IsA( 'WarheadLauncher' ) || W.IsA( 'ImpactHammer' ) || W.IsA( 'ChainSaw' ) || W.IsA( 'FlakCannon' ) || W.IsA( 'GESBioRifle' ) || W.IsA( 'Minigun' ) || W.IsA( 'Razorjack' ) || W.IsA( 'Rifle' ) || W.IsA( 'ASMD' ) || W.IsA( 'AutoMag' ) || W.IsA( 'DispersionPistol' ) || W.IsA( 'Eightball' ) || W.IsA( 'Stinger' ) ) { return true; } // check any weapons specified through ExtraWeaponClassStrings for( i=0; i( DynamicLoadObject( FilteredWeaponClassStrings[WeaponIndex], class'Class' ) ); GiveWeaponTo( P, CurrentWeaponClass ); } } else if( CurrentWeaponClass!=None ) { GiveWeaponTo( P, CurrentWeaponClass ); } } //----------------------------------------------------------------------------- function bool MoreOrLessInt( float Val ) { return( abs(Val - int(Val+0.5)) < 0.010 ); } //----------------------------------------------------------------------------- function AdjustAmmo( Ammo AInv, float AmmoCount ) { if( MoreOrLessInt(AmmoCount) ) { AInv.AmmoAmount += int(AmmoCount+0.5); if( AInv.AmmoAmount > AInv.MaxAmmo ) { AInv.AmmoAmount = AInv.MaxAmmo; } } } //----------------------------------------------------------------------------- function IncrementAllAmmo() { local Inventory Inv; local Pawn P; CountRedeemerAmmo += (RateRedeemerAmmoPerSec * TimeBetweenAmmoIncrements); CountRocketAmmo += (RateRocketAmmoPerSec * TimeBetweenAmmoIncrements); CountFlakAmmo += (RateFlakAmmoPerSec * TimeBetweenAmmoIncrements); CountRifleAmmo += (RateRifleAmmoPerSec * TimeBetweenAmmoIncrements); CountGunAmmo += (RateGunAmmoPerSec * TimeBetweenAmmoIncrements); CountPulseAmmo += (RatePulseAmmoPerSec * TimeBetweenAmmoIncrements); CountShockAmmo += (RateShockAmmoPerSec * TimeBetweenAmmoIncrements); CountRipperAmmo += (RateRipperAmmoPerSec * TimeBetweenAmmoIncrements); CountBioAmmo += (RateBioAmmoPerSec * TimeBetweenAmmoIncrements); CountStingerAmmo += (RateStingerAmmoPerSec * TimeBetweenAmmoIncrements); CountOtherAmmo += (RateOtherAmmoPerSec * TimeBetweenAmmoIncrements); for( P=Level.PawnList; P != None; P=P.NextPawn ) for( Inv=P.Inventory; Inv!=None; Inv=Inv.Inventory ) { if( Inv.IsA( 'Ammo' ) ) { if( Inv.IsA( 'RocketPack' ) || Inv.IsA( 'RocketCan' ) ) { AdjustAmmo( Ammo(Inv), CountRocketAmmo ); } else if( Inv.IsA( 'FlakAmmo' ) || Inv.IsA( 'FlakBox' ) ) { AdjustAmmo( Ammo(Inv), CountFlakAmmo ); } else if( Inv.IsA( 'WarHeadAmmo' ) ) { AdjustAmmo( Ammo(Inv), CountRedeemerAmmo ); } else if( Inv.IsA( 'RifleRound' ) || Inv.IsA( 'BulletBox' ) ) { AdjustAmmo( Ammo(Inv), CountRifleAmmo ); } else if( Inv.IsA( 'ShellBox' ) || Inv.IsA( 'Miniammo' ) ) { AdjustAmmo( Ammo(Inv), CountGunAmmo ); } else if( Inv.IsA( 'PAmmo' ) ) { AdjustAmmo( Ammo(Inv), CountPulseAmmo ); } else if( Inv.IsA( 'ASMDAmmo' ) || Inv.IsA( 'ShockCore' ) ) { AdjustAmmo( Ammo(Inv), CountShockAmmo ); } else if( Inv.IsA( 'RazorAmmo' ) || Inv.IsA( 'BladeHopper' ) ) { AdjustAmmo( Ammo(Inv), CountRipperAmmo ); } else if( Inv.IsA( 'BioAmmo' ) || Inv.IsA( 'Sludge' ) ) { AdjustAmmo( Ammo(Inv), CountBioAmmo ); } else if( Inv.IsA( 'StingerAmmo' ) ) { AdjustAmmo( Ammo(Inv), CountStingerAmmo ); } else { // unknown ammo type AdjustAmmo( Ammo(Inv), CountOtherAmmo ); } } } if( MoreOrLessInt(CountRedeemerAmmo) ) CountRedeemerAmmo = 0.0; if( MoreOrLessInt(CountRocketAmmo) ) CountRocketAmmo = 0.0; if( MoreOrLessInt(CountFlakAmmo) ) CountFlakAmmo = 0.0; if( MoreOrLessInt(CountRifleAmmo) ) CountRifleAmmo = 0.0; if( MoreOrLessInt(CountGunAmmo) ) CountGunAmmo = 0.0; if( MoreOrLessInt(CountPulseAmmo) ) CountPulseAmmo = 0.0; if( MoreOrLessInt(CountShockAmmo) ) CountShockAmmo = 0.0; if( MoreOrLessInt(CountRipperAmmo) ) CountRipperAmmo = 0.0; if( MoreOrLessInt(CountBioAmmo) ) CountBioAmmo = 0.0; if( MoreOrLessInt(CountStingerAmmo) ) CountStingerAmmo = 0.0; if( MoreOrLessInt(CountOtherAmmo) ) CountOtherAmmo = 0.0; } //----------------------------------------------------------------------------- function GiveInvisibilityTo( Pawn P ) { local UT_Invisibility Invisibility; // bForceSpawn = true; Invisibility = Spawn( class'UT_Invisibility' ); if( Invisibility != None ) { Invisibility.Charge = 99999; Invisibility.Touch( P ); Invisibility.Destroy(); } // bForceSpawn = false; } //----------------------------------------------------------------------------- function RemoveAllInvisibility() { local UT_Invisibility Invisibility; foreach AllActors( class'UT_invisibility', Invisibility ) { if( Invisibility.Owner != None && (NumWarnings == 0) && (PlayerPawn(Invisibility.Owner) != None) ) { Invisibility.Owner.PlaySound( Sound'Botpack.ASMD.Vapour',, 8 ); } Invisibility.UsedUp(); } } //----------------------------------------------------------------------------- function GiveDamageAmplifierTo( Pawn P ) { local UDamage DamageAmplifier; // bForceSpawn = true; DamageAmplifier = Spawn( class'UDamage' ); if( DamageAmplifier != None ) { DamageAmplifier.Charge = 99999; DamageAmplifier.Touch( P ); DamageAmplifier.Destroy(); } // bForceSpawn = false; } //----------------------------------------------------------------------------- function RemoveAllDamageAmplifiers() { local UDamage DamageAmplifier; foreach AllActors( class'UDamage', DamageAmplifier ) { if( DamageAmplifier.Owner != None && (NumWarnings == 0) && (PlayerPawn(DamageAmplifier.Owner) != None) ) { DamageAmplifier.Owner.PlaySound( class'UDamage'.default.DeActivateSound,, 8 ); } DamageAmplifier.UsedUp(); } // UT gold might add ExpireMessage? if( class'UDamage'.default.ExpireMessage == "" ) { BroadcastMessage( class'UDamage'.default.ItemName $ " has expired." ); // not localized... } } //----------------------------------------------------------------------------- function GiveJumpBootsTo( Pawn P ) { local ut_jumpboots JumpBoots; // bForceSpawn = true; JumpBoots = Spawn( class'ut_jumpboots' ); if( JumpBoots != None ) { JumpBoots.Charge = 99999; JumpBoots.Touch( P ); JumpBoots.Destroy(); } // bForceSpawn = false; } //----------------------------------------------------------------------------- function RemoveAllJumpBoots() { local ut_jumpboots JumpBoots; foreach AllActors( class'ut_jumpboots', JumpBoots ) { if( JumpBoots.Owner != None && (NumWarnings == 0) && (PlayerPawn(JumpBoots.Owner) != None) ) { JumpBoots.Owner.PlaySound( Sound'Botpack.ASMD.Vapour',, 8 ); } JumpBoots.ResetOwner(); JumpBoots.UsedUp(); } } //----------------------------------------------------------------------------- // Make sure everyone is using the correct weapon, ammo no matter when they // join the game or respawn. function ModifyPlayer( Pawn Other ) { if ( NextMutator != None ) { NextMutator.ModifyPlayer(Other); } SetInventory( Other ); if( NextKillInvisibilityTime > 0.0 ) { GiveInvisibilityTo( Other ); } if( NextKillDamageAmplifierTime > 0.0 ) { GiveDamageAmplifierTo( Other ); } if( NextKillJumpBootsTime > 0.0 ) { GiveJumpBootsTo( Other ); } if( StartHealth != 0 ) { Other.Health = StartHealth; } } //----------------------------------------------------------------------------- // Return true for any non-UT weapons and ammo (otherwise DMMutator will swap // these with UT equivalents). function bool AlwaysKeep( Actor Other ) { local bool bRetVal; bRetVal = false; if( Other.IsA('Weapon') && !Other.IsA('TournamentWeapon') ) { if( Other.IsA('Stinger') || Other.IsA('Rifle') || Other.IsA('Razorjack') || Other.IsA('Minigun') || Other.IsA('AutoMag') || Other.IsA('Eightball') || Other.IsA('FlakCannon') || Other.IsA('ASMD') || Other.IsA('GesBioRifle') || Other.IsA('DispersionPistol') ) { bRetVal = true; } } else if ( Other.IsA('Ammo') && !Other.IsA('TournamentAmmo') ) { if( Other.IsA('ASMDAmmo') || Other.IsA('RocketCan') || Other.IsA('StingerAmmo') || Other.IsA('RazorAmmo') || Other.IsA('RifleRound') || Other.IsA('RifleAmmo') || Other.IsA('FlakBox') || Other.IsA('Clip') || Other.IsA('ShellBox') || Other.IsA('Sludge') ) { bRetVal = true; } } else if ( Other.IsA('WeaponPowerUp') ) { bRetVal = true; } else if ( Other.IsA('UT_Jumpboots') ) { bRetVal = true; } else if ( NextMutator != None ) { bRetVal = NextMutator.AlwaysKeep(Other); } return bRetVal; } //----------------------------------------------------------------------------- // Only really here to support LastManStanding which Almost anything gets through at this point, although in some cases these will // be replaced with other actors with the first tick. function bool CheckReplacement( Actor Other, out byte bSuperRelevant ) { local bool bRetVal; bRetVal = true; /* if( bForceSpawn ) { bSuperRelevant = 1; bRetVal = true; } else if( Other.IsA('Weapon') && !KeepItem( Other ) ) { // Filter weapons by replacing them with the current weapon (if set) or by // removing them since some games (e.g. Last Man Standing) try to give // players weapons sometime after players join the game. if( CurrentWeaponIndex != -1 && FilteredWeaponClassStrings[CurrentWeaponIndex] != "" ) { ReplaceWith(Other, FilteredWeaponClassStrings[CurrentWeaponIndex]); bRetVal = false; } } */ if( bForceWeaponSpawn ) { bSuperRelevant = 1; } else if( Other.IsA('Weapon') && FilterWeapon(Weapon(Other)) ) { // Filter weapons by replacing them with the current weapon (if set) or by // removing them since some games (e.g. Last Man Standing) try to give // players weapons sometime after players join the game. if( CurrentWeaponIndex != -1 && FilteredWeaponClassStrings[CurrentWeaponIndex] != "" ) { ReplaceWith(Other, FilteredWeaponClassStrings[CurrentWeaponIndex]); } bRetVal = false; } return bRetVal; } //----------------------------------------------------------------------------- // No weapon by default -- this mutator hands out all weapons. function Class MyDefaultWeapon() { return None; } //----------------------------------------------------------------------------- Mou. ?o?s?,?,A x w%--v$o^sZ ]FBmF-]'-AV$Fa/!".F~{F-](-] [ //============================================================================= // NIUTConfigMenuItem. //============================================================================= class NIUTConfigMenuItem expands UMenuModMenuItem; // assumes 640x480 resolution for now -- only alternative is to go to property pages const SizeX = 624; const SizeY = 448; // Called when the menu item is chosen function Execute() { MenuItem.Owner.Root.CreateWindow(class'NIUTConfigMenu', (MenuItem.Owner.Root.WinWidth/2 - (SizeX/2)), (MenuItem.Owner.Root.WinHeight/2 - (SizeY/2)), SizeX, SizeY); } Pf . ?f?h?aA b `%I'I'#,$?,  U_fohn ^QaSQ-dK$7$G#0#@"9"? t -d'D,8?DlwB*w*a/!q.aB AH8-/8= w*%8FECA&m(w*%%A%wt* %w.*atqmGD$7w*::$ %w.*a  A7OG~}37$G#0dw* M::$ %w.*a  A0OG {z  2 0#@"9w*::$ %w.*a  AB9OGxwf19"? t6t  T 4x-( a/!" a/!Z a/! a/!) a/!! a/!( a/!+ a/! a/!& a/! a/!* a/!F-'* a/!. a/!J' a/!K a/!J a/!@ a/!5 a/!9 a/!p a/!0 a/!k a/!: a/!4-'I a/!L-'h a/!\-'w*-  - aBmA% -WBotpack.ChainSaw -CBotpack.Enforcer -jBotpack.ImpactHammer -gBotpack.MiniGun2 -fBotpack.PulseGun -eBotpack.Ripper -LBotpack.ShockRifle -YBotpack.SniperRifle -FBotpack.SuperShockRifle -@Botpack.UT_BioRifle -sBotpack.UT_Eightball -qBotpack.UT_FlakCannon -oBotpack.WarheadLauncher -yUnrealI.FlakCannon -|UnrealI.GESBioRifle -UnrealI.Minigun -IUnrealI.Razorjack -KUnrealI.Rifle -MUnrealShare.ASMD -_UnrealShare.AutoMag -SUnrealShare.DispersionPistol -RUnrealShare.Eightball -NUnrealShare.Stinger%!, {!w! *!ppppV: ExtraWeaponClassStrings[S] is invalid: !sServer is running NIUT. See www.planetunreal.com/niu for more infoppNIUT: S weapons%NIUT warning: No weapons specified in NIUT.ini (in the UT system folder)%Botpack.UT_Eightball&@%@ppS :  r-/D%l  ?$ :23>;<1-.=(8m70 9DlwB*lB%%%% &%&  V//============================================================================= // DummyArenaMutator. //============================================================================= class DummyArenaMutator extends Arena; /*============================================================================= Used for no other purpose than to put an Arena mutator into the chain so ammo will stay in LastManStanding NIUT games with weapons being cycled and no auto incrementing of ammo. If any other arena mutator is used, this should *not* be used (only one arena mutator at a time can be loaded). =============================================================================*/ function bool AlwaysKeep(Actor Other) { if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { return true; } pR VL?}{-R:wE *gEg{ppV: WeaponClassString is invalid in MaybeAddWeapon: E ]{ 6vw*.lXw* Ral78Jq!Uu%u YhSs* [f{J%J. ?,0?,@BAC. ?,`?,?,@BACDefaultsC!Restore default settings.,,% wCycle Weapons:If checked, specified weapons are cycled, otherwise everyone has all specified weapons at all times (and ammo is given out automatically).-/% yRandom Weapons:If checked and cycling weapons, weapons are selected randomly, otherwise weapons are selected in order.-L% VUse All Weapons:If checked and cycling weapons randomly, each weapon will be used once each time through the list.-Q,,%,D?,IMin Time Between Weapon Switches:Minimum time (seconds) server waits between weapon switches (when cycling weapons).%,D?,{Max Time Between Weapon Switches:Maximum time (seconds) server waits between weapon switches (when cycling weapons).%,D?,zTime Between Ammo Increments:Time (seconds) between ammo increments. Use 0.0 to disable (pickups become ammo). If set to 0.0 and weapons not cycled will default to 1.0.%,D?,yTime Between Health Increments:Time (seconds) server waits between health increments.%,D?,xHealth Increment Amount:Amount of health server will give to everyone when it is time to give out health.%,D?,wInitial Health:Health that everyone starts out with (if 0, uses default for pawns).%,D?,FMaximum Incremented Health:Maximum that health can be incremented to by server (if 0, uses default for pawns). Health vials still increment to 199.h,%,D?, RMinimum time (seconds) server waits between weapon switches (when cycling weapons).F%,D?, WMaximum time (seconds) server waits between weapon switches (when cycling weapons).E%,D?, MTime (seconds) server waits between giving out ammo to everyone (if 0.0, pickups become ammo for the current weapon). %,D?, ]Time (seconds) server waits between giving out health to everyone.G%,D?,`Amount of health server will give to everyone when it is time to give out health.A%,D?,_Health that everyone starts out with (if 0, uses default for pawns).&,%,D?,^Maximum that health can be incremented to by server (if 0, uses default for pawns). Health vials still increment to 199.%,,,x,,0%D?,|InitialAmount of ammo that the weapon starts out with.,0%D?,}MaxMaximum amount of ammo for the weapon (0 = default).,0%D?,~RateRate (amount per second) at which the weapon's ammo increments (if not cycling weapons or if AmmoIncrementRate is set).,,,x%D?,Bio Rifle Ammo:,0%D?,|P,0%D?,B`,0%D?, dU,,,x%D?,@Gun Ammo:,0%D?,{Q,0%D?,qa,0%D?, v^,,,x%D?,AFlak Cannon Ammo:,0%D?,er,0%D?,J[,0%D?, \S,,,x%D?,BPulse Gun Ammo:,0%D?,Dk,0%D?,XT,0%D?, cZ,,,x%D?,CRedeemer Ammo:,0%D?,Ov,0%D?,tV,0%D?, PM,,,x%D?,DRifle Ammo:,0%D?,rO,0%D?,o],0%D?, QV,,,x%D?,ERipper Ammo:,0%D?,ln,0%D?,aU,0%D?, kT,,,x%D?,vRocket Launcher Ammo:,0%D?,Ju,0%D?,Zd,0%D?, [N,,,x%D?,GShock Rifle Ammo:,0%D?,Ep,0%D?,A\,0%D?, CY,,,x%D?,HStinger Ammo:,0%D?,R,0%D?,zb,0%D?, }W,,x,,,P%D?, gMin DelayMin time (seconds) before power up is given to everyone (0.0 disables power up).,P%D?, hMax DelayMax time (seconds) before power up is given to everyone (if enabled).,P%D?, iMin DurationMin duration (seconds) of power up (if enabled).,P%D?, jMax DurationMax duration (seconds) of power up (if enabled).,,,x%D?,kDamage Amplifier:,P%D?, n#,P%D?, m@,P%D?, j{,P%D?, iz,,,x%D?,lJumpBoots:,P%D?, g",P%D?, c?,P%D?, `x,P%D?, ^w,,,x%D?,mInvisibility:,P%D?, x$,P%D?, uG,P%D?, s~,P%D?, p}D?,?,,,% aBio RifleIf checked Bio Rifle will be used.-@% YChainsawIf checked Chainsaw will be used.-W% XEnforcerIf checked Enforcer will be used.-C% [Flak CannonIf checked Flak Cannon will be used.-q% TImpact HammerIf checked Impact Hammer will be used.-j% SMinigunIf checked Minigun will be used.-g% UPulse GunIf checked Pulse Gun will be used.-f% PRedeemerIf checked Redeemer will be used.-o% ORipperIf checked Ripper will be used.-e% NRocket LauncherIf checked Rocket Launcher will be used.-s% \Shock RifleIf checked Shock Rifle will be used.-L% ISniper RifleIf checked Sniper Rifle will be used.-Y% KSuper Shock RifleIf checked Super Shock Rifle will be used.-F % LUnrealI ASMD*If checked UnrealI ASMD will be used (*only works in singleplayer games).-M% fUnrealI Auto Mag*If checked UnrealI Auto Mag will be used (*only works in singleplayer games).-_% hUnrealI Dispersion Pistol*If checked UnrealI Dispersion Pistol will be used (*only works in singleplayer games).-S% HUnrealI Eightball*If checked UnrealI Eightball will be used (*only works in singleplayer games).-R% HUnrealI Flak Cannon*If checked UnrealI Flak Cannon will be used (*only works in singleplayer games).-y% GUnrealI GES Bio Rifle*If checked UnrealI GES Bio Rifle will be used (*only works in singleplayer games).-|% DUnrealI Minigun*If checked UnrealI Minigun will be used (*only works in singleplayer games).-% ZUnrealI Razorjack*If checked UnrealI Razorjack be used (*only works in singleplayer games).-I% @UnrealI Rifle*If checked UnrealI Rifle will be used (*only works in singleplayer games).-K% ~UnrealI Stinger*If checked UnrealI Stinger will be used (*only works in singleplayer games).-N ey}vEa#yz]\~ J 120i 48g[Ybn-/w--Ly--QV-FLRyDELWyD LMyDGL]yDAL`%&L_%'%L^%'PL|%`LB%ULdBQL{%aLq%^LvBrLe%[LJ%SL\BkLD%TLX%ZLcBvLO%VLt%MLPBOLr%]Lo%VLQBnLl%ULa%TLkBuLJ%dLZ%NL[BpLE%\LA%YLCBRL%bLz%WL}B-@a--WY--CX--q[--jT--gS--fU--oP--eO--sN--L\--YI--FK--ML--_f--Sh--RH--yH--|G--D--IZ--K@--N~-#LnyD@LmyD{LjyDzLiyD"LgyD?LcyDxL`yDwL^yD$LxyDGLuyD~LsyD}LpyD-[ J 120l?w-'y-'V-'R75.000000W75.000000M0.000000]1.000000` 5_ 0^ 0| 50B 100d0.250000{ 100q 199v5.000000e 12J 50\0.200000D 50X 199c2.000000O 0t 1P0.050000r 12o 50Q0.500000l 25a 75k1.500000J 12Z 48[0.250000E 12A 50C0.670000 50z 200}5.000000a-(Y-(X-([-(T-(S-'U-(P-(O-'N-'\-(I-'K-(L-(f-(h-(H-(H-(G-(D-(Z-(@-(~-(n240.000000m240.000000j30.000000i30.000000g0.000000c0.000000`15.000000^15.000000x0.000000u0.000000s30.000000p30.000000 nB/F8Brr60Bcc6B L 99999.0`wbqj$Աln-oXR8Xpp60Xqq6X ru@vB' t|^ /D|?YX m 80|H=p%&6h%-L-Q:i%%Uhi$ r*pV: CurrentDefaultWeapon is None!-L%XpV: ExtraWeaponsClassStrings contain no valid weapon(s)!pppppNIUT: U (S) -- selected: V$8FE Q$i+/a0 r*w ta/!DBotpack.HealthVialar a/!LUnrealShare.WeaponPowerUpa]r*!r Za/!DBotpack.HealthVialaVa10)r /a0 ('r*a/!C$.&10 y_|eN_Kq:K,qw.*qw.*.H_:K, w.*w.*.H:K,_ C?  O$ w* O(  624A 448Biw K?,?p,?,?,DC W'WW-VPVVVrVLV"VQV}VxsVHV\VsVoWnV_VNrEvfV.r}VVV`VzV^s]WjVGVRrRV\VSVmVvr[`VVqrUVXrZrd\j\OUX\^VKVJV_rbVEVUVMV[``rArNZcaDVnVarBacV{sYVVNr[r^\i-SuVO`a`IVSVBVF`B`|`{Ws~V[`Ys``}rS`B`Avn`VvW^VF`R`SvrrW\SrT`i`aUVVOVP``BVFVoVTWya]-SWvZY-X;Tq;U ;T K\MWNOep rIe~]zK;^ Y=Ue|s|e@cUMs[NMhrv^u DP_P[_^v lCexq Fc]R]e _X[kG]y{ GU{STz`m} zyFK SG_ClAy@ F=uRK_F\lIMzKtG@tTI aJ may| FH RB ^C jOavRaCE{Pz ]wi~ vA BE NG ZF fD rL~OKV Xbd;\sWAX NlZDgCY tQu @CML~dY^fysx@;mMN[zh]uwB@O\[irv;lCvQ\^pkkxjEsRb_glfycF;kSmagnf{eHtUubdoH|xIy VSb[oG|mIMVlc@ pK|LIgVocopP }ZIpVQ cRoq|kIM VoJbco;j|aQJjWU d;Mpd~;iKeYhftsx @FL;nY] gwsc@lMuZngbttJAiN;x[;wi;hwYe E;QQ~b^;Pl;uz=bH;OV;bd;gr;K@;NN;L\;Mj;Lx;tF;sT;Kb;Jp;r~;IL;fZ;ph;Hv;oD;GR;e`;ln;F|;mJ;~X;df;at;}B;SP;|^;Rl;{z;cH;zV;Pd;yrYz@;ON;N\;Hj;vx;IF;JT;vb;Ep;D~;FL;qZ;wh;Bv;AD;CR;n`;xn;|;~J;QX;@f;Gt;yB;|P;{^;zl;}zFV HoHTLaP` n[Wzap G[YSGY`PYmPWzczGGWTDTaXWntY{tHHoYUXYb~ocY ~;^J;tX;sf;rt;qB;pP;T^;Ul;Vz;WH;XV;Yd;Zr;[@;\N;]\;uj;_x;`F;oT;|b_AqEMrOMKMLzYN@g\C uaPAe NtZ_gY\tGXByYOyH\XZ ilQ ugsAgIOXX\[T i[nu[h B[XNPn[PXhPTuPh B;N;@\;Aj;Bx;CF;DT;Eb[Zp[X}Gn JGXVPXcGh pGZ|PZIX_ VXnbXXogb|g_K`PNXyJhku`{`Dg [3sg;w4FZ=g `yl 8eQ] `n;N{uM6^ Z;h xQB w4wS;k JM T Qa;`r%CR2gU\e|A}I1}F\RCw4fQ;UwBAL>w4f M;SsʙaeFΙkBjj]g Tqw4a` CAYgD OQS!`;{huAe~ i;}4udgi;f w;g A{eK;Yf%X;i ~;?jH;/ErNwbdEwg iog u;EAw\FwzTqB!btg C;2O;j A=~K$lIyg u;|BAg Cq4O>l C>k L>iOV[Public] Object=(Name=NIUT124.NIUTMutator,Class=Class,MetaClass=Engine.Mutator,Description="NIUT124, NIUT V1.24: Server controls weapons, gives out ammo and/or turns pickups into ammo or health vials (www.planetunreal.com/niu).") Object=(Name=NIUT124.NIUTConfigMenuItem,Class=Class,MetaClass=UMenu.UMenuModMenuItem) Object=(Name=NIUT124.DummyArenaMutator,Class=Class,MetaClass=Engine.Mutator,Description="DAM, DummyArena: use with some game types (e.g. LastManStanding) to force ammo to stay etc.") Preferences=(Caption="Mutators",Parent="Advanced Options") Preferences=(Caption="NIUT124",Parent="Mutators",Class=NIUT124.NIUTMutator,Immediate=True) [NIUT124.NIUTMutator] bRandomWeapons=True bUseAllWeapons=True bCycleWeapons=False bUseChainSaw=False bUseEnforcer=False bUseImpactHammer=False bUseMiniGun=True bUsePulseGun=False bUseRipper=False bUseShockRifle=False bUseSniperRifle=False bUseSuperShockRifle=False bUseBioRifle=False bUseRocketLauncher=True bUseFlakCannon=False bUseRedeemer=False bUseUnrealIFlakCannon=False bUseUnrealIGESBioRifle=False bUseUnrealIMinigun=False bUseUnrealIRazorjack=False bUseUnrealIRifle=False bUseUnrealIASMD=False bUseUnrealIAutoMag=False bUseUnrealIDispersionPistol=False bUseUnrealIEightball=False bUseUnrealIStinger=False ExtraWeaponClassStrings[0]= ExtraWeaponClassStrings[1]= ExtraWeaponClassStrings[2]= ExtraWeaponClassStrings[3]= ExtraWeaponClassStrings[4]= ExtraWeaponClassStrings[5]= ExtraWeaponClassStrings[6]= ExtraWeaponClassStrings[7]= ExtraWeaponClassStrings[8]= ExtraWeaponClassStrings[9]= ExtraWeaponClassStrings[10]= ExtraWeaponClassStrings[11]= ExtraWeaponClassStrings[12]= ExtraWeaponClassStrings[13]= ExtraWeaponClassStrings[14]= ExtraWeaponClassStrings[15]= ExtraWeaponClassStrings[16]= ExtraWeaponClassStrings[17]= ExtraWeaponClassStrings[18]= ExtraWeaponClassStrings[19]= ExtraWeaponClassStrings[20]= ExtraWeaponClassStrings[21]= ExtraWeaponClassStrings[22]= ExtraWeaponClassStrings[23]= ExtraWeaponClassStrings[24]= ExtraWeaponClassStrings[25]= ExtraWeaponClassStrings[26]= ExtraWeaponClassStrings[27]= ExtraWeaponClassStrings[28]= ExtraWeaponClassStrings[29]= ExtraWeaponClassStrings[30]= ExtraWeaponClassStrings[31]= TimeBetweenWeaponSwitchesMin=15.000000 TimeBetweenWeaponSwitchesMax=15.000000 TimeBetweenAmmoIncrements=0.000000 WarningSound=Sound'Botpack.Pickups.UTSuperHeal' WarningSoundRepeats=3 HealthIncrementSound=None HealthIncrementAmount=5 StartHealth=0 MaxHealth=0 TimeBetweenHealthIncrements=1.000000 InvisibilityDelayMin=0.000000 InvisibilityDelayMax=0.000000 InvisibilityDurationMin=10.000000 InvisibilityDurationMax=10.000000 DamageAmplifierDelayMin=45.000000 DamageAmplifierDelayMax=45.000000 DamageAmplifierDurationMin=45.000000 DamageAmplifierDurationMax=45.000000 JumpBootsDelayMin=0.000000 JumpBootsDelayMax=0.000000 JumpBootsDurationMin=15.000000 JumpBootsDurationMax=15.000000 InitialRedeemerAmmo=0 InitialRocketAmmo=12 InitialFlakAmmo=12 InitialShockAmmo=12 InitialRifleAmmo=12 InitialPulseAmmo=50 InitialRipperAmmo=25 InitialBioAmmo=50 InitialGunAmmo=100 InitialStingerAmmo=50 RateRedeemerAmmoPerSec=0.050000 RateRocketAmmoPerSec=0.000000 RateFlakAmmoPerSec=0.200000 RateShockAmmoPerSec=0.670000 RateRifleAmmoPerSec=0.500000 RatePulseAmmoPerSec=2.000000 RateRipperAmmoPerSec=1.500000 RateBioAmmoPerSec=0.250000 RateGunAmmoPerSec=0.000000 RateStingerAmmoPerSec=5.000000 MaxRedeemerAmmo=1 MaxRocketAmmo=48 MaxFlakAmmo=50 MaxShockAmmo=50 MaxRifleAmmo=50 MaxPulseAmmo=199 MaxRipperAmmo=75 MaxBioAmmo=100 MaxGunAmmo=199 MaxStingerAmmo=200 InitialOtherAmmo=50 RateOtherAmmoPerSec=5.000000 MaxOtherAmmo=200 System\Manifest.iniFSystem\Manifest.intFHelp\niut.txt4System\niut124.u7vSystem\Niut.intiLSystem\NIUT.iniN Z[v