A body whose death animation carried it past an edge stayed in the air at its death height, until newer deaths recycled the slot. The open side of the cliff stairs on mp_estate showed it often. phase_run_corpse_move set a body resting (TR_INTERPOLATE, not falling) after every unblocked animation step and never looked for ground there. Its only downward probe ran for ragdolls, which never start, and its test was reversed. One body's server tick is now step_corpse: - on the ground only the animation step's x/y moves the body. It follows the ground down by up to a stair step (18 units), so it goes down slopes and stairs without hopping. With nothing within a step below it falls from rest, so it goes over an edge instead of floating; - in the air the trajectory keeps its clock and speed, so gravity builds, and the animation step is added to its base once; - a falling body that meets a wall slides down it with the vertical speed it had and lands. Before, it restarted its fall from rest every tick and stood pinned against the wall for up to a second; - a body stopped part way on the ground moves its trajectory base with it, so clients draw it where it stopped. The clone velocity clamp now holds x and y to 80 in both directions. Before, only +x and +y were held, so a body thrown toward -x or -y flew further. Seen on the Mac (mp_favela, seven point-blank shotgun kills of a bot on an open terrace, pb_shotgun_death_back2): the body travels 106-111 units (the clip's root motion is 120), drops over the terrace edge, lands after 0.35 s and slides down the slope without falling again. Against a wall it slides down and lands in 0.2 s. A player killed 300 units up lands in 0.8 s. On an iPhone build, bodies killed on the mp_estate cliff stairs dropped onto the slope, and point-blank shotgun kills on mp_favela flew back a little and dropped. There is still no ragdoll, so the death clips' root motion still moves the body, their end poses (legs up, headstands) remain, and limbs can still reach into walls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IW4L
IW4L is an open-source runtime for Call of Duty: Modern Warfare 2 (2009), written in Rust with Bevy. Point it at a copy of MW2 you already own and it loads that installation's maps, models, textures and weapons into its own engine. You can try implemented movement and combat on multiplayer maps, then inspect or change how those systems work.
What you can try
Explore maps, fight bots, and record and replay demos. Gameplay remains incomplete; expect missing behavior, bugs and desyncs. The asset readers also cover MW3 and Black Ops.
APIs, configuration, caches and the wire protocol change between commits; multiplayer peers must run the same build.
Windows: prebuilt release
- Download
iw4l-windows.zipfrom Releases and extract it into an empty writable folder. The archive password ist.me/contextrot. - Launch
iw4l.exe. It finds MW2 in your Steam libraries and creates aModern Warfare 2.lnkshortcut next to itself. For an install outside Steam, create that shortcut to your MW2 folder yourself.
For online play, put the .iw4l-server file you received from a server operator next
to iw4l.exe. With it the game finds that master and updates itself on launch. Details:
Windows guide.
Build and run
Install Rust through rustup and GNU Make. Build dependencies cover Linux's C/C++ toolchain and system libraries, and macOS's Xcode command line tools. Windows instructions cover building and arranging a portable folder.
You need your own installed MW2 Multiplayer data. IW4L
distributes no game assets and reads installations without patching or replacing their
files. Caches, demos and logs go under iw4l-artifacts/; Linux settings use a separate
configuration directory described in the run guide.
From the repository root:
cp .env.example .env
# Edit .env: set IW4L_GAMES to the folder containing your game installations.
make map mp_boneyard CMDS='wait world; spawn 0; force_match_start; bot add 3'
This builds the optimized play profile and starts a local match with three bots.
force_match_start skips the warmup that otherwise freezes movement.
Inside the engine
| Area | Implementation |
|---|---|
| Assets | Native FastFile readers convert game data into a shared intermediate representation. |
| Shaders | Retail Direct3D 9 Shader Model 3 bytecode is translated to WGSL. |
| Rendering | World geometry, models and effects feed one sorted draw-surface list. |
| Simulation | Server authority, client prediction and replay share one simulation step over explicit Bevy ECS state. |
| Networking | Custom UDP traffic; a QUIC master provides browsing and relaying. The host simulates the match. |
Where to go next
- Run guide: console commands, classes and demo playback; master setup for playtests.
- Rendering and simulation: inspect the engine's implementation.
- Map loading, GSC runtime and bot AI: starting points for experiments and modifications.
- Documentation index, contributing and security reports.
This whole project is written by an LLM.
Acknowledgements and license
Thank you to all contributors for code, bug reports, testing and feedback. Special thanks to ju1cedr1nker and silvernote03 for QA testing weapons, maps, attachments and other gameplay features.
OpenAssetTools and its iw4x-x64 fork informed asset layouts; IW4x informed asset and protocol behavior; KisakCOD informed engine structure. Ghidra was used to inspect the original binaries.
Movement implementation history and source boundaries are recorded in its provenance note.
IW4L's source is licensed under Apache 2.0. Preserve required attribution and bundled font license texts when redistributing; see NOTICE. Original game assets and trademarks belong to their owners. IW4L is unaffiliated with them.

