[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 @ g o f;- - None LocalizedKeyName System Core BMP Engine ConsoleCommand FatGun Weapon ProcessMenuKey SetText CreateControl ChangeSetHand ResizeGuns
SwapHands
ScoreKill SetHelpText WarheadLauncher
ModifyPlayer UWindow PlayerPawn UnlimitedAmmo WarHeadAmmo Bot LoadExistingKeys SetKey UMenu ActorClass Ammo
HaveStuff PickupQuery
KeepStuff GetPlayerLead GiveAmmo GiveTo SetFont SetSwitchPriority
PreBeginPlay PostBeginPlay SpawnNotification SwitchToBestWeapon RenderOverlays TakeDamage Timer
AliasName ClientClass Created BeforePaint MinPlayerViewScale MaxPlayerViewScale MinScale MaxScale
Increment BMPMainWindow BMPModMenuItem IsRelevant bHidden PutDown HandlePickupQuery Activate AllowCenter
AddInventory BecomeItem FatGunSpawnNotify ShouldRespawn Notify MenuCaption MenuHelp Mutate SameTeam UnlimitedAmmoSpawnNotify FatGunInvTracker MutatorTakeDamage KeyDown DrawStatusIconAt
Explaination BMPDialogClientWindow RaiseUp UDamage bIsItemGoal Botpack CustomizeHelp Execute
LabelName RegisterDamageMutator WindowTitle PlayerViewScale PickupViewScale Other Killer Handedness
TimeDilation ThirdPersonScale HitLocation
bCarriedItem
bIsPlayer SpawnNotify Team GameReplicationInfo
Inventory
actualDamage Game Instigator Owner pos bSuperRelevant Key aPlayer Momentum markedItem
MutateString Pickup Inv Charge ArmorAbsorption
LevelInfo Item Copy InventorySpot AmmoType AmmoAmount
DrawScale RespawnTime ScriptText PlayerReplicationInfo
bTeamGame PRIArray Score Mutator PRI Class Package Victim j TextBuffer UWindowPulldownMenuItem UWindowSmallCloseButton UWindowFramedWindow UWindowRootWindow UWindowDialogControl UWindowButton UWindowWindow UWindowPulldownMenu bIgnoreMDoubleClick bIgnoreRDoubleClick GetPlayerOwner SetAcceptsFocus
CreateWindow GameInfo
bDisabled bAcceptsFocus
WinHeight WinWidth Root CloseButton Players OrString GRI Alias Object Function Vector Struct Sender Canvas PickupAmmoCount UMenuRaisedButton UMenuLabelControl UMenuDialogClientWindow UMenuModMenuItem MaxAmmo Initialized RealKeyName
BoundKey1
BoundKey2 bPolling MenuItem anActor DamageType TournamentPickup FinalCount StrProperty lead
Ammocount StructProperty ClassProperty
NameProperty Scale ObjectProperty Pawn ReturnValue FloatProperty A Level Actor X
BoolProperty Sizer
halfSizer C AllowHidden E Y W KeyName i InvTracker IntProperty PlayerScore
AverageScore
ByteProperty Initialised
InstagatedBy RedeemerUnlimited
TempStore ChargeCount ArmourCount ExplainationLabel bIgnoreLDoubleClick
KeyButton myMarker KeyNo k @
@ / 4 R
7 $ @ \ X JE
" l j@ = j@ җO ѸB ѸB ѸB R : ) - F a T 1 , E fbG 2 1 Sf Xu6 R ù 9} j@ j@ j@ j@ j@ j@ t t t t t t t t t t t j@P8 OS @ ` C M @ f W @ h @ K I @ K @ @ ( # b J 8 R @ e @ x Q @ N @ j S @ @ l ] ^ 2 @ g 5 B{F c eo m" t t" ѸB ѸB ѸB" t t uI? d F?_ m t t 9} t 9} j@ j@ j@ j@ j@ j@ t t t t t t t t t t t j@ @ nhL 2 g |` p s s s s s֍ s s s֍ ᱘ ᱘ ᱘ ᱘ ᱘ ᱘ s s s s sK]Key configuration:
LeftMouse RightMouse Cancel
MiddleMouse
Unknown05
Unknown06
Unknown07
Backspace Tab
Unknown0A
Unknown0B
Unknown0C
Enter
Unknown0E
Unknown0F Shift Ctrl Alt Pause
CapsLock
Unknown15
Unknown16
Unknown17
Unknown18
Unknown19
Unknown1A Escape
Unknown1C
Unknown1D
Unknown1E
Unknown1F Space !PageUp
" PageDown #End $Home %Left &Up 'Right (Down )Select *Print +Execute ,
PrintScrn -Insert .Delete /Help 00 11 22 33 44 55 66 77 88 99 :
Unknown3A ;
Unknown3B <
Unknown3C =
Unknown3D >
Unknown3E ?
Unknown3F @
Unknown40 AA BB CC DD EE FF GG HH II JJ KK LL MM NN OO PP QQ RR SS TT UU VV WW XX YY ZZ [
Unknown5B \
Unknown5C ]
Unknown5D ^
Unknown5E _
Unknown5F `NumPad0 aNumPad1 bNumPad2 cNumPad3 dNumPad4 eNumPad5 fNumPad6 gNumPad7 hNumPad8 iNumPad9
j GreyStar
k GreyPlus l
Separator m
GreyMinus n
NumPadPeriod o
GreySlash pF1 qF2 rF3 sF4 tF5 uF6 vF7 wF8 xF9 yF10 zF11 {F12 |F13 }F14 ~F15 F16 F17 F18 F19 F20 F21 F22 F23 F24
Unknown88
Unknown89
Unknown8A
Unknown8B
Unknown8C
Unknown8D
Unknown8E
Unknown8F NumLock ScrollLock
Unknown92
Unknown93
Unknown94
Unknown95
Unknown96
Unknown97
Unknown98
Unknown99
Unknown9A
Unknown9B
Unknown9C
Unknown9D
Unknown9E
Unknown9F LShift RShift
LControl
RControl
UnknownA4
UnknownA5
UnknownA6
UnknownA7
UnknownA8
UnknownA9
UnknownAA
UnknownAB
UnknownAC
UnknownAD
UnknownAE
UnknownAF
UnknownB0
UnknownB1
UnknownB2
UnknownB3
UnknownB4
UnknownB5
UnknownB6
UnknownB7
UnknownB8
UnknownB9
Semicolon Equals Comma Minus Period Slash Tilde
UnknownC1
UnknownC2
UnknownC3
UnknownC4
UnknownC5
UnknownC6
UnknownC7 Joy1 Joy2 Joy3 Joy4 Joy5 Joy6 Joy7 Joy8 Joy9 Joy10 Joy11 Joy12 Joy13 Joy14 Joy15 Joy16
UnknownD8
UnknownD9
UnknownDA
LeftBracket
Backslash
RightBracket
SingleQuote
UnknownDF JoyX JoyY JoyZ JoyR MouseX MouseY MouseZ MouseW JoyU JoyV
UnknownEA
UnknownEB
MouseWheelUp ̀MouseWheelDown Unknown10E Unknown10F
JoyPovUp JoyPovDown JoyPovLeft
JoyPovRight
UnknownF4
UnknownF5 Attn CrSel ExSel ErEof Play Zoom NoName PA1
OEMClear S]
SwapHands ,]mutate SwapHands Q]KIClick the blue rectangle and then press the key to bind to this control. D @ v 5 2 i /~ 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;
}
}
6 L t %0 , w 8* R , Over 32 players w * w L*
w L - 8 % , , 6 % w *
, a/! a/! , 6 w. * , M. , M% L mA 2 p ]"J l 9} j@ R ù j@ j@ t t ѸB t j@ j@ j@ j@ 9} 9} 9} 9} j@ j@ j@ j@ t t ѸB j@ j@ j@ 8 j@ YV q rG l t t <