JohnM 5bc6a31500 Show the end-of-match killcam to every player, the winner included
The final killcam rarely reached the local screen, whoever made the winning
kill. Three bugs stacked up.

The winner was never seated. The end-of-match killcam script runs the
killcam for every player, so the attacker is forced to spectate itself, and
spectator resolution refused any self target. An archived seat
(archivetime > 0) may now follow the viewer itself. Live spectating and
cycling still skip yourself.

A seat did nothing for a viewer who was still alive, and every survivor is
alive at the end of a match. seat_applies() lets a seat through only when it
is final or the viewer is dead, and the final flag was hardcoded to false.
It now comes from the script's level.showingFinalKillcam when the seat is
read, for archived seats only, so the end-of-match replay is shown to living
players as well. It also feeds the killcam HUD's game-ended state.

The replay lost remote cameras. The AC-130 and Chopper Gunner camera
(linked_weapon_view) and the Predator link (remote_missile) are per-client
rows, not player state, and the seat snapshot kept the viewer's live row, so
the gunship view fell back to a third-person orbit around the body on the
ground. The seat now copies the focus's archived camera rows into the
viewer's row, with the Predator unlink time moved to the live clock. The
rows are None when the archived focus had no remote camera, so the winner's
own live gunship cannot leak into a replay.

While seated on an archived killcam, a player's live body takes no
movement, fire or weapon-switch input. Only end-of-match seats have a
living body. The AC-130's 40 s timeout can clear the remote state between
the win and the killcam, which unfroze the player; the body then walked
around unseen and the view snapped to the new spot when the killcam ended.
Script button reads still see the raw command.

Checked on the Mac (Estate, scr_dm_scorelimit 100): an AC-130 105 mm shot
wins the match and the final killcam shows the thermal gunship view with
the AC-130 HUD and the Killed By card. A bot wins with an AT4 while the
player lives: the player watches the rocket replay under GAME WINNING KILL.
A bot shoots the player: the ordinary killcam is still the attacker's
first-person replay. On our iPhone build in an Estate match, the final
killcam played after the win and its timer counted down.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:22:07 +10:00
2026-09-13 13:52:33 +03:00
2026-09-13 13:52:33 +03:00
2026-10-08 12:33:49 +08:00
2026-09-13 13:52:33 +03:00
2026-10-08 12:33:49 +08:00
2026-10-08 12:33:49 +08:00
2026-09-13 13:52:33 +03:00
2026-09-13 13:52:33 +03:00
2026-09-13 13:52:33 +03:00
2026-09-13 13:52:33 +03:00

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.

Bomb planting in IW4L Tanker explosion in IW4L

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

  1. Download iw4l-windows.zip from Releases and extract it into an empty writable folder. The archive password is t.me/contextrot.
  2. Launch iw4l.exe. It finds MW2 in your Steam libraries and creates a Modern Warfare 2.lnk shortcut 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

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.

S
Description
No description provided
Readme Apache-2.0 21 MiB
Languages
Rust 99.3%
Common Lisp 0.5%
Makefile 0.1%