Getting Started
Install
- Download the build matching your game (
x64orx86— most modern UE3 games arex64, but check your game's.exeif unsure). - Extract
dinput8.dllinto the same folder as the game's.exe(usuallyBinaries/Win64/orBinaries/Win32/). - Create a
Mods/folder in the game root, if one doesn't already exist. - Drop a mod folder (containing a
mod.toml) intoMods/. - Launch the game normally.
MyGame/
├── Binaries/
│ └── Win64/
│ ├── MyGame.exe
│ └── dinput8.dll ← CU3ML
└── Mods/ ← everything CU3ML reads and writes
├── cu3ml.toml ← loader settings (written on first run)
├── cu3ml.addrlist ← cached engine addresses
├── cu3ml.log ← log from the last launch
└── ExampleMod/
├── mod.toml
├── main.lua
└── overrides/
Where Mods/ goes
CU3ML looks for Mods/ two directories above the executable —
Binaries/Win64/MyGame.exe means MyGame/Mods/. It is not next to
the .exe. If your game keeps its executable somewhere else, the same
rule applies: go up two levels from the .exe, then into Mods.
That's it — no launcher, no injector, no extra command line flags. Windows
loads dinput8.dll because the game already expects a system copy of it
for DirectInput; CU3ML sits in that slot and forwards everything the game
doesn't care about straight through to the real DLL.
Note
If the game ships its own dinput8.dll already (rare, but it happens),
CU3ML will look for dinput8.orig.dll next to itself and forward through
that instead. Rename the original file if you hit a conflict.
Verifying it loaded
CU3ML writes Mods/cu3ml.log, recreated from scratch on every launch. On a
successful start you should see something like:
[INFO ] CU3ML mod loader (x64 build)
[INFO ] mod_loader: found 'ExampleMod' v1.0.0 by deadYokai deps=[0] enabled
[INFO ] install_engine_loop_init_hook: GEngineLoop::Init = 0x... (scanned)
[INFO ] engine_loop_init: FArchive slots = ... (validated=1)
[INFO ] override_loader: 2 override(s), 0 new export(s) discovered
[INFO ] lua: VM ready (sol 3.x.x, Lua 5.4.x)
[INFO ] engine_loop_init: ready
If validated=0 shows up instead, the disassembly-based resolver couldn't
confirm the engine layout it recovered — see FAQ.
First launch is the slow one
The first time CU3ML runs against a given .exe it scans the whole image to
find its anchor functions. What it finds is written to Mods/cu3ml.addrlist,
keyed to that executable's timestamp, size and checksum, so subsequent
launches load the addresses directly. Patch or replace the game's .exe and
the cache invalidates itself automatically.
Opening the manager
Launch the game with -cu3ml-manager to get a window before the engine
finishes booting, where you can toggle mods and loader settings and then
either launch or quit. See Manager.
Uninstalling
Delete dinput8.dll and the Mods/ folder. Nothing else changes — no
registry entries, no modified .upk files, no leftover state in the game's
save data.
Next
Head to Mod Format to package your own mod, Lua Scripting to drive the engine from a script, or Architecture if you want to know what's actually happening under the hood.