With Epic's blessing and with the help of some new team members, the OldUnreal team is bringing Unreal Tournament 2004 (UT2004) back. This means that we are going to publish an installer that downloads the original disc image for UT2004, installs the game, and applies patches to it. We are also going to start publishing patches that modernize the game, make it compatible with Windows Vista or later, Linux x86-64 and aarch64 (Raspberry Pi and similar), and Mac OS 10.9 or later, fix bugs, and implement quality-of-life changes.
Yes, you read that right. **UT2004 will soon be available to download once again. Free of charge.**
This is a community-run effort but we’re excited to make the game easier to access and play again.
We have been working on this for quite some time now and have made enough progress to start inviting the first batch of testers.
Highlights so far include:
We now natively support modern Linux and macOS systems with 64-bit Intel and ARM/Apple CPUs
You can now play the game or run a server on a Raspberry Pi 4 or 5, albeit at a lower frame rate than on a PC!
The Linux and macOS distributions of the patch now include a fully functional UCC with an UnrealScript compiler (UCC make) and texture compression support
The Linux and macOS distributions now use SDL3 instead of SDL1
D3D9Drv and fullscreen support are fully functional in the Windows 64-bit client
We dealt our first (minor) blow to the editor goblin! We fixed several crash bugs, restored some broken functionality, and, most importantly, the editor will no longer freeze for several seconds when you click a viewport
Stability Improvements:
Unreal Editor
We fixed a bug that crashed Unreal Editor when converting meshes to brushes
We fixed a bug that crashed Unreal Editor when you opened a map while the 3D viewport was in realtime mode
We fixed a bug that could crash Unreal Editor when selecting something in a 3D viewport that uses D3D9Drv
Networking and Netcode
We fixed a networking bug that allowed players to perform illegal combo moves and to crash servers
Audio and 3D Rendering
We fixed a bug that could crash the game when rendering skeletal meshes with invalid hierarchies
UnrealScript
The game should no longer crash if you click a tab in an in-game menu whose content is still being rendered
Miscellaneous
We fixed a bug that made the game crash when reading an Unreal package with an unexpected GUID
We fixed a garbage collection bug that made the game crash upon shutdown
We fixed a bug that made the game randomly crash when it tried to write to the log file during shutdown
Bug Fixes
Unreal Editor and UCC
The procedural sound context menus should now be fully functional
The display checkbox for placeables actors in the actor browser should now work as expected
We fixed a bug that made Unreal Editor create dummy packages when converting static meshes to or from brushes
Unreal Editor now saves viewport sizes correctly even when viewports are minimized
Large .int files are now saved correctly without truncation (#12)
The UnrealScript compiler now parses and compiles scripts in the correct order after it processes dependson directives
The editor no longer moves left and down when clicking on a viewport, when used on a multi-monitor setup
Viewport selection no longer takes a century, instead acting instantly
We fixed bugs that made Unreal Editor incorrectly import and export DDS files
We fixed a bug that made the Unreal Editor tooltips disappear on some systems
We fixed a bug that made materials used by static meshes not appear in the texture browser's "in use" tab
The static mesh to brush converter now works as expected when converting a mesh with a negative draw scale
We fixed a bug that made Unreal Editor freeze when closing a modal dialog using the X button
We fixed a bug that crashed the editor when opening a non-existing file
We fixed a bug that made coronas block mouse selection in editor viewports
Networking and Netcode
The game now reports the correct progress percentage when downloading files from a game server
The game client will no longer call PostNetBeginPlay twice for certain actors
Audio and 3D Rendering
We fixed a bug that made ambient sounds restart whenever the player camera switches to a different view target
Music fadeouts should now work as expected
Physics
We fixed a bug that triggered a "moved without proper hashing" warning when a player disconnected while possessing a live pawn
Webadmin
We fixed a bug that made the webadmin fail intermittently on some platforms
UnrealScript
We fixed a plethora of accessed nones and UnrealScript-based exploits, crash bugs, and denial-of-service attacks (Thank you Wormbo and Shambler!)
We fixed a bug that could make the SPMA camera explosion loop without stopping (#24)
The PlayerController.AskForPawn function now jumps to the Spectating.Begin state correctly (#10)
The PlayerController.ToggleScreenShotMode function no longer discards user preferences such as the weapon handedness, crosshair visibility, HUD visibility, and the TeamBeaconMaxDist and bHideVehicleNoEntryIndicator settings (#11)
The DeathMatch.InitTeamSymbols function can no longer give multiple teams the same symbol (#16)
We fixed a bug where gibbed players or monsters can be gibbed multiple times by sources of constant damage
We fixed several bugs that made Engine.Canvas incorrectly process newline characters and color codes
We fixed a bug that made the Linux and macOS clients crash when loading font textures with remapped fonts
We fixed a bug that could make the game crash after calling LinkMesh on a new skeletal mesh that uses dynamic hitboxes
We fixed a bug that could make the game crash when you called TerrainInfo.PokeTerrain
Mortar shells should now work correctly on low-grav maps
We fixed a bug that could unexpectedly prevent you from exiting raptor vehicles
Miscellaneous
We now support command lines longer than 1024 characters
Enhancements
Unreal Editor
The Unreal Editor window no longer minimizes when testing a map
The properties window now supports mouse wheel scrolling
You can now expand and collapse items in the properties window using keyboard arrows
The music browser now supports ogg files
You can now import ASE and OBJ models as static meshes
We overhauled the texture compression code and switched to a new texture compression support library (AMD Compressonator). The new code works on all platforms so you can now import compressed textures using UCC make
You can now launch UCC from different folders on Linux and macOS
The mesh browser now has a package combo box and a button to open the mesh properties window
Unreal Editor now embeds the full name of exported textures in the names of the exported files
The sound and material browsers now have a menu option allowing you to export all in-use sounds/materials
The map export dialog now uses the correct map name as the default name of the exported file
You can now use the CTRL+Space hotkey to align the camera to the selected actor
Viewports now refresh when you jump to an actor using the search actor dialog
The editor can now import and export convex volumes
Networking and Netcode
Download messages now include information about the number of packages to download and the percentage of total download completed
The game client now downloads and collates game server information from multiple master servers
Game servers can now connect to multiple community master servers
You can now configure the UCC server query port number for admins. See here for an example of how this can be used on a Windows based UCC server
Demos recorded in offline games will now work with mods that add packages to the package map using Actor.AddToPackageMap
Audio and 3D Rendering
Full screen support is now available in the 64-bit Windows client
You can now cap your frame rate for menus and for offline games using the MaxMenuFrameRate and MaxOfflineFrameRate settings (see Default.ini)
The main menu now renders more appropriately to your screen resolution. (Thank you Risel for help with the images)
The player model now renders in mirror reflections
Vertex models now render in OverlayMaterial
You can now crossfade between two music tracks using MusicEvents
Text-to-speech is now available in the 64-bit Windows client
OpenGLDrv now supports gamma correction even when the game runs in windowed mode
Input and Windowing
The log and terminal windows can now be minimized and maximized
The Unreal Editor log window position now persists through restarts
You can now set the WinDrv.WindowsClient.DirectEnhancedPointerPrecision option to true to enable enhanced pointer precision when using DirectInput-based mouse input
UnrealScript
The game now plays a "drowning" sound rather than "hit underwater" sound when the player is under water and starts losing health (#18)
We added a new console command, stat fpos, that configures the placement of the stat fps output relative to the top-right corner of the screen. See Default.ini: FPSPosX and FPSPosY
We added a new console command is_pi, which returns 1 when running on a Raspberry Pi
We have added more default screen resolutions to the Display menu
We added a new native function, Actor.KRagdollExists, to check if a named ragdoll exists for the actor
Dying players now play their death animation if they do not have a ragdoll
We improved several of the error messages the game logs when encountering errors in UnrealScript code
You can now set the MaxWarnPerFunc option in the [Core.System] section of the ini file to limit how many errors individual UnrealScript functions can log before the game silences them
You can now add asset files (ogg/ka) to the package map using the Actor.AddToPackageMap function
Several HUD and menu elements are now widescreen-aware and will scale correctly at 21:9, 16:9, and 16:10 resolutions
The in-game console's command history now persists across game launches
You can now configure the inactivity time and the effect spawned by weapon lockers
Engine.Actor.GetHumanReadableName() now returns the plain class name rather than the instance name (which sometimes contains a number)
Several Engine.PlayerController functions can now be called from static contexts
Webadmin
The webadmin map list page now shows a sequence number for the maps in the map cycle
Miscellaneous
The game will no longer truncate log files when it crashes
We added a KarmaPath setting to the [Core.System] section of the ini file
The game now reads and writes human-readable text color codes from and to the ini file
The Linux binaries now perform a case-insensitive file search when they cannot open required localization files
The game will now save screenshots in PNG format
Q&A
Some questions might have popped into your head as you read this news. Let us try to answer some of them.
Q: Will the OldUnreal patches be compatible with the latest official version of the game?
A: Yes, for the most part. Unpatched clients can play on patched servers and patched clients can play on unpatched servers.
Most mods should also continue to work as before. The only exceptions are mods that perform game version checks and exclude players with unknown game versions.
Unfortunately, AntiTCC is one of those mods.
Q: As a server admin, how do I ensure that players with the new version can continue to play on my servers?
A: We're aware of a network compatibility problem caused by an unofficial patch.
This problem results in players with the new version not being able to connect to (some) old servers.
You can mitigate this problem by (re)installing the official 3369.3 version of the offending files on your server.
Similarly, players that have installed this unofficial patch might need to reinstall the official 3369.3 files to play on updated servers.
In the meantime, we're looking into an alternative solution that does not require reinstalling the 3369.3 patch.
Q: Will AntiTCC be updated to support the new patches?
A: Yes. Wormbo gave us permission to update AntiTCC. This is still a work in progress, though.
Q: Can I apply the OldUnreal patch to the retail version of the game?
A: On Windows: absolutely. Do keep in mind, however, that we do not support 32-bit CPUs.
On other platforms, your mileage may vary. Patching existing Linux/Mac OS X/macOS installations of the game is possible, but it could require a fair amount of manual effort.
We recommend installing the game from scratch following the instructions we provide in our README.
Q: What are your plans for the near future?
A: We are going to address the rough edges and unfinished features in the new version, and try our best to publish a preview installer and patch ASAP.
In the meantime, we will also work on some quality-of-life improvements and on the long list of editor fixes we want to port over from our other projects.
Q: What is the timeline?
A: We are currently inviting server admins and modders to join our internal tester group. We're aiming to release a public test version within the next two months.
Q: How can I contribute?
A: We will be needing testers in the near future. Keep an eye on our Discord server to see when.
Q: Are you getting paid for this project?
A: No. We're doing this for free because we're fans of the game and we like a challenge. In fact, projects like these cost us a bit of money for server hosting, software licenses and subscriptions, certificates, etc, as we independently operate the games ourselves.
Q: Who is responsible for this project?
A: The main developers of the Windows installer and the patches are Buggie, Marco/Dots, Deaod, Metallicafan212, Piglet, CacoFFF, AnthraX, and Smirftsch.
The patch also includes contributions from Wormbo, Shambler, and Ryan C. Gordon (icculus).
We would also like to thank Epic for making this possible.