New features
Server-side anti-cheat for multiplayer hosts
Multiplayer hosts now reject game data that a normal game never sends, which is how some cheats kill other players "by the Guardians", and can kick the player who sent it. Legitimate map hazards still work.
Set anti_cheat under [defaults] or in a [[server]] block in dedicated.toml, then restart:
"detect": reject cheat traffic and log it."enforce"(default): also kick the player who sent it, with the usual kick cooldown (10 minutes for a first kick, longer for repeats). No automatic bans."off": disable these checks.
RECLAIMER_DEDICATED_ANTI_CHEAT sets the default as well. RCON status shows the policy, and cheat events report rejections. Omitting anti_cheat keeps protection enabled; it is strictly opt-out.
Player-hosted lobbies also enable protection by default. Turn Host Game > Host Settings > Anti-cheat off or on, then Apply Changes. The setting is saved and takes effect without a restart.
For maps or game types with unusual physics or scripts, a playlist can turn the anti-cheat off for single games: uncheck Anti-cheat for the selected game in the playlist editor, or add "anti_cheat": false to its entry in the playlist file. Other games in the rotation stay protected. See Anti-cheat in the hosting guide.
Choose whether players can join a co-op mission in progress
In a campaign co-op lobby, Host Settings → Join missions in progress decides whether players can join while a mission is being played. It is on by default. Turn it off and players can only join while the lobby is between missions: anyone trying during a mission is told to join once the game is back in its lobby, and the server browser marks the game IN MISSION. Players who drop out mid-mission also wait for the lobby.
Campaign enemy scaling and a 16-player co-op limit
Open Campaign modifiers when choosing a mission, or Modifiers in the co-op lobby. Set enemy health and damage independently from 0.25× to 10×, with an optional 0–100% increase per additional player. Health also scales shields. Defaults keep the usual difficulty balance.
Modifiers follow the mission into checkpoints, resumed games and the next mission. Co-op guests use the host's choices. Campaign hosting now offers at most 16 players, including split-screen players.
Everyone in a network game needs this updated build; older clients are refused before joining.
Kicks and bans follow the device across profile resets
Kicking or banning a connected player now also covers their device where possible, alongside their player ID and IP. Successive kicks last 10, 30, 60, then 120 minutes, staying at 120 minutes. They reset after 24 hours without another kick, or when the hosting session restarts. Bans link all three: use the existing unban command with any one of them to lift the whole ban. A device ban survives profile and address changes, so players who share a PC share its bans. Update clients and all servers sharing the ban list together. Old unlinked entries remain independent.
Start a new round in Forge
Solo players and listen hosts can choose Start New Round in the Forge pause menu to reset the world with their current map edits. Save your map before leaving to keep those edits for another session.
Forge object sources
The Forge Objects list marks every entry as stock, built-in or mod content. Select or hover a mod object to see its package and map, and the download requirement for other players. Source names can also be searched. Objects native to a mod map carry its source too.
Kick and ban players in your own games
Hosts of player-hosted multiplayer and campaign lobbies can now remove players the way dedicated server admins do. Tap Tab to pin the scoreboard and use KICK or BAN on a player's row, or open a player's details in the lobby; /kick and /ban work in chat too. When votes are on, other players get VOTE KICK. Your bans are kept in host-bans.json in your Project Reclaimer folder, beside profile.json, and apply whenever you host again.
Kicks and bans now cover a player's IP address as well as their player ID, on dedicated servers too, so /banip does the same as /ban.
Turn away players whose ping is too high
Hosts can set a Max ping in Host Settings (from 50 to 500 ms, or No limit, the default): players whose ping to the game is higher can't join, and are told their ping and the limit. The ping is only checked as a player joins, so a lag spike later never removes anyone, and a brief spike while joining doesn't count either. Players on the host's own PC are never limited.
Dedicated servers set max_ping (in milliseconds) per server or under [defaults] in dedicated.toml, or with RECLAIMER_DEDICATED_MAX_PING; the remote console's maxping command shows or changes it until the server restarts. The server browser shows a server's limit, and marks it PING LIMIT when your ping is over it.
Forge objects and primitives on mod maps
Forge on a mod map now has every map's Forge objects, the primitives (with the mod map's own surfaces) and the AI spawners, like Forge on Halo 3's own maps. This includes Steam Workshop maps made with the Halo 3 Editing Kit. In Host Game, pick the mod map under Map and Forge under Game type. Saved maps keep the objects they place in every game type, and players who join merge the same objects into their own copy of the mod. The first Forge lobby on a mod map takes a few seconds longer to prepare than on Halo 3's own maps.
Forge maps saved on a mod map are now listed under that map in Select map and can be hosted from there, including maps shared by other players and maps saved while playing on someone else's server. Before, such maps were missing from the map's list or refused unless the mod was in exactly the same folder as on the PC that saved them.
Join servers that have another version of your Workshop mods
Players who had a server's mod from Steam Workshop, but in another version than the server's, could not join: the mod was marked as clashing with one on their PC, with no way forward. Required mods now compares the two versions:
- When the server has a newer version, UPDATE & JOIN has Steam update your copy, then joins.
- When the server's version is older, the window says so with both dates. Steam only installs a mod's newest version, so the server has to update.
- A version you downloaded from another server makes way for this server's: REPLACE & JOIN moves it to the Recycle Bin and downloads the server's version.
Dedicated servers now keep the Workshop mods they install up to date. They look for new versions every hour (update_check_minutes under [workshop] in dedicated.toml), download them while the games go on, and switch over once no server using the mod has players, restarting those servers. dedicated check lists each mod's version and whether Steam has a newer one.
Dedicated servers block VPNs
Dedicated servers now refuse players who connect through a VPN, proxy or hosting provider, so a banned player can't simply come back from another address. It is on by default, also for servers set up before this release. Admins and players on the server's own network are never refused.
- Turn it off with
block_vpn = falseunder[defaults]indedicated.toml(or in one[[server]]block), orRECLAIMER_DEDICATED_BLOCK_VPN=falsein Docker. - Let a player through anyway, such as someone on a cloud gaming PC:
project-reclaimer dedicated vpn allow <player ID>, orvpnallowin the remote console. Refused players appear in the server log and as arefusedRCON event with their player ID. project-reclaimer dedicated vpn check <address>tells whether an address is refused and which list names it.
Servers fetch open lists of VPN and datacenter networks twice a day and match addresses on the server itself; no player's address is sent anywhere. Add your own lists under [vpn] lists. See VPN blocking in the hosting guide.
Changes
-
Dedicated servers keep a steady 60 frames a second on less processor. A server waited for each frame with a whole-millisecond sleep. On Windows it often overslept, so servers ran a few frames a second slow with a 30 ms frame every so often; under Wine it woke early and spun a processor for the rest of the frame. Servers now sleep precisely to the next frame. The server's own per-frame work also reads the game's memory directly instead of through a system call per read (about a thousand a frame in a 32-player game), so a server uses about a sixth less processor per frame. Players' games read it the same way.
-
Dedicated servers use less processor time. Every frame a server copied its whole game state, about 13 MB, for a renderer that dedicated servers never run. They no longer do: a full 63-player server spends a tenth to a fifth less of its main thread, and several servers on one machine stop competing for that memory bandwidth.
-
Dedicated servers use half the memory. A dedicated server loaded all of its map's textures, though it never draws them: about 650 MB of the 1.2 GB a server used during a game. Once a map has loaded, the server now gives that memory back, so a server in a game uses about 0.6 GB and more servers fit on one machine.
-
Prefer the default masters' server listings. The server browser now uses only the default masters' listings whenever they return valid servers. Other masters are used as a fallback when the defaults are unreachable or have no valid listings. Saved favorites are still checked directly on every refresh.
-
Docker: one container per server. The Docker setup now runs each server in a container of its own, so each gets its own Wine server and its own share of the processor, and a server that restarts never touches the others. The new
compose.yamlhas a service per server (server-1,server-2, …) on the host's network: add a service for each[[server]]indedicated.toml, and open the servers' ports in the machine's firewall. The containers share one server browser master, as servers on one Windows machine do. Hosts that cannot use host networking keep the old layout ascompose.single.yaml; moving from it, rundocker compose up -d --remove-orphansonce.RECLAIMER_DEDICATED_ONLYpicks which servers of adedicated.tomladedicatedprocess runs, by position, name or port, outside Docker too. -
Explain failed server browser queries. When master servers respond but no game servers appear, the browser now shows an example query error. Individual failures are recorded in
client.log, including whether the connection failed, the status reply timed out, or the reply could not be displayed. -
Scale server browser queries with CPU capacity. The server browser now queries up to eight game servers at once per available logical CPU core, instead of a fixed 48. If the core count cannot be detected, it queries eight servers at once.
-
Everyone in a game needs 0.9.2. Players and servers on this version can't play with those on 0.9.1 or older; the game says which side needs to update. Update dedicated servers and players together.
Bug fixes
-
Smoother 64-player servers. Big servers spent a quarter of their time on bookkeeping for every packet they received, work that grew with the square of the player count. A full server now handles each packet with almost none of it, which keeps its game steady when every slot is taken. Docker and Linux (Wine) servers no longer split most packets in two on the way out. When a player's connection hiccups, the server now drops game updates that have gone stale instead of queueing them for seconds, so players see fewer lag spikes and less rubber-banding.
Dedicated servers that cannot keep up now say so: while players are on, a server that often drops below its 60 frames a second logs
Server falling behindonce a minute with its frame rate. Its players get fewer updates; give the server more processor time (fewer servers on one machine) or fewer players. -
Other maps' Forge objects placed after a player joined work for that player. In a shared Forge session, an object from another map (a primitive, an Elephant, Chillout's energy blocker, …) whose kind was first placed after a player joined wasn't counted in that player's Forge menu, and their monitor couldn't select it. Every player now gets the object's kind as the host does.
-
Keep added objects when a late joiner saves a Forge map. Saving after joining an ongoing Forge session no longer silently drops placed objects whose object type was added after the session started, including their scripting properties.
-
Keep saved Forge objects tied to the shared palette. A saved Forge map played right after Forge on the same map, by a host or by a server moving from Forge to the map saved there, could show other objects in place of the saved ones for everyone in the game: primitives and other maps' objects turned into forklifts, shield doors, bridges and the like. Each game now loads the map with exactly the objects it was saved with.
Saved objects now resolve against the palette that actually loaded, including after optional donor removal or growth of a mod's own palette. Frozen-object and sky changes prepare a fresh merge. Mod maps retain their native palette and receive the installed stock multiplayer objects through the shared Forge library; preparation errors block launch instead of silently loading a reduced palette. A missing required object is reported before the map starts.
-
Starting points no longer act as respawn points. Halo 3 starting points are reserved for the first spawn of a round. Later deaths use respawn points, preserving team assignments and the game's normal spawn selection.
-
One player stuck loading no longer holds up a whole server. Between games, a player whose game kept its connection but could not finish getting the next map ready or loading it (a laptop gone to sleep, a game slowed to a crawl) kept everyone else on the loading screen ("Synchronizing players") or in the lobby until an admin removed them. On playlist servers, a player whose game could not prepare the next map, or had not within two minutes, shut the server down, and everyone saw the host leave.
Now such a player is removed after 30 seconds and the others play. The removed player reads why, goes back to the main menu and can join again at once. Dedicated servers set the time with
load_timeout(seconds) per server or under[defaults]indedicated.toml, or withRECLAIMER_DEDICATED_LOAD_TIMEOUT;load_timeout = 0waits as long as it takes.A player removed from a lobby while their game was still loading the next map also returns to the main menu now, instead of staying on the loading screen.
-
Clearer MCC installation requirements and startup recovery. Startup now explains that both Halo 3 Campaign and Halo 3 Multiplayer must be installed and lists missing required files before launching the game. If MCC cannot be found or the detected installation is incomplete, select OK to browse for another installation. A valid selection is remembered for next time. You can also change it under Settings → Folders.
-
Safer online games against modified servers and players. A modified server or player could send data that crashed other players' games or damaged their memory. Games now check that data before using it, in multiplayer, Forge and campaign co-op, and a damaged co-op join message no longer closes the game.
-
Menus, chat and loading screens show properly on Linux (Proton). Playing through Proton or Wine, parts of the menus, chat and loading screens could be missing, or sit on a large black box over the game. They now show as they do on Windows. If they still look wrong, set
RECLAIMER_UI_COMPOSITION=window %command%in Steam's launch options to go back to the old way, and let us know your Proton version and desktop. -
The stats service builds on Linux again. Building
stats-serveron Linux stopped with a missing Windows library. It builds and runs there again:cargo build --release --no-default-features --bin stats-server.
Install
The game client requires Halo: The Master Chief Collection with Halo 3 installed; no game files are included.
Double-click project-reclaimer-v0.9.2.exe to start the game. It finds Halo 3 in any Steam library and opens without a console window; its log is Documents\My Games\Project Reclaimer\Logs\client.log.
For remote server administration, double-click reclaimer-rcon-v0.9.2.exe, enter the host, RCON port and password, and connect. The RCON client needs no game installation. See the attached RCON.md for setup and commands.