[Setup] Product=Blink Mutator Pack Version=100 Archive=bmp.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=umodINIGroup Group=Blink Mutator PackGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=527,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=506,Flags=3) [umodINIGroup] AddIni=UnrealTournament.ini,Engine.GameEngine.ServerPackages=BMP [Blink Mutator PackGroup] File=(Src="Help\BMP Readme.txt",Size=5327) File=(Src=System\BMP.int,Size=1302) File=(Src=System\BMP.u,Size=44513) [Setup] LocalProduct=Blink Mutator Pack ReadMe=Help\BMP Readme.txt SetupWindowTitle=Blink Mutator Pack AutoplayWindowTitle=Blink Mutator Pack Options ProductURL=http://www.warmage.com VersionURL=http://www.warmage.com Developer=Blink Software DeveloperURL=http://www.warmage.com [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ ================================================================ Title : Blink Mutator Pack Version : 1.00 Release Date : 31st January 2000 Filename : bmp.zip Author(s) : Geoffrey "Quicken" Dunn Email Address : gdunn@backmeup.net.au Web Page : http://www.warmage.com Description : Six new mutators for UnrealTournament Where to get this map : http://www.warmage.com/ Other work by author : The map Firedrop.unr for Unreal The mod Tag Deathmatch for UnrealTournament Additional Credits to : Epic Megagames (http://unreal.epicgames.com/) Blink Software (http://www.warmage.com/) ================================================================ --- Play Information --- Game : Unreal Tournament Mod changes : Includes six new Mutators Difficulty Settings : No New Sounds : No New Graphics : No NewUnrealScript : Yes External DLLs : No Known bugs : There's a couple of odd things that were just not worth investigating. If the serverpackages line is not in the UT ini file (basically if you install with less than UT 4.05) then I have seen the hud stuff up on clients when using keep/have stuff. In that while they have weapons none show up as being available on the hud except the current. Seems downloading the package got past that but I have no idea how. In theory you should not need to have it set to download to work (since there's no sound, graphics, or client side code). Other odd thing is I have seen (again only on network play) with unlimited ammo and unlimited redeemers being unable to pick up a discarded redeemer. Usually the one I died with. Any other weapon I can pick up. Again, very odd but no big deal. --- Construction --- Editor(s) used : UCC, UnrealEd, UModWizard and MS-Studio Base : Scratch Construction Time : About 4 person days Installation ------------ It's a umod so double click and UnrealTournament should take care of the install for you. If you've got problems with your umod association try running something like "c:\UnrealTournament\System\Setup.exe bmp.umod" Once installed the new mutators will be available via the menu system for practice and multiplayer games. And you can bind a key for the Swap Hands mutator via the menu item. Extended description: -------------------- There are Six mutators total in here so mix and match as you feel fit. Also while you can bin a key to the Swap Hands mutator via the menu item (Mod->Swap Hands) there are more options available via the advanced options. Although I'm not going to explain them here as they are either obvious or involve some rather complex mathematics. Swap Hands - Allows the player to bind a key to allow them to swap between left, right and centre hand holding positions during game. Mainly for those that like to lean up against a corner and shoot around it. Bind a key to "mutate SwapHands"! Same Team! - Changes team damage to occur to the person DOING the damage rather than the victim. Great to make people cautious about who they shoot without the game being ruined by an annoying git. It's modified by team damage so if team damage is set to 0 you'll see no effect. Unlimited Ammo - Ups the ammo so you'll never run out again. Tends to be silly but can be good to LMS or some fun with unlimited redeemers turned on via the options :D Keep Stuff - Respawn with the weapons you died with (unless you suicide). Have Stuff - Respawn with the weapons and powerups your killer had! Great for helping balance out the game FatGun - Much the same as Fatboy except the better you play the fatter your gun. Author's Notes -------------- Feel free to drop any comments, suggestions or whatever to me. Also a special thanks to Raven (jmayo@spot.com.au) for helping me out when I _really_ got stuck as well as for the "Keep/Have Stuff" concept. And thanks to DarkReign (mhano@hotmail.com) for being a nice tester :) Developer's Notes ----------------- Not going to say much here except it was fun to find just how much (and little) I can get away with in a mutator. Some of them are pretty serious hacks so I don't recommend them as a base even though they are fairly stable and do what they do as best as possible. Copyright / Permissions ----------------------- This mod is copyright (c)2000 by Blink Software. Authors MAY use this mod as a base to build new mods. You are NOT allowed to commercially exploit this mod, i.e. put it on a CD or any other electronic medium that is sold for money without my explicit permission! You MAY distribute this level through any electronic network (internet, FIDO, local BBS etc.), provided you include this file and leave the archive intact. ---------------------- UnrealTournament (c)1999 Epic Megagames, Inc. All Rights Reserved. Distributed by GT Interactive Software, Inc. under license. UnrealTournament and the UnrealTournament logo are registered trademarks of Epic Megagames, Inc. All other trademarks and trade names are properties of their respective owners. [Public] Object=(Name=BMP.SwapHands,Class=Class,MetaClass=Engine.Mutator,Description="Swap Hands,Allows swapping of weapon hand during game.") Object=(Name=BMP.FatGun,Class=Class,MetaClass=Engine.Mutator,Description="FatGun,The more you kill the bigger the gun.") Object=(Name=BMP.SameTeam,Class=Class,MetaClass=Engine.Mutator,Description="Same Team!,Team damage is done to the person doing the damage rather than the target.") Object=(Name=BMP.UnlimitedAmmo,Class=Class,MetaClass=Engine.Mutator,Description="Unlimited Ammo,Never run out of ammo on any weapon (except the redeemer).") Object=(Name=BMP.KeepStuff,Class=Class,MetaClass=Engine.Mutator,Description="Keep Stuff,Respawn with the weapons and ammo you died with.") Object=(Name=BMP.HaveStuff,Class=Class,MetaClass=Engine.Mutator,Description="Have Stuff,Respawn with the weapons, ammo and powerups of your killer!") Object=(Name=BMP.BMPModMenuItem,Class=Class,MetaClass=UMenu.UMenuModMenuItem) Preferences=(Caption="Mutators",Parent="Advanced Options") Preferences=(Caption="BMP-UnlimitedAmmo",Parent="Mutators",Class=BMP.UnlimitedAmmo,Immediate=True) Preferences=(Caption="BMP-FatGun",Parent="Mutators",Class=BMP.FatGun,Immediate=True) Preferences=(Caption="BMP-SwapHands",Parent="Mutators",Class=BMP.SwapHands,Immediate=True) *E@gof;- -NoneLocalizedKeyNameSystemCoreBMPEngineConsoleCommandFatGunWeaponProcessMenuKeySetTextCreateControlChangeSetHand ResizeGuns SwapHands ScoreKill SetHelpTextWarheadLauncher ModifyPlayerUWindow PlayerPawnUnlimitedAmmo WarHeadAmmoBotLoadExistingKeysSetKeyUMenu ActorClassAmmo HaveStuff PickupQuery KeepStuffGetPlayerLead GiveAmmoGiveToSetFontSetSwitchPriority PreBeginPlayPostBeginPlaySpawnNotificationSwitchToBestWeaponRenderOverlays TakeDamageTimer AliasName ClientClassCreated BeforePaintMinPlayerViewScaleMaxPlayerViewScale MinScale MaxScale IncrementBMPMainWindowBMPModMenuItem IsRelevantbHiddenPutDownHandlePickupQuery Activate AllowCenter AddInventory BecomeItemFatGunSpawnNotifyShouldRespawnNotify MenuCaption MenuHelpMutate SameTeamUnlimitedAmmoSpawnNotifyFatGunInvTrackerMutatorTakeDamageKeyDownDrawStatusIconAt ExplainationBMPDialogClientWindowRaiseUpUDamage bIsItemGoalBotpackCustomizeHelpExecute LabelNameRegisterDamageMutator WindowTitlePlayerViewScalePickupViewScaleOtherKiller Handedness TimeDilationThirdPersonScale HitLocation bCarriedItem bIsPlayer SpawnNotifyTeamGameReplicationInfo Inventory actualDamageGame InstigatorOwnerposbSuperRelevantKeyaPlayer Momentum markedItem MutateStringPickupInvChargeArmorAbsorption LevelInfoItemCopyInventorySpot AmmoType AmmoAmount DrawScale RespawnTime ScriptTextPlayerReplicationInfo bTeamGame PRIArrayScoreMutatorPRIClassPackageVictimj TextBufferUWindowPulldownMenuItemUWindowSmallCloseButtonUWindowFramedWindowUWindowRootWindowUWindowDialogControlUWindowButtonUWindowWindowUWindowPulldownMenubIgnoreMDoubleClickbIgnoreRDoubleClickGetPlayerOwnerSetAcceptsFocus CreateWindow GameInfo bDisabledbAcceptsFocus WinHeight WinWidthRoot CloseButtonPlayers OrStringGRIAliasObject FunctionVectorStructSenderCanvasPickupAmmoCountUMenuRaisedButtonUMenuLabelControlUMenuDialogClientWindowUMenuModMenuItemMaxAmmo Initialized RealKeyName BoundKey1 BoundKey2 bPolling MenuItemanActor DamageTypeTournamentPickup FinalCount StrPropertylead AmmocountStructPropertyClassProperty NamePropertyScaleObjectPropertyPawn ReturnValueFloatPropertyALevelActorX BoolPropertySizer halfSizerC AllowHiddenEYWKeyNamei InvTracker IntProperty PlayerScore AverageScore ByteProperty Initialised InstagatedByRedeemerUnlimited TempStore ChargeCount ArmourCountExplainationLabelbIgnoreLDoubleClick KeyButton myMarkerKeyNok@  @/4R  7$@\XJE "lj@=j@җOѸBѸBѸBR:)-FaT1,EfbG21SfXu6Rù9 }j@j@j@j@j@j@tttttttttttj@P8OS@`C M @ fW@h@KI@K@@(#bJ 8R@e@xQ@N@jS@@l]^2@g5B{F ceom"tt"ѸBѸBѸB"ttuI?dF?_mtt9 }t9 }j@j@j@j@j@j@tttttttttttj@@nhL2g|`ps֐s֐s֐s֐s֍s֐s֐s֍᱘᱘᱘᱘᱘᱘s֐s֐s֐s֐sK]Key configuration:  LeftMouse RightMouseCancel  MiddleMouse  Unknown05  Unknown06  Unknown07  Backspace Tab Unknown0A Unknown0B Unknown0C Enter  Unknown0E  Unknown0FShiftCtrlAltPause  CapsLock  Unknown15  Unknown16  Unknown17  Unknown18  Unknown19  Unknown1AEscape  Unknown1C  Unknown1D  Unknown1E  Unknown1F Space!PageUp " PageDown#End$Home%Left&Up'Right(Down)Select*Print +Execute , PrintScrn-Insert.Delete/Help00112233445566778899 : Unknown3A ; Unknown3B < Unknown3C = Unknown3D > Unknown3E ? Unknown3F @ Unknown40AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ [ Unknown5B \ Unknown5C ] Unknown5D ^ Unknown5E _ Unknown5F `NumPad0 aNumPad1 bNumPad2 cNumPad3 dNumPad4 eNumPad5 fNumPad6 gNumPad7 hNumPad8 iNumPad9 j GreyStar k GreyPlus l Separator m GreyMinusn NumPadPeriod o GreySlashpF1qF2rF3sF4tF5uF6vF7wF8xF9yF10zF11{F12|F13}F14~F15F16F17F18F19F20F21F22F23F24 Unknown88 Unknown89 Unknown8A Unknown8B Unknown8C Unknown8D Unknown8E Unknown8F NumLock ScrollLock Unknown92 Unknown93 Unknown94 Unknown95 Unknown96 Unknown97 Unknown98 Unknown99 Unknown9A Unknown9B Unknown9C Unknown9D Unknown9E Unknown9FLShiftRShift LControl RControl UnknownA4 UnknownA5 UnknownA6 UnknownA7 UnknownA8 UnknownA9 UnknownAA UnknownAB UnknownAC UnknownAD UnknownAE UnknownAF UnknownB0 UnknownB1 UnknownB2 UnknownB3 UnknownB4 UnknownB5 UnknownB6 UnknownB7 UnknownB8 UnknownB9 SemicolonEqualsCommaMinusPeriodSlashTilde UnknownC1 UnknownC2 UnknownC3 UnknownC4 UnknownC5 UnknownC6 UnknownC7Joy1Joy2Joy3Joy4Joy5Joy6Joy7Joy8Joy9Joy10Joy11Joy12Joy13Joy14Joy15Joy16 UnknownD8 UnknownD9 UnknownDA LeftBracket Backslash RightBracket SingleQuote UnknownDFJoyXJoyYJoyZJoyRMouseXMouseYMouseZMouseWJoyUJoyV UnknownEA UnknownEB MouseWheelUp̀MouseWheelDown Unknown10E Unknown10F JoyPovUp JoyPovDown JoyPovLeft JoyPovRight UnknownF4 UnknownF5AttnCrSelExSelErEofPlayZoomNoNamePA1 OEMClearS] SwapHands,]mutate SwapHandsQ]KIClick the blue rectangle and then press the key to bind to this control.D@v52i/~M-gU= Swap Hands<=@],/****************************************************************************** HaveStuff UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class HaveStuff expands Mutator; var() localized class TempStore[1024]; var localized int AmmoCount[1024]; var localized int ChargeCount[1024]; var localized int ArmourCount[1024]; var localized Pawn Players[32]; function ScoreKill(Pawn Killer, Pawn Other) { local Inventory Inv; local int i, j; // Find i first i = 0; while (i<32 && Players[i] != None) i++; if (i == 32) log ("Over 32 players"); else if (Killer != None && Other != None && Other.bIsPlayer && Killer.bIsPlayer && Killer != Other) { // Store all their inventory weapons for later use Players[i] = Other; for (j=0;j<32;j++) TempStore[(i*32)+j] = class'Engine.Inventory'; j = 0; for (Inv = Killer.Inventory; Inv != None && j<32; Inv = Inv.Inventory) { // Store class if (!Inv.IsA('Ammo')) { TempStore[(i*32)+j] = Inv.class; if (Inv.IsA('Weapon') && Weapon(Inv).AmmoType != None) AmmoCount[(i*32)+j] = Weapon(Inv).AmmoType.AmmoAmount; else AmmoCount[(i*32)+j] = 0; ChargeCount[(i*32)+j] = Inv.Charge; ArmourCount[(i*32)+j] = Inv.ArmorAbsorption; // Oh why oh why can't UDamage just use charge? if (Inv.IsA('UDamage')) ChargeCount[(i*32)+j] = (UDamage(Inv).FinalCount + 1) * 10; j++; } } } Super.ScoreKill(Killer, Other); } function ModifyPlayer(Pawn Other) { local int i, j; local Inventory Copy; if (Other.bIsPlayer) { for (i=0; i<32; i++) { if (Players[i] == Other) { // Give back their stuff j = 0; while (j<32 && TempStore[(i*32)+j] != class'Engine.Inventory') { // Create and store the weapon Copy = spawn(TempStore[(i*32)+j],Other); if (Copy != None) { Copy.RespawnTime = 0.0; if (Level.Game.PickupQuery(Other, Copy)) { Copy.GiveTo(Other); if (Copy.IsA('Weapon')) { Weapon(Copy).GiveAmmo(Other); // Set the ammo count now Weapon(Copy).AmmoType.AmmoAmount = AmmoCount[(i*32)+j]; Weapon(Copy).SetSwitchPriority(Other); } Copy.Charge = ChargeCount[(i*32)+j]; Copy.ArmorAbsorption = ArmourCount[(i*32)+j]; Copy.Activate(); } else { Copy.Destroy(); } } j++; } Other.SwitchToBestWeapon(); Players[i] = None; break; } } } Super.ModifyPlayer(Other); } `V/****************************************************************************** BMPDialogClientWindow UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class BMPDialogClientWindow expands UMenuDialogClientWindow; var UWindowSmallCloseButton CloseButton; var UMenuLabelControl ExplainationLabel; var localized string Explaination; var localized string LocalizedKeyName[255]; var string RealKeyName[255]; var int BoundKey1; var int BoundKey2; var UMenuLabelControl KeyName; var UMenuRaisedButton KeyButton; var localized string LabelName; var string AliasName; var bool bPolling; var localized string OrString; var localized string CustomizeHelp; function Created() { bIgnoreLDoubleClick = True; bIgnoreMDoubleClick = True; bIgnoreRDoubleClick = True; Super.Created(); SetAcceptsFocus(); ExplainationLabel = UMenuLabelControl(CreateControl(class'UMenuLabelControl', 8, 16, 128, 1)); ExplainationLabel.SetText(Explaination); ExplainationLabel.SetHelpText(CustomizeHelp); ExplainationLabel.SetFont(F_Normal); KeyName = UMenuLabelControl(CreateControl(class'UMenuLabelControl', 16, 48, 64, 1)); KeyName.SetText(LabelName); KeyName.SetHelpText(CustomizeHelp); KeyName.SetFont(F_Normal); KeyButton = UMenuRaisedButton(CreateControl(class'UMenuRaisedButton', 96, 48, 128, 1)); KeyButton.SetHelpText(CustomizeHelp); KeyButton.bAcceptsFocus = False; KeyButton.bIgnoreLDoubleClick = True; KeyButton.bIgnoreMDoubleClick = True; KeyButton.bIgnoreRDoubleClick = True; CloseButton = UWindowSmallCloseButton(CreateControl(class'UWindowSmallCloseButton', WinWidth - 52, WinHeight - 20, 48, 16)); // Setup all elements by using the configs LoadExistingKeys(); } function LoadExistingKeys() { local int I, pos; local string KeyName; local string Alias; BoundKey1 = 0; BoundKey2 = 0; for (i=0; i<255; i++) { KeyName = GetPlayerOwner().ConsoleCommand( "KEYNAME "$i ); RealKeyName[i] = KeyName; if ( KeyName != "" ) { Alias = GetPlayerOwner().ConsoleCommand( "KEYBINDING "$KeyName ); if ( Alias != "" ) { pos = InStr(Alias, " "); if ( pos != -1 ) { if( !(Left(Alias, pos) ~= "taunt") && !(Left(Alias, pos) ~= "getweapon") && !(Left(Alias, pos) ~= "viewplayernum") && !(Left(Alias, pos) ~= "button") && !(Left(Alias, pos) ~= "mutate")) Alias = Left(Alias, pos); } if ( AliasName ~= Alias && AliasName != "None" ) { if ( BoundKey1 == 0 ) BoundKey1 = i; else if ( BoundKey2 == 0) BoundKey2 = i; } } } } } function BeforePaint(Canvas C, float X, float Y) { if ( BoundKey1 == 0 ) KeyButton.SetText(""); else if ( BoundKey2 == 0 ) KeyButton.SetText(LocalizedKeyName[BoundKey1]); else KeyButton.SetText(LocalizedKeyName[BoundKey1]$" or "$LocalizedKeyName[BoundKey2]); } function SetKey(int KeyNo, string KeyName) { if ( BoundKey1 != 0 ) { // if this key is already chosen, just clear out other slot if(KeyNo == BoundKey1) { // if 2 exists, remove it it. if(BoundKey2 != 0) { GetPlayerOwner().ConsoleCommand("SET Input "$RealKeyName[BoundKey2]); BoundKey2 = 0; } } else if(KeyNo == BoundKey2) { // Remove slot 1 GetPlayerOwner().ConsoleCommand("SET Input "$RealKeyName[BoundKey1]); BoundKey1 = BoundKey2; BoundKey2 = 0; } else { // Clear out old slot 2 if it exists if(BoundKey2 != 0) { GetPlayerOwner().ConsoleCommand("SET Input "$RealKeyName[BoundKey2]); BoundKey2 = 0; } // move key 1 to key 2, and set ourselves in 1. BoundKey2 = BoundKey1; BoundKey1 = KeyNo; GetPlayerOwner().ConsoleCommand("SET Input"@KeyName@AliasName); } } else { BoundKey1 = KeyNo; GetPlayerOwner().ConsoleCommand("SET Input"@KeyName@AliasName); } } function ProcessMenuKey( int KeyNo, string KeyName ) { if ( (KeyName == "") || (KeyName == "Escape") || ((KeyNo >= 0x70 ) && (KeyNo <= 0x79)) // function keys || ((KeyNo >= 0x30 ) && (KeyNo <= 0x39))) // number keys return; SetKey(KeyNo, KeyName); } function Notify(UWindowDialogControl C, byte E) { local int I; Super.Notify(C, E); switch(E) { case DE_Click: if (bPolling) { bPolling = False; KeyButton.bDisabled = False; if(C == KeyButton) { ProcessMenuKey(1, RealKeyName[1]); return; } } if (UMenuRaisedButton(C) != None) { bPolling = True; KeyButton.bDisabled = True; } break; case DE_RClick: if (bPolling) { bPolling = False; KeyButton.bDisabled = False; if(C == KeyButton) { ProcessMenuKey(2, RealKeyName[2]); return; } } break; case DE_MClick: if (bPolling) { bPolling = False; KeyButton.bDisabled = False; if(C == KeyButton) { ProcessMenuKey(4, RealKeyName[4]); return; } } break; } } function KeyDown( int Key, float X, float Y ) { if (bPolling) { ProcessMenuKey(Key, RealKeyName[Key]); bPolling = False; KeyButton.bDisabled = False; } } 6Lt%0, w8*R, Over 32 playersw * wL* w L -8 %, , 6 % w* , a/!a/!, 6w.*, M., M%L  mA2 p]"Jl9 }j@Rùj@j@ttѸBtj@j@j@j@9 }9 }9 }9 }j@j@j@j@ttѸBj@j@j@8 j@YVqrGltt<C/****************************************************************************** BMPModMenuItem UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class BMPModMenuItem expands UMenuModMenuItem; function Execute() { MenuItem.Owner.Root.CreateWindow(class'BMPMainWindow', 128, 128, 256, 128); } rl62sѯͷ;aGնmo B] &Swap HandsC]$#Options for the Swap Hands mutatorzZ [2 @ ZR%?;?&?;?,?&%??%;?&??%;?,?&??WWSSNN++RRZ>w*'a/!-? g/****************************************************************************** FatGunSpawnNotify UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class FatGunSpawnNotify expands SpawnNotify; simulated event Actor SpawnNotification(Actor anActor) { local Weapon W; local Inventory Inv; local float Sizer, halfSizer; W = Weapon(anActor); if (W != None && Pawn(W.Owner) != None && Pawn(W.Owner).bIsPlayer) { // Set according to lead for (Inv = Pawn(W.Owner).Inventory; Inv != None; Inv = Inv.Inventory) { if (Inv.IsA('Weapon') && Inv != W) { Sizer = Inv.ThirdPersonScale / Inv.default.ThirdPersonScale; halfSizer = Inv.PlayerViewScale / Inv.default.PlayerViewScale; if (W.bCarriedItem) W.DrawScale = W.default.PlayerViewScale * halfSizer; else W.DrawScale = W.default.ThirdPersonScale * Sizer; W.PickupViewScale = W.default.PickupViewScale * Sizer; W.ThirdPersonScale = W.default.ThirdPersonScale * Sizer; W.PlayerViewScale = W.default.PlayerViewScale * halfSizer; /* if (Sizer > 1) W.PlayerViewOffset.Z = W.default.PlayerViewOffset.Z - (10 / Sizer); else W.PlayerViewOffset.Z = W.default.PlayerViewOffset.Z; */ break; } } } return Super.SpawnNotification(anActor); } X/****************************************************************************** BMPMainWindow UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class BMPMainWindow expands UWindowFramedWindow; o6-%, ~r8$%_$, w, $6 .a, $6Uw*I " !, $M $Ua$A(8* FeGP @ew*?IDP:?I#%#, w#?*%w#?P::#??,#kD?I:% D!'"S..!jw.*P."-2.a/!!.!,.!w,*."-2,a/!!,,!  }yiHHw((a/!a/!((a/!(a/!-3::(*H\]^H%H(\]^ Ow2@Rwuъl9 }tRùtttѸBtt9 }9 }9 }j@j@j@j@ttѸBj@H= - % , r 5%, w , >  a , >w *   "d a/!. !.  , K. $  , J  , b ; aA( 5*  ^/****************************************************************************** UnlimitedAmmoSpawnNotify UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class UnlimitedAmmoSpawnNotify expands SpawnNotify; var bool Initialized; simulated function PostBeginPlay() { local Weapon W; Super.PostBeginPlay(); if (Initialized) return; Initialized = True; ForEach AllActors(class'Weapon', W) { if (!UnlimitedAmmo(Owner).RedeemerUnlimited && W.IsA('WarheadLauncher')) continue; W.PickupAmmoCount = 999; } } simulated event Actor SpawnNotification(Actor anActor) { local Weapon W; local Ammo A; W = Weapon(anActor); if (W != None) { if (!UnlimitedAmmo(Owner).RedeemerUnlimited && W.IsA('WarheadLauncher')) return anActor; W.PickupAmmoCount = 999; return anActor; } A = Ammo(anActor); if (A != None) { if (!UnlimitedAmmo(Owner).RedeemerUnlimited && A.IsA('WarheadAmmo')) return anActor; A.AmmoAmount = 999; A.MaxAmmo = 999; } return anActor; } `0+a/a0 0^5-20a/!1^0010 [G&t-[ -['/a0 Gq\."-2Ga/!1qG10 C97,bOw.9*9a/!.9*(9f ?M+2M+TKw+* wT++- + >% %0 , w 5* R , Over 32 playersw%* w)*)-%- w%) 5) % ,  ,  >  %%w* , oa/! ,  >a/!w.* ,  K. ,  K% ,  J ,  bha/!N ,  J.&,  %) Y'.Yw*w.*.-.w*a/! w4C+-CO444CzY  h/****************************************************************************** UnlimitedAmmo UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class UnlimitedAmmo expands Mutator; var bool Initialized; var(UnlimitedAmmo) globalconfig bool RedeemerUnlimited; event PreBeginPlay() { Super.PreBeginPlay(); if (Initialized) return; Initialized = true; Spawn(class'UnlimitedAmmoSpawnNotify', self); SetTimer(Level.TimeDilation, true); } function Timer() { // Top it up every second local Ammo A; ForEach AllActors(class'Ammo', A) { if (!RedeemerUnlimited && A.IsA('WarheadAmmo')) continue; A.AmmoAmount = 999; A.MaxAmmo = 999; } } function bool IsRelevant(Actor Other, out byte bSuperRelevant) { // remove all ammo packs if (Inventory(Other).MyMarker != None && Other.IsA('Ammo')) { Inventory(Other).MyMarker.markedItem = None; return false; } return Super.IsRelevant(Other, bSuperRelevant); } _/****************************************************************************** SameTeam UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class SameTeam expands Mutator; var bool Initialised; function PostBeginPlay() { if (Initialised) return; Initialised = true; Level.Game.RegisterDamageMutator( Self ); } function MutatorTakeDamage (out int ActualDamage, Pawn Victim, Pawn InstagatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { if (InstagatedBy != Victim && (InstagatedBy.IsA('Bot') || InstagatedBy.IsA('PlayerPawn')) && (Victim.IsA('Bot') || Victim.IsA('PlayerPawn')) && Level.Game.bTeamGame && InstagatedBy.PlayerReplicationInfo.Team == Victim.PlayerReplicationInfo.Team) { // Do the damage to the Instagator and remove any damage to the victim InstagatedBy.TakeDamage( ActualDamage, InstagatedBy, HitLocation, Momentum, DamageType); ActualDamage = 0; } Super.MutatorTakeDamage(ActualDamage, Victim, InstagatedBy, HitLocation, Momentum, DamageType); } P&!m-a 1&Uw-*-&->& =-& & L~EN2 sl9 }9 }9 }9 }Rù9 }.;9 }.;9 }Rù\$/****************************************************************************** KeepStuff UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class KeepStuff expands Mutator; var() localized class TempStore[1024]; var localized int AmmoCount[1024]; var localized Pawn Players[32]; function ScoreKill(Pawn Killer, Pawn Other) { local Inventory Inv; local int i, j; // Find i first i = 0; while (i<32 && Players[i] != None) i++; if (i == 32) log ("Over 32 players"); else if (Other != None && Killer != None && Other != Killer && Other.bIsPlayer) { // Store all their inventory weapons for later use Players[i] = Other; for (j=0;j<32;j++) TempStore[(i*32)+j] = class'Engine.Inventory'; j = 0; for (Inv = Other.Inventory; Inv != None && j < 32; Inv = Inv.Inventory) { if (Inv.IsA('Weapon') && !Inv.IsA('WarHeadLauncher')) { // Store class TempStore[(i*32)+j] = Inv.class; if (Weapon(Inv).AmmoType != None) AmmoCount[(i*32)+j] = Weapon(Inv).AmmoType.AmmoAmount; else AmmoCount[(i*32)+j] = 0; j++; } } } Super.ScoreKill(Killer, Other); } function ModifyPlayer(Pawn Other) { local int i, j; local Weapon Copy; if (Other.bIsPlayer) { for (i=0; i<32; i++) { if (Players[i] == Other) { // Give back their stuff j = 0; while (j<32 && TempStore[(i*32)+j] != class'Engine.Inventory') { // Create and store the weapon Copy = Weapon(spawn(TempStore[(i*32)+j],Other)); if (Copy != None) { Copy.RespawnTime = 0.0; if (Level.Game.PickupQuery(Other, Copy)) { Copy.GiveTo(Other); Copy.GiveAmmo(Other); // Set the ammo count now Copy.AmmoType.AmmoAmount = AmmoCount[(i*32)+j]; Copy.SetSwitchPriority(Other); } else { Copy.Destroy(); } } j++; } Other.SwitchToBestWeapon(); Players[i] = None; break; } } } Super.ModifyPlayer(Other); } ;%$-Q -Q'a d S:/****************************************************************************** FatGun UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class FatGun expands Mutator; var (FatGun) globalconfig float Increment; var (FatGun) globalconfig float MaxScale; var (FatGun) globalconfig float MinScale; var (FatGun) globalconfig float MaxPlayerViewScale; var (FatGun) globalconfig float MinPlayerViewScale; var bool Initialized; event PreBeginPlay() { Super.PreBeginPlay(); if (Initialized) return; Initialized = true; Spawn(class'FatGunSpawnNotify', self); } function ModifyPlayer(Pawn Other) { local FatGunInvTracker InvTracker; // Add the inv tracker to them InvTracker = Spawn(class'FatGunInvTracker', Other); if( InvTracker != None ) { InvTracker.Instigator = Other; InvTracker.BecomeItem(); Other.AddInventory(InvTracker); } Super.ModifyPlayer(Other); // Fat or shrink guns ResizeGuns(Other); } function ScoreKill(Pawn Killer, Pawn Other) { Super.ScoreKill(Killer, Other); if (Killer != None && Other != Killer && Killer.bIsPlayer) ResizeGuns(Killer); } function int GetPlayerLead(Pawn aPlayer) { // Need to rewrite this to find highest, average and lowest and // find a nice number from that rather than lead local PlayerReplicationInfo PRI; local GameReplicationInfo GRI; local int PlayerScore, i; local float AverageScore; if (Level.Game.GameReplicationInfo != None) { GRI=Level.Game.GameReplicationInfo; PlayerScore = aPlayer.PlayerReplicationInfo.Score; AverageScore = PlayerScore; for (i=0; i<32; i++) { if (GRI.PRIArray[i] != None && GRI.PRIArray[i] != aPlayer.PlayerReplicationInfo) { AverageScore = (AverageScore + GRI.PRIArray[i].Score) / 2; } } // Okay. Now we have all 4 nice variables we need to figure out // the difference from average. return PlayerScore - AverageScore; } return 0; } function ResizeGuns(Pawn aPlayer) { local Inventory Inv; local float Sizer, halfSizer; local int Lead; // go through all weapons for player and make them bigger or smaller Lead = GetPlayerLead(aPlayer); if (Lead > 0) { Sizer = (Lead * Increment) + 1; halfSizer = (Lead * Increment / 2) + 1; } else if (Lead < 0) { Sizer = 1 / (((0 - Lead) * Increment) + 1); halfSizer = 1 / (((0 - Lead) * Increment / 2) + 1); } else { Sizer = 1; halfSizer = 1; } if (Sizer > MaxScale) Sizer = MaxScale; else if (Sizer < MinScale) Sizer = MinScale; if (halfSizer > MaxPlayerViewScale) halfSizer = MaxPlayerViewScale; else if (halfSizer < MinPlayerViewScale) halfSizer = MinPlayerViewScale; for (Inv = aPlayer.Inventory; Inv != None; Inv = Inv.Inventory) { if (Inv.IsA('Weapon')) { if (Inv.bCarriedItem) { Inv.DrawScale = Inv.default.PlayerViewScale * halfSizer; } else Inv.DrawScale = Inv.default.ThirdPersonScale * Sizer; Inv.ThirdPersonScale = Inv.default.ThirdPersonScale * Sizer; Inv.PickupViewScale = Inv.default.PickupViewScale * Sizer; Inv.PlayerViewScale = Inv.default.PlayerViewScale * halfSizer; // I can't just change .Z because set hand uses default.Z. So I have // to set the default as much as I hate the idea. For now lets set nothing /* if (Sizer > 1) Inv.PlayerViewOffset.Z = Inv.default.PlayerViewOffset.Z - (10 / Sizer); else Inv.PlayerViewOffset.Z = Inv.default.PlayerViewOffset.Z; */ } } } A@_)   j.-'-'-'<. AAC?<  h< A<#%@. A@BB?@  k@ A@#%. B@BC? A-(-'-'-'j. ?,4?,@BA TA1%%%,7pKEYNAME S7{7 pKEYBINDING 7{ ~  ee| taunt| getweapon | viewplayernum| button| mutate |= {=None%% OXD"r`zXSwapHands`w*9?,$? -e  Left:?&-O Center:#?% ?& -O  Right: HiddenMX Qt WՖ;̊l9 }j@j@j@j@j@j@j@j@j@j@j@j@j@j@RùRù9 }.;D۠Dۅ9 }D۝.;9 }1Sf1Sf9 }4$>3$@2$>1$?0$?.r/****************************************************************************** SwapHands UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class SwapHands expands Mutator; var (SwapHands) globalconfig bool AllowCenter; var (SwapHands) globalconfig bool AllowHidden; function Mutate(string MutateString, PlayerPawn Sender) { if (MutateString == "SwapHands") { // Do our stuff if (Sender.Weapon != None) { Sender.Weapon.PutDown(); if (Sender.Handedness == 2 || (Sender.Handedness == -1 && !AllowHidden)) Sender.ChangeSetHand("Left"); else if (Sender.Handedness == 1 && AllowCenter) Sender.ChangeSetHand("Center"); else if (Sender.Handedness == 0 || (Sender.Handedness == 1 && !AllowCenter)) Sender.ChangeSetHand("Right"); else Sender.ChangeSetHand("Hidden"); Sender.Weapon.RaiseUp(Sender.Weapon); } } Super.Mutate(MutateString, Sender); } U[/g x% vG% Dv& ppD or D \]Z3q ]&%Y3V%pSET Input %#3pSET Input %#%pSET Input %3SET Input`=[3SET Input`= _%6-_ -_'a ca' ^' lZzFzFEscape',p ',y',0 ',9 'F cB:B'.Bw* w*  @Bw*a/! w/E!-EE///Ep( S|JT a*A$*aa $]--(-(]r* && w.**-'-'" $--(-(r* ,, " $--(-(r* ,, "  n/****************************************************************************** FatGunInvTracker UnrealTournament Blink Mutator Pack 1.0 31st January 2000 Written by Quicken (gdunn@backmeup.net.au) This code copyright (c)2000 Blink Software ******************************************************************************/ class FatGunInvTracker expands TournamentPickup; simulated event RenderOverlays( canvas Canvas ) { // Be invisible } simulated function DrawStatusIconAt( canvas Canvas, int X, int Y, optional float Scale ) { // Be invisible } function bool HandlePickupQuery( inventory Item ) { local Weapon W; local Inventory Inv; local float Sizer, halfSizer; // Check if we are even going to consider picking this up if (Super.HandlePickupQuery(Item)) return true; // If it's a weapon make the size same as others W = Weapon(Item); if (W != None && Instigator != None && !Level.Game.ShouldRespawn(Item)) { // Find another weapon that person owns and set it with the same // scale offset for (Inv = Instigator.Inventory; Inv != None; Inv = Inv.Inventory) { if (Inv.IsA('Weapon') && Inv != W) { Sizer = Inv.ThirdPersonScale / Inv.default.ThirdPersonScale; halfSizer = Inv.PlayerViewScale / Inv.default.PlayerViewScale; if (W.bCarriedItem) W.DrawScale = W.default.PlayerViewScale * halfSizer; else W.DrawScale = W.default.ThirdPersonScale * Sizer; W.PickupViewScale = W.default.PickupViewScale * Sizer; W.ThirdPersonScale = W.default.ThirdPersonScale * Sizer; W.PlayerViewScale = W.default.PlayerViewScale * halfSizer; /* if (Sizer > 1) W.PlayerViewOffset.Z = W.default.PlayerViewOffset.Z - (10 / Sizer); else W.PlayerViewOffset.Z = W.default.PlayerViewOffset.Z; */ break; } } } return false; } dUI:8- UU-(-( V& . -V -V'T kR < iCCCC CCBcBB}B|BBCCB@B`BOBBMBBfBBsB_BBV\BFBuBgBTBD|cB|B`|ABb`Q|eD_|w|gW``OxyCPBLDUZBi||Bh`%||~D^Bd|fBNBH`'`7BvyBOjOrzba`:|b`H`DOqBoRaBRBy|\`&BxOeDPBGDOBIDZ`A`.BsW`I`S`/|g`RDVX|Y|mBJ` `JD}[`+`)BK|p`R`&BNBzOtK z8g[G9tp U9gn b9c o9K |9gm I:p U:u b:E o:M {:^ G;M S;oE _;oM k;p w;p D<tE Q<wX ]<op j<wu w<tF D=go P=X ]=E j=h v=wM B>gl N>tv Z>~Tf>M t>oX @?{qM?_[?zM zAwE FBY RBX _B] lB~D yBX FCGSCYbC{@ pCN }C{K JDE WD@ dDG`qD"U QI] ]IE jIp[ wIVDJL SJ[ _JXlJzQ zJ4 FKgYSKg, aKpVmKz]|KgL JLgQ WLtcLF qLg }LF IML UMK aM~d nMzP zMpW FNpw SNoY `Nw mN1 yNq< FOzkSOk aO0 mO2 zOX GPj TPS aP3 mPn zPqFQtk TQck aQ~]mQ~l|Q~r KR"k WRL cRIoRpX }RFvIS?jUqH iZiuZLS9C[gK V5lcgZ OgS \~ hp{4h,ug{4kV]iHfqbWs{4Ny6pG Pwd{4rGi{4cyX\z~ tJ A JNc'qXdIC WHTd~ xUDpbYc{4i{"+adc&sE"7\xzA TKapRld'E~"{4sC~ v{4jBWlENC{4g$Q%4x{4^:lg\ J1)Wg.}tgZqqDmKDx{~ |q{4}Ig/mFGsC AJ NgGZd a"%Bng op1:B_1JagA`@{ `1{4ylM egIAq&=rC oJ |sRMHSystem\Manifest.iniSystem\Manifest.intHelp\BMP Readme.txtSystem\BMP.intg System\BMP.u}^ J :