### Installation Notes

Unzip this patch into your \Unreal\System directory, overwriting any existing files.

The first time you run the upgraded version of Unreal, you will be asked to put your Unreal CD in the drive. This step is required because files must be loaded off the CD during the patching process. Make sure you have your original Unreal retail CD handy before installing the patch.

After installing the patch, you will need to reconfigure your Unreal settings such as your keyboard configuration, 3D hardware, and resolution. However, your savegames will not be lost; savegames from previous versions will work properly.

### User Improvements

#### Multiplayer Improvements

- Player movements are now compressed with a predictor-corrector scheme, allowing for smoother movement of enemies.
- New multiplayer game styles, including Classic, Hardcore, and Turbo, can be selected from the game options menu.
- Fixed player and spectator counts.
- Fixed becoming ghost when killed while starting to feign death.
- Spectators can now see the scoreboard.
- Spectators can cycle through other player views by pressing fire, and return to their own view using the alt-fire button.
- Spectators can go through portals.
- Fixed support for multiple skin .int files (now can add user skins in new utx files without breaking compatibility).
- Improved team scoreboard.
- Skin and mesh selection always remembered.
- Spectators not shown in the scoreboard.
- Skaarj player swimming and dodge roll animations played correctly.
- In team games, players properly start at appropriate playerstarts in levels where playerstarts are marked for specific teams.
- Fixed King of the Hill gameplay bugs.
- Fixed jumpboot respawning problem.

#### Internet Play

- Improved bandwidth usage for temporary effects like projectiles.
- Player movements are now compressed with a predictor-corrector scheme, allowing for smoother movement of enemies.
- Movers are simulated client-side, and players based on movers have their location updated by the server relative to the mover position. This allows smooth mover movement prediction on the client.
- Optional game password can be set to limit access to a server. Clients can enter the administrator or game password from the player selection menu.
- Fixed "little chess piece" cheat and some other security holes..

#### Server

- Fixed remote administration (see Server Tips for information).
- Remote administrators can finally execute console commands on the server.
- The "AllowAdmin" setting is no longer used. To make your server remotely manageable, just set the "AdminPassword" in "Advanced Options / Game Settings".

#### Rendering

- "TIMEDEMO 1" command provides frames-per-second statistics at any time. If started during the flyby sequence, it provides statistics for exactly one loop of the flyby, for comparison to other systems. "TIMEDEMO 0" turns it off. Thanks to Jack "Mek" Porter for integrating the code.

#### Player Controls

- bFreelook
- FOV snaps back to modified value.
- Optional mouse smoothing.
- GetWeapon console command can be used to bind any key to a specific weapon.
- Added weapon flash effects, and option to turn them off.
- Fixed centerview problem.

#### Single Player

- Fixed problem where splashes didn't play on some levels.
- Fixed problem where a healing zone reduced your health to 100 if it was above 100.
- Fixed problem where pickups like the shieldbelt were de-activated after a level change.
- Improved the "Advanced Options" screen.
- Fixed problem with scuba gear interfering with armor.
- Crucified nali is solid.

#### BotMatch

- Bots have greatly improved understanding of how to use lifts, and how to use triggered doors and lifts.
- Bots never get frozen after dying.
- Fixed bug where bots would disappear from the game.
- Bots have a better understanding of how to do the ASMD combo move and other weapon special moves.
- Improved navigation code for swimming, jumping up onto ledges.

#### Coop games

- Listen server player weapons travel from level to level.
- Fixed weird movement problem in open areas on fast machines during coop play.
- Translocator works properly in coop play, and everyone gets one.

### Level Designer Changes and Improvements

#### LevelInfo

- Added bHumansOnly to specify whether only "human" player pawns are allowed in this level.
- Added bNoCheating to specify whether certain client actions, like turning lighting off or using a non-standard console, are allowed.

#### ZoneInfo

- Added bNoInventory to specify whether inventory is allowed to exist in this zone. If true, then any inventory in this zone not being carried by a pawn is destroyed.

#### AI

- Added "LiftTrigger" variable to LiftCenter and LiftExit.
- Added "ExtraCost" to NavigationPoint.
- Added "bOneWayPath" to navigationpoint.

### Script Programmer Changes and Improvements

#### Script Compiler

- When defining a class that contains configurable variables, you can now specify whether the configuration should be stored in Unreal.ini or User.ini:
  - class MyClass expands SuperClass config(System); // Class should use system configuration (Unreal.ini) -- the default.
  - class MyClass expands SuperClass config(User); // Class should use user configuration (User.ini).
  - class MyClass expands SuperClass config(MyMod); // Class should use a mod-specific configuration file named "MyMod.ini".
  - Default "System" variables are stored in Default.ini.
  - Default "User" variables are stored in the new file DefUser.ini.
- You can now refer to literal objects by by their package name, for example texture'UnrealI.Skins.MySkin' -- this used to cause a compiler error.

#### Networking

- Added bNetTemporary for temporary, simulated actors like projectile: Improves bandwidth usage. If you set bNetTemporary=true for any of your projectiles or special-effects actors, you need to destroy the actor on the client side, either by setting a LifeSpan, or destroying it in a simulated function. In 219, all actors were destroyed automatically by the server. In 220, bNetTemporary=true actors must be destroyed by the client.
- Use bNetOptional for purely gratuitous effects that can be skipped if not enough bandwidth is available, such as smoke puffs. bNetOptional=true actors are only sent to the client if there is spare bandwidth; they never suck bandwidth away from bNetOptional=false actors.
- Use bAlwaysRelevent to force an actor to always be sent to the client. For example, we have bAlwaysRelevent=true on our PlayerReplicationInfo actors, so they are always replicated to the client.
- Fixed PreLogin function being passed just the ?option=value strings rather than the full URL.

#### Single-player

- Fixed TravelPreAccept/TravelPostAccept not being called.

#### Mods

- You can now place "exec" functions in GameInfo subclasses, and Inventory subclasses. "exec" functions are searched for in the following order, with the first match called and the others ignored: The PlayerPawn actor itself, then all the items in the player's inventory, then Level.GameInfo. In addition, you can use GameInfo "exec" commands through the Unreal server console.
- The menu lists for available game classes, player classes, bot classes, and weapon classes are now loaded each time the menu is opened from the .int files. To add new items to these lists, reference them in a .int file associated with your mod.
- The GetNextInt() intrinsic function is used to read entries from the .int files.
- Mod makers can now import Windows fonts for use in HUDs. This only works well for true-type fonts. Use an exec command with this syntax: #exec Font ImportTTF Name=MyFont Font="Arial" Height=12 . When the package file is rebuilt with Unreal -make, a new font Texture'MyFont' which is 12 pixels high will be available. The font is monochrome and can be set to any color when it is drawn on the HUD. Questions on this to jack@epicgames.com.
- You can now have a custom .ini file for your mod's configuration; see the "Script Compiler" notes above.

#### Separation of player and system configuration

- The new User.ini now contains all user-specific Unreal settings such as the keyboard and mouse configuration.
- Unreal.ini only contains system-wide options.
- Default.ini contains default values for everything in both User.ini and Unreal.ini.
- If you're going to a LAN party and want to bring your configuration with you, just bring User.ini.

#### Heads Up Display

- The HUD is now responsible for drawing its owner's weapon. A local player's HUD RenderOverlays() function is called every tick. It calls the RenderOverlays() function for its owner's weapon (and potentially other actors). RenderOverlays() is called before the view flash and fog is applied, unlike PostRender(). As a result, InvCalcView() was no longer needed and was removed from Inventory.

#### Messages

- ClientMessage has been rewritten to take an optional message type and optional message beep boolean. The message type can be used to determine how the message is displayed on the screen. See Engine.Console.PostRender for information.
- Engine.Console.PostRender has been moved from C++ to UnrealScript.
- The console now asks the gameinfo object to handle messages before it displays them. A GameInfo class can employ DisplayMessages(Canvas C) to paint messages instead of the default Console.
- There are now weapon based death messages. Weapon deathmessages are coded strings that take the form:
  %k killed %v with the %w.
- %k is replaced with the killer's name.
- %o is replaced with the victim's name.
- %w is replaced with the killer's weapons name.
- The actual order of the % codes in the deathmessage is irrelevant.

#### Scoreboard

- The scoreboard has been rewritten to take advantage of PlayerReplicationInfo. It will now obtain score information as it is replicated by each client.

#### Menus

- Fixed several localization problems with menus, including support for localized yes/no characters.
- The menus have been restructured to increase code reuse.
- New functions for fading in strings of text are available in UnrealShortMenu.

#### Artificial Intelligence

- The VisNoReachPaths[] array in NavigationPoint provides a list of NavigationPoints which are visible but not directly reachable from the current NavigationPoint.
- The NavigationPoint function DescribeSpec() is now a useful way of getting information about a reachspec ( which describes the conditions for movement between two actors).
- The RouteCache[] array in Pawn provides a list of the NavigationPoints along the best path determined by the most recent FindPathTo() or FindPathToward() call. The first NavigationPoint is the one returned by the function call, followed by the successive waypoints toward the goal.

#### Actor features

- TransientSoundRadius is a new Actor attribute which specifies the default radius for sounds played by a given actor using PlaySound()
- ConsoleCommand() intrinsic function implemented for Actor, allowing scripts to call console commands even when there is no local playerpawn (e.g. a dedicated server).
- FellOutOfWorld() is a new event called by the physics if a falling actor's location becomes invalid (outside of the level).
- intrinsic final function string[64] GetNextInt( string[64] ClassName, int Num);
- Use bGameRelevant to specify if an actor class is always relevant for a given game.
- When an actor becomes the ViewTarget of a player, its BecomeViewTarget() function is called.
- The string representation of actors now includes their package prefix, i.e. "Engine.PlayerPawn" rather than "PlayerPawn". The GetItemName() function returns the a string with the package prefixes removed.

#### GameInfo features

- The localized GameInfo attribute GameName contains a human readable string representation of the game type's name.
- The GameInfo function PlayerJumpZScaling() is used to modify the player's jumping ability for a specific game type.
- The GameSpy protocol code now calls GameInfo GetRules() to ask for gametype specific rules that should be sent to the querying client. This will allow mod authors to add new fields to GameSpy. For more information, see GetRules() and the GameSpy Open Protocol guide.
- GameInfo information that is regularly replicated to the client has been consolidated within a GameReplicationInfo class. This class contains information regarding the server's administrator, gamespy information, message of the day information, and so forth. Much of this information is configurable from Advanced Options.

#### Pawn features

- Pawn information that is regularly replicated to the client has been consolidated within PlayerReplicationInfo. All bots and human players have a related PlayerReplicationInfo class. This contains information such as the player's name, score and so forth. All PlayerReplicationInfo classes are bAlwaysRelevant to all clients. This means that each client in a netgame has a subset of information regarding all players in the game. (Used in scoreboard and enhanced HUDs.)
- The bIsHuman attribute of pawns specifies whether a pawn class should be considered human (for game types which care about whether a pawn is human or not).
- The localized Pawn attributes MenuName and NameArticle contain the human readable name of the pawn type.
- The UpdateURL() function updates the current URL with the new option and value, and optionally also updates the saved DefaultPlayer config.
- The ClientInstantFlash() can be used to cause a one frame screen flash.
- The Sniper rifle zoom has been moved to PlayerPawn. StartZoom() begins a zoom, StopZoom() stops zooming, and EndZoom() unzooms.
- The PlayerRestartState attribute specifies the initial state for players when they enter a level or restart after dying..

#### Inventory features

- The localized Inventory attributes ItemName and ItemArticle contain the human readable name of the inventory type.
- The ProjectileClass and AltProjectileClass attributes are now configurable.

### C++ Changes And Improvements

#### Localization Support

I'm incrementally adding support for Unicode to the engine. The TCHAR definition is CHAR when compiling in ANSI mode, and WORD when compiling in Unicode mode. The TEXT("str") macro emits a string either in Unicode or ANSI depending on the compilation mode. See UnBuild.h for various Unicode-related definitions. Unreal doesn't yet run successfully under Unicode yet, because the string serialization needs improving, and Windows calls need to thunk down to ANSI on Win95/98, and UFont objects don't support multiple pages yet. We expect full Unicode support to come together over the coming months.

#### Cleanup of Core

I'm improving the portability of the code by more cleanly separating functions with dependencies on the ANSI C library (in UnFile.cpp) and Windows (in UnPlat.cpp).

#### Multiple player configurations

Separating User.ini out of Unreal.ini is the first step in evolving Unreal towards supporting multiple player configurations. The goal is to eventually allow storing mutiple users' settings by name.