A modern administration solution for Unreal Tournament 2004 servers, consisting of a server-side mutator that exposes a TCP API and a Flutter-based mobile app for remote server management.
- TCP API Server - Exposes server controls via a simple JSON-based protocol
- Passcode Authentication - Secure access with configurable password
- In-Game Configuration - Edit settings directly from the UT2004 host game menu
- Real-time Server Control:
- Broadcast messages to all players
- Kick players
- Change maps
- View server status
- List connected players
- Get available maps
- Cross-Platform - Built with Flutter, supports Android (iOS ready)
- Connection Management - Save and manage multiple server connections
- Auto-Reconnect - Automatically reconnects after map changes
- Dashboard - View server status, player count, current map
- Player Management - View and kick players
- Map Control - Browse and change maps
- Broadcast Messages - Send messages that appear on players' HUDs
-
Copy Files to UT2004:
- Copy
Mutator/Classes/*.uctoUT2004/UTAdmin/Classes/ - Copy
Mutator/System/UTAdmin.utoUT2004/System/ - Copy
Mutator/System/UTAdmin.initoUT2004/System/(optional)
- Copy
-
Add to EditPackages (UT2004.ini):
[Editor.EditorEngine] EditPackages=UTAdmin
-
Configure the Mutator:
Edit
UT2004/System/UTAdmin.ini:[UTAdmin.UTAdmin] AdminPasscode=your_secure_password_here AdminAPIPort=7778
-
Enable the Mutator:
Option A - Command Line:
UT2004.exe DM-Rankin?Game=XGame.xDeathMatch?Mutator=UTAdmin.UTAdmin -server
Option B - In-Game:
- Start UT2004
- Go to
Host Game→Mutators - Find
UT Admin APIin the list - Click
Configureto set your password and port - Add to active mutators
- Start your server
If you modify the source code:
- Place source files in
UT2004/UTAdmin/Classes/ - Add
EditPackages=UTAdmintoUT2004.iniunder[Editor.EditorEngine] - Run:
ucc.exe make - The compiled
UTAdmin.uwill be inUT2004/System/
- Flutter SDK 3.0 or higher
- Android Studio / Xcode (for mobile deployment)
- Android device or emulator
-
Navigate to the Flutter app directory:
cd FlutterApp -
Install dependencies:
flutter pub get
-
Configure Android SDK (if needed):
Edit
android/app/build.gradle.ktsto ensure:compileSdk = 36 minSdk = 21 targetSdk = 36 ndkVersion = "27.0.12077973"
-
Build and run:
For Android:
flutter run
Build APK:
flutter build apk --release
The APK will be in
build/app/outputs/flutter-apk/app-release.apk
- Launch the UTAdmin app
- Enter your server details:
- IP Address: Your server's IP (e.g.,
192.168.1.100) - Port: API port (default:
7778) - Password: The passcode set in
UTAdmin.ini
- IP Address: Your server's IP (e.g.,
- Tap Connect
Once connected, you can:
- Dashboard: View real-time server information
- Players: See connected players and kick troublemakers
- Maps: Browse and change maps instantly
- Broadcast: Send messages that appear on all players' screens
- Status: View detailed server status
The mutator uses a simple line-based JSON protocol over TCP:
Authentication:
CLIENT: AUTH your_password
SERVER: {"status": "authenticated"}
Available Commands:
PING - Keep-alive check
STATUS - Get server info
PLAYERS - List connected players
MAPS - List available maps
KICK <player_name> - Kick a player
CHANGEMAP <map_name> - Change to specified map
SAY <message> - Broadcast message to all players
Example Python Client:
import socket
import json
s = socket.socket()
s.connect(('192.168.1.100', 7778))
# Authenticate
s.send(b'AUTH changeme\n')
response = s.recv(1024).decode().strip()
print(json.loads(response)) # {"status": "authenticated"}
# Broadcast message
s.send(b'SAY Hello players!\n')
response = s.recv(1024).decode().strip()
print(json.loads(response)) # {"status": "Message broadcasted"}
s.close()| Option | Default | Description |
|---|---|---|
AdminPasscode |
changeme |
Password for API access |
AdminAPIPort |
7778 |
TCP port for the API server |
Security Note: Always change the default password before running on a public server!
When adding the mutator via the UT2004 UI, you can configure:
- API Passcode: Set your secure password
- API Port: Change the listening port if needed
Server won't start with mutator:
- Check
UT2004.logfor errors - Ensure
UTAdmin.uis in theSystem/folder - Verify
EditPackages=UTAdminis inUT2004.ini
Can't connect to API:
- Verify the server is running:
netstat -an | grep 7778 - Check firewall settings
- Ensure the port in
UTAdmin.inimatches your connection settings
Build fails on Android:
- Update Android SDK to version 36
- Install NDK version 27.0.12077973
- Run
flutter cleanthenflutter pub get
Connection timeout:
- Verify server IP and port
- Check network connectivity
- Ensure mutator is loaded on the server
Authentication failed:
- Double-check the password matches
UTAdmin.ini - Password is case-sensitive
UTAdmin/
├── Mutator/
│ ├── Classes/ # UnrealScript source files
│ │ ├── UTAdmin.uc
│ │ ├── UTAdminAPIServer.uc
│ │ ├── UTAdminConnection.uc
│ │ └── UTAdminMessage.uc
│ └── System/ # Compiled mutator
│ ├── UTAdmin.u
│ └── UTAdmin.ini
└── FlutterApp/
├── lib/
│ ├── main.dart
│ ├── utadmin_client.dart
│ ├── screens/
│ └── widgets/
├── android/
└── pubspec.yaml
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
- UTAdmin: Main mutator class, initializes the API server
- UTAdminAPIServer: TCP listener that spawns connection handlers
- UTAdminConnection: Handles individual client connections and commands
- UTAdminMessage: LocalMessage class for on-screen HUD messages
- utadmin_client.dart: Core API client with connection management
- screens/: UI screens for different functions
- widgets/: Reusable UI components
This project is provided as-is for use with Unreal Tournament 2004.
Created for the UT2004 community. Built with UnrealScript and Flutter.
For issues, questions, or contributions, please visit the GitHub repository.
Enjoy managing your UT2004 server from anywhere! 🎮📱