Repository navigation
Releases: silver2127/tpf2-multiplayer
Release list
0.7.1.4 (update files)
The update files of TpF2 Multiplayer 0.7.1.4. Players: get the launcher from that page; the launchers download these from the packages release.
0.7.1.4 - big maps load past 99%, safer lobbies, and fixes for joiners
Update based on 0.7.1.3, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.4.
Loading a world
- A big-map host no longer sits at "loading world 99%" for minutes. The big-map terrain cache waits for the first game frame before it stops treating the world as loading, and the multiplayer DLL never told it about that frame. On a PC short of memory every terrain tile then waited up to 2 s, for 3 minutes: the host drew 2 frames a second at 99% while everyone else waited. The cache now sees the game start a few seconds after the load ends.
Joining a running game
- A joiner's catch-up builds what the others built. Construction, fence and terrain commands replayed from the history kept a tag inside their parameters, so a joiner refused them all and its world went its own way from the moment it loaded.
- A planned rail-over-rail crossing gets its junction on every player's game, the builder's included.
- Vehicles bought after a sale bind again. The game reuses a sold vehicle's id; the next vehicle bought into it was skipped, and its line, sale and name commands failed.
- Lines with waypoints match their key within 2 m, and replacing a stop keeps its alternatives.
- The fallback for a live join that does not match loads the save it was sent, instead of ending in an error.
The lobby
- The host reads and hashes the save off its main loop. A dedicated server short of memory stood 13 s reading a 372 MB save, and its joiners called it unreachable and left. Joiners also wait 30 s for a host now.
- One malformed message no longer closes the lobby for everyone, and a message may have at most 8192 pieces.
- A player renamed by the host keeps their letter, their TCP stream and their link.
- A player name with a space no longer breaks the TCP backup link.
- Security fixes: in a password session only a proven frame moves a peer's address; the public server list no longer lets anyone delist or take over other lobbies; long join codes no longer crash the game; broken mod zips no longer fail the whole mod transfer.
Installer
- A refused game folder says why. Next on the folder page did nothing and showed nothing (not Steam build 35924, the GOG build, a foreign alut.dll). The warning about mods with their own DLLs is now a page of its own, and is shown.
What's Changed
- Housekeeping: lint, dead code, docs, Linux build warnings by @tearded in #17
- Review fixes: untrusted input, sync and replication bugs by @tearded in #16
- installer: the mod-DLL warning is a wizard page, and it is shown by @tearded in #19
Full Changelog: 0.7.1.3...v0.7.1.4
v0.7.1.4
Download
| You play on | Get this one file |
|---|---|
| Windows (Steam, game build 35924) | TpF2Multiplayer-Launcher-Windows-Setup.exe -- install it, then Update & play |
| Linux / Steam Deck (the native game or Proton) | TpF2Multiplayer-Launcher-Linux.AppImage -- make it executable, run it, then Update & play |
The launcher installs this version and keeps it up to date. Or install this version directly:
| You play on | Get this one file |
|---|---|
| Windows | TpF2Multiplayer.msi -- close the game, run it |
| Linux / Steam Deck, the Windows game under Proton | install_proton.sh -- run it with sh; it fetches the rest itself |
| Linux, the native game | tpf2mp-linux-0.7.1.4-native.run -- close the game, bash tpf2mp-linux-0.7.1.4-native.run |
| A dedicated server on Linux or a VPS | TpF2Multiplayer-Server-Linux.tar.gz -- unpack it, sudo sh tpf2mp-server/setup_vps.sh; the guide: HOSTING_A_SERVER.md. A Windows server is the MSI above |
The files zip, the Linux .tar.gz, install_proton.py and the checksums are in the update files. The two Source code archives at the bottom are the repository, not the mod. Everyone in a session needs the same version.
0.7.1.4 - big maps load past 99%, safer lobbies, and fixes for joiners
Update based on 0.7.1.3, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.4.
Loading a world
- A big-map host no longer sits at "loading world 99%" for minutes. The big-map terrain cache waits for the first game frame before it stops treating the world as loading, and the multiplayer DLL never told it about that frame. On a PC short of memory every terrain tile then waited up to 2 s, for 3 minutes: the host drew 2 frames a second at 99% while everyone else waited. The cache now sees the game start a few seconds after the load ends.
Joining a running game
- A joiner's catch-up builds what the others built. Construction, fence and terrain commands replayed from the history kept a tag inside their parameters, so a joiner refused them all and its world went its own way from the moment it loaded.
- A planned rail-over-rail crossing gets its junction on every player's game, the builder's included.
- Vehicles bought after a sale bind again. The game reuses a sold vehicle's id; the next vehicle bought into it was skipped, and its line, sale and name commands failed.
- Lines with waypoints match their key within 2 m, and replacing a stop keeps its alternatives.
- The fallback for a live join that does not match loads the save it was sent, instead of ending in an error.
The lobby
- The host reads and hashes the save off its main loop. A dedicated server short of memory stood 13 s reading a 372 MB save, and its joiners called it unreachable and left. Joiners also wait 30 s for a host now.
- One malformed message no longer closes the lobby for everyone, and a message may have at most 8192 pieces.
- A player renamed by the host keeps their letter, their TCP stream and their link.
- A player name with a space no longer breaks the TCP backup link.
- Security fixes: in a password session only a proven frame moves a peer's address; the public server list no longer lets anyone delist or take over other lobbies; long join codes no longer crash the game; broken mod zips no longer fail the whole mod transfer.
Installer
- A refused game folder says why. Next on the folder page did nothing and showed nothing (not Steam build 35924, the GOG build, a foreign alut.dll). The warning about mods with their own DLLs is now a page of its own, and is shown.
What's Changed
- Housekeeping: lint, dead code, docs, Linux build warnings by @tearded in #17
- Review fixes: untrusted input, sync and replication bugs by @tearded in #16
- installer: the mod-DLL warning is a wizard page, and it is shown by @tearded in #19
Full Changelog: 0.7.1.3...v0.7.1.4
v0.7.1.3
Download
| You play on | Get this one file |
|---|---|
| Windows (Steam, game build 35924) | TpF2Multiplayer-Launcher-Windows-Setup.exe -- install it, then Update & play |
| Linux / Steam Deck (the native game or Proton) | TpF2Multiplayer-Launcher-Linux.AppImage -- make it executable, run it, then Update & play |
The launcher installs this version and keeps it up to date. Or install this version directly:
| You play on | Get this one file |
|---|---|
| Windows | TpF2Multiplayer.msi -- close the game, run it |
| Linux / Steam Deck, the Windows game under Proton | install_proton.sh -- run it with sh; it fetches the rest itself |
| Linux, the native game | tpf2mp-linux-0.7.1.3-native.run -- close the game, bash tpf2mp-linux-0.7.1.3-native.run |
| A dedicated server on Linux or a VPS | TpF2Multiplayer-Server-Linux.tar.gz -- unpack it, sudo sh tpf2mp-server/setup_vps.sh; the guide: HOSTING_A_SERVER.md. A Windows server is the MSI above |
The files zip, the Linux .tar.gz, install_proton.py and the checksums are in the update files. The two Source code archives at the bottom are the repository, not the mod. Everyone in a session needs the same version.
0.7.1.3 - joining a running game: fresh saves, no more drop-outs, and a lobby that stops leaking memory
Update based on 0.7.1.2, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.3.
Joining a running game
- A newcomer gets a fresh save. A host's save more than two minutes old is no longer sent to a player who joins: the host takes a new one first. On a slow PC every second of a save's age is about a second more catching up.
- A player missing Workshop mods was sent the whole save again and again (every ~20 s on the dedicated server) while their mods were packed, and never got in. They now get the save once, then their mods.
- The terrain file streamed to a joiner is no longer replaced half way by another player's start. The joiner's game kept reading the half-finished file and computed its terrain itself: minutes at 70% on a big map.
- A catch-up now logs how fast it closes the gap, every ~20 s: the joiner's own speed, the session's, and the time to go.
The lobby
- A finished transfer stayed in memory with its whole file. Every save and terrain file the lobby ever sent was kept until it closed: the dedicated server's lobby reached 17 GB and pushed the game into swap. It now frees each one when its transfer ends.
- A lobby that stalls no longer drops everyone. On a machine short of memory the lobby stood 19 s reading a save, missed the players' pings meanwhile, and dropped every player as silent. Time the lobby itself could not listen is no longer counted against them.
Dedicated server
- Pauses while a player joins an empty server, and runs at 1x at most while someone joins others, instead of running on at the players' speed while the newcomer loads.
- The native Linux plugin host accepts short hooks (5-13 bytes): it refused the terrain sidecar's hook, so the native server wrote no terrain file.
Speed
- Below 1x the command delay follows the session speed, so a click lands sooner when the session runs slowly, and a rise from below 1x is ramped.
Big maps
- The M key no longer opens the minimap by default.
minimap_key=1intpf2_bigmap.cfgturns it back on.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Validation
The lobby changes each have a test that fails on 0.7.1.2: a finished transfer is freed (bulk_tcp self-check), a joiner whose mods take seconds to pack gets the save once (relay_mod_download_test: 3 sends before, 1 now), a second START leaves a running terrain stream alone (test_terrain_stream), a 10-minute-old save is taken again before it is sent (test_fresh_hotjoin_save), and a 19 s stall of the lobby drops nobody (test_lobby_limits). The lobby, transfer, Steam, live-join and dedicated-mode suites pass.
Full Changelog: 0.7.1.2...v0.7.1.3
v0.7.1.2
Download
| You play on | Get this one file |
|---|---|
| Windows (Steam, game build 35924) | TpF2Multiplayer-Launcher-Windows-Setup.exe -- install it, then Update & play |
| Linux / Steam Deck (the native game or Proton) | TpF2Multiplayer-Launcher-Linux.AppImage -- make it executable, run it, then Update & play |
The launcher installs this version and keeps it up to date. Or install this version directly:
| You play on | Get this one file |
|---|---|
| Windows | TpF2Multiplayer.msi -- close the game, run it |
| Linux / Steam Deck, the Windows game under Proton | install_proton.sh -- run it with sh; it fetches the rest itself |
| Linux, the native game | tpf2mp-linux-0.7.1.2-native.run -- close the game, bash tpf2mp-linux-0.7.1.2-native.run |
| A dedicated server on Linux or a VPS | TpF2Multiplayer-Server-Linux.tar.gz -- unpack it, sudo sh tpf2mp-server/setup_vps.sh; the guide: HOSTING_A_SERVER.md. A Windows server is the MSI above |
The files zip, the Linux .tar.gz, install_proton.py and the checksums are in the update files. The two Source code archives at the bottom are the repository, not the mod. Everyone in a session needs the same version.
0.7.1.2 - companies rewritten, much faster big-map loads, no more big-map stutter
Update based on 0.7.1.1, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.2.
Companies (separate companies mode)
The rewrite tested as 0.7.0.8 is now in the release, on every platform:
- Companies belong to players, not to lobby slots. A company is tied to its players' Steam IDs (the lobby name for players without one). A save loaded with a different host keeps everyone in their own company, with their own money and vehicles.
- Every machine decides alike which company a command belongs to. New companies start with the same loan as the first one.
- The COMPANIES tab is rebuilt: your company and its settings on top, the list of companies below, one panel for the selected company.
- Company colours from a palette, one per company. Painting vehicles in the company colour is a switch per company, on by default.
- Delete a company with a company that takes over everything, or Nobody, which sells and removes everything after a warning.
- One headquarters per company, and only the owner can change a building.
- Old saves are migrated: the host keeps their company, every other player gets back the company of their lobby slot.
Big maps load much faster
- The terrain is not computed again on load. Every save now writes
<save>.terrbeside it: each terrain tile's finished height data. Loading that save restores the tiles from it and skips the terrain alignment pass, which took 44-75 s on a 50,000-tile map. On Windows and the native Linux game, a Linux dedicated server included (new there:terrain_sidecar=0intpf2_bigmap.cfgturns it off if it gives trouble). - Joiners get the host's terrain file while they load. It streams to them after START from a host that has one. Each tile is used as soon as it arrives, and the game waits for the rest only when that is faster than computing it. A joiner on a slow connection loads as before.
- The terrain file is written on all cores (it added 12 s to every big-map save) and read on all cores at load.
- The ground-texture index is built faster (up to 2x per tile, identical result).
Big maps no longer stutter
- With little free memory, the game gave back 90% of its terrain at once and rebuilt it in front of the camera: the stutter around big maps. It now gives back only what it needs.
- A load under memory pressure could crawl at one terrain tile a second. Fixed.
- The game counts memory as tight only below 3 GB of free commit (it was up to 10 GB), so it uses more of the memory it has.
commit_tight_mbintpf2_bigmap.cfgsets it by hand.
Joining a running game
- Vehicles waiting at a stop, and cargo unloading from them, are handled in the same order on every machine. Two trucks standing at one stop could be loaded differently on the host and a player who joined, and the game desynced later.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Validation
The terrain file was tested in game on a 36,992-tile save on Windows: both alignment passes skipped, all 73,984 tile versions served, also with the file streamed to a second game. The native Linux code passes 76 tests (including a growing file, a split record and a wait at the pass); its first game use is the project's dedicated server with this release. tools/test_terrain_stream.py tests the transfer on a lossy, reordering connection. The load-memory fix has a test that fails on 0.7.1.1. The ground-texture index matches the game's own code in 156 comparisons. The companies rewrite passed its model, rules and interface tests (0.7.0.8) and is ported to the native Linux game.
What's Changed
- Companies rewritten: player-keyed registry, delete, free colours, one HQ per company by @tearded in #15
Full Changelog: 0.7.1.1...v0.7.1.2
v0.7.1.1
Download
| You play on | Get this one file |
|---|---|
| Windows (Steam, game build 35924) | TpF2Multiplayer-Launcher-Windows-Setup.exe -- install it, then Update & play |
| Linux / Steam Deck (the native game or Proton) | TpF2Multiplayer-Launcher-Linux.AppImage -- make it executable, run it, then Update & play |
The launcher installs this version and keeps it up to date. Or install this version directly:
| You play on | Get this one file |
|---|---|
| Windows | TpF2Multiplayer.msi -- close the game, run it |
| Linux / Steam Deck, the Windows game under Proton | install_proton.sh -- run it with sh; it fetches the rest itself |
| Linux, the native game | tpf2mp-linux-0.7.1.1-native.run -- close the game, bash tpf2mp-linux-0.7.1.1-native.run |
| A dedicated server on Linux or a VPS | TpF2Multiplayer-Server-Linux.tar.gz -- unpack it, sudo sh tpf2mp-server/setup_vps.sh; the guide: HOSTING_A_SERVER.md. A Windows server is the MSI above |
The files zip, the Linux .tar.gz, install_proton.py and the checksums are in the update files. The two Source code archives at the bottom are the repository, not the mod. Everyone in a session needs the same version.
0.7.1.1 - no more desync after joining a running game, dedicated servers with Workshop mods
Bugfix update based on 0.7.1, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.1.
Changes
- Joining a running game no longer desyncs it later. A player who joined and was still catching up could lose track of how far behind the host they were, and the first thing their game did on its own (preparing a spare line for the line editor) was timed in the host's past. The two games then created that line at different times, and a town slowly grew differently on each: a desync many minutes after the join. Every command a joining game sends is now timed from the host's real clock, and the spare line waits until the game has caught up.
- A dedicated server loads a save that needs a Workshop mod it has on disk. A server whose Steam client runs offline refused such a save at every start ("the shared save could not start by itself"). Mods placed in the server's managed Workshop folder are now registered with the game at every start.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Validation
The join desync was traced on the project's dedicated server: of 186 commands in the session, one, the joiner's automatic spare line, applied 35 game units apart on the two games. tools/actions_off_test.py now checks that a host heard a second ago still counts while the joiner runs at catch-up speed (it fails on 0.7.1); the Lua suites that load the command and line code pass. tools/registry_dedicated_test.py checks the dedicated server's Workshop registry at start, and the server loaded such a save after a restart.
Full Changelog: 0.7.1...v0.7.1.1
0.7.1.3 (update files)
The update files of TpF2 Multiplayer 0.7.1.3. Players: get the launcher from that page; the launchers download these from the packages release.
0.7.1.3 - joining a running game: fresh saves, no more drop-outs, and a lobby that stops leaking memory
Update based on 0.7.1.2, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.3.
Joining a running game
- A newcomer gets a fresh save. A host's save more than two minutes old is no longer sent to a player who joins: the host takes a new one first. On a slow PC every second of a save's age is about a second more catching up.
- A player missing Workshop mods was sent the whole save again and again (every ~20 s on the dedicated server) while their mods were packed, and never got in. They now get the save once, then their mods.
- The terrain file streamed to a joiner is no longer replaced half way by another player's start. The joiner's game kept reading the half-finished file and computed its terrain itself: minutes at 70% on a big map.
- A catch-up now logs how fast it closes the gap, every ~20 s: the joiner's own speed, the session's, and the time to go.
The lobby
- A finished transfer stayed in memory with its whole file. Every save and terrain file the lobby ever sent was kept until it closed: the dedicated server's lobby reached 17 GB and pushed the game into swap. It now frees each one when its transfer ends.
- A lobby that stalls no longer drops everyone. On a machine short of memory the lobby stood 19 s reading a save, missed the players' pings meanwhile, and dropped every player as silent. Time the lobby itself could not listen is no longer counted against them.
Dedicated server
- Pauses while a player joins an empty server, and runs at 1x at most while someone joins others, instead of running on at the players' speed while the newcomer loads.
- The native Linux plugin host accepts short hooks (5-13 bytes): it refused the terrain sidecar's hook, so the native server wrote no terrain file.
Speed
- Below 1x the command delay follows the session speed, so a click lands sooner when the session runs slowly, and a rise from below 1x is ramped.
Big maps
- The M key no longer opens the minimap by default.
minimap_key=1intpf2_bigmap.cfgturns it back on.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Validation
The lobby changes each have a test that fails on 0.7.1.2: a finished transfer is freed (bulk_tcp self-check), a joiner whose mods take seconds to pack gets the save once (relay_mod_download_test: 3 sends before, 1 now), a second START leaves a running terrain stream alone (test_terrain_stream), a 10-minute-old save is taken again before it is sent (test_fresh_hotjoin_save), and a 19 s stall of the lobby drops nobody (test_lobby_limits). The lobby, transfer, Steam, live-join and dedicated-mode suites pass.
Full Changelog: 0.7.1.2...v0.7.1.3
0.7.1.2 (update files)
The update files of TpF2 Multiplayer 0.7.1.2. Players: get the launcher from that page; the launchers download these from the packages release.
0.7.1.2 - companies rewritten, much faster big-map loads, no more big-map stutter
Update based on 0.7.1.1, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.2.
Companies (separate companies mode)
The rewrite tested as 0.7.0.8 is now in the release, on every platform:
- Companies belong to players, not to lobby slots. A company is tied to its players' Steam IDs (the lobby name for players without one). A save loaded with a different host keeps everyone in their own company, with their own money and vehicles.
- Every machine decides alike which company a command belongs to. New companies start with the same loan as the first one.
- The COMPANIES tab is rebuilt: your company and its settings on top, the list of companies below, one panel for the selected company.
- Company colours from a palette, one per company. Painting vehicles in the company colour is a switch per company, on by default.
- Delete a company with a company that takes over everything, or Nobody, which sells and removes everything after a warning.
- One headquarters per company, and only the owner can change a building.
- Old saves are migrated: the host keeps their company, every other player gets back the company of their lobby slot.
Big maps load much faster
- The terrain is not computed again on load. Every save now writes
<save>.terrbeside it: each terrain tile's finished height data. Loading that save restores the tiles from it and skips the terrain alignment pass, which took 44-75 s on a 50,000-tile map. On Windows and the native Linux game, a Linux dedicated server included (new there:terrain_sidecar=0intpf2_bigmap.cfgturns it off if it gives trouble). - Joiners get the host's terrain file while they load. It streams to them after START from a host that has one. Each tile is used as soon as it arrives, and the game waits for the rest only when that is faster than computing it. A joiner on a slow connection loads as before.
- The terrain file is written on all cores (it added 12 s to every big-map save) and read on all cores at load.
- The ground-texture index is built faster (up to 2x per tile, identical result).
Big maps no longer stutter
- With little free memory, the game gave back 90% of its terrain at once and rebuilt it in front of the camera: the stutter around big maps. It now gives back only what it needs.
- A load under memory pressure could crawl at one terrain tile a second. Fixed.
- The game counts memory as tight only below 3 GB of free commit (it was up to 10 GB), so it uses more of the memory it has.
commit_tight_mbintpf2_bigmap.cfgsets it by hand.
Joining a running game
- Vehicles waiting at a stop, and cargo unloading from them, are handled in the same order on every machine. Two trucks standing at one stop could be loaded differently on the host and a player who joined, and the game desynced later.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Validation
The terrain file was tested in game on a 36,992-tile save on Windows: both alignment passes skipped, all 73,984 tile versions served, also with the file streamed to a second game. The native Linux code passes 76 tests (including a growing file, a split record and a wait at the pass); its first game use is the project's dedicated server with this release. tools/test_terrain_stream.py tests the transfer on a lossy, reordering connection. The load-memory fix has a test that fails on 0.7.1.1. The ground-texture index matches the game's own code in 156 comparisons. The companies rewrite passed its model, rules and interface tests (0.7.0.8) and is ported to the native Linux game.
What's Changed
- Companies rewritten: player-keyed registry, delete, free colours, one HQ per company by @tearded in #15
Full Changelog: 0.7.1.1...v0.7.1.2
0.7.1.1 (update files)
The update files of TpF2 Multiplayer 0.7.1.1. Players: get the launcher from that page; the launchers download these from the packages release.
0.7.1.1 - no more desync after joining a running game, dedicated servers with Workshop mods
Bugfix update based on 0.7.1, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.1.
Changes
- Joining a running game no longer desyncs it later. A player who joined and was still catching up could lose track of how far behind the host they were, and the first thing their game did on its own (preparing a spare line for the line editor) was timed in the host's past. The two games then created that line at different times, and a town slowly grew differently on each: a desync many minutes after the join. Every command a joining game sends is now timed from the host's real clock, and the spare line waits until the game has caught up.
- A dedicated server loads a save that needs a Workshop mod it has on disk. A server whose Steam client runs offline refused such a save at every start ("the shared save could not start by itself"). Mods placed in the server's managed Workshop folder are now registered with the game at every start.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Validation
The join desync was traced on the project's dedicated server: of 186 commands in the session, one, the joiner's automatic spare line, applied 35 game units apart on the two games. tools/actions_off_test.py now checks that a host heard a second ago still counts while the joiner runs at catch-up speed (it fails on 0.7.1); the Lua suites that load the command and line code pass. tools/registry_dedicated_test.py checks the dedicated server's Workshop registry at start, and the server loaded such a save after a restart.
Full Changelog: 0.7.1...v0.7.1.1
v0.7.1
Download
| You play on | Get this one file |
|---|---|
| Windows (Steam, game build 35924) | TpF2Multiplayer-Launcher-Windows-Setup.exe -- install it, then Update & play |
| Linux / Steam Deck (the native game or Proton) | TpF2Multiplayer-Launcher-Linux.AppImage -- make it executable, run it, then Update & play |
The launcher installs this version and keeps it up to date. Or install this version directly:
| You play on | Get this one file |
|---|---|
| Windows | TpF2Multiplayer.msi -- close the game, run it |
| Linux / Steam Deck, the Windows game under Proton | install_proton.sh -- run it with sh; it fetches the rest itself |
| Linux, the native game | tpf2mp-linux-0.7.1-native.run -- close the game, bash tpf2mp-linux-0.7.1-native.run |
| A dedicated server on Linux or a VPS | TpF2Multiplayer-Server-Linux.tar.gz -- unpack it, sudo sh tpf2mp-server/setup_vps.sh; the guide: HOSTING_A_SERVER.md. A Windows server is the MSI above |
The files zip, the Linux .tar.gz, install_proton.py and the checksums are in the update files. The two Source code archives at the bottom are the repository, not the mod. Everyone in a session needs the same version.
0.7.1 - faster dedicated servers, shorter autosaves, Sandbox towns, a Multiplayer button
Feature update based on 0.7.0.7, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.
Changes
- Dedicated servers run at full speed. A Linux server's simulation had been running at about half speed: every road vehicle entering a road segment cost around 1,000 system calls. It now costs a few, and the engine is back on its normal 200 ms step. The simulation thread went from 82% to 22% of a core on the project's server, with the same results.
- Shorter autosave and join pauses. A save's compression now runs on worker threads instead of the simulation thread, on Windows, Proton and native Linux. On the project's server a 1.2 GB world saves in 3 seconds instead of 7-9, so everyone waits less at every autosave and every hot join. The saved file is unchanged in format and loads as before.
save_threads=0intpf2_menu_flags.txtturns it off. - Big maps load faster on Linux. New terrain was being set up in a way that interrupted every CPU core for each page written; the slowest loading step (at 70%) went from 1-4 minutes to under a minute.
- Less wasted work while loading and on headless servers. The game's Steam status thread no longer spins at full speed during a load (Windows and Linux;
steam_poll_ms=0turns the change off). A dedicated server that draws nothing no longer re-creates its graphics buffers every frame (dedicated_recycle_sets=0turns that off). - Sandbox mode's town tool works in multiplayer. A town placed with it is built on every player's game. Before, only the placing player got it, which caused a desync and then a resync that threw the town away.
- A Multiplayer button in the main toolbar, next to the minimap's. It shows and hides the Multiplayer window, the same as Ctrl+Shift+D.
- The New Game map preview no longer regenerates endlessly. With Big Maps installed (0.7.0.7), the preview threw its map away and started again forever, on every generator and map size.
- Big Maps minimap: it has its own toolbar button, M opens it (except while typing), and its colours follow the map's climate, so dry maps are no longer green.
- A host leaving no longer strands the other player at a quarter speed. In a two-player game where the host left, the remaining player stayed at the slowest speed until they restarted.
- Large saves no longer fail to transfer after 120 seconds over the master server's pipe; they used to fall back to the slower path.
- Fences compatibility can no longer stop the game script: if its file fails to load, multiplayer turns off with a message, as other modules do.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Known limitations
- A cargo filter set while creating a new line (before its first save) is not carried; set it on the line once it exists.
Validation
Measured on the project's dedicated server (Linux, 8 vCPU, a 37,000-tile Big Maps world): simulation step, per-thread CPU, system calls and load phases before and after each change; a multithreaded save checked with zstd -t and a full decompress, then loaded by a joining game and by the server itself. Tests: the page-batched reads and the road sort's batched names against the one-at-a-time path (test_movement_linux, test_train_order_linux); the descriptor recycler against a fake driver (test_descriptor_recycle); the save stream routing against a fake that behaves like multithreaded zstd, and a real round trip in boost's call pattern (test_save_zstd on Linux; save_zstd_win_test and an in-process self-test before patching on Windows); the served generator copy's times (test_generator_memory); the terrain pager's zero fill (test_pager). The Linux libraries are built and tested in the pinned Steam Runtime soldier SDK; the Windows DLLs are built with MSVC.
Full Changelog: 0.7.0.7...v0.7.1
0.7.1 (update files)
The update files of TpF2 Multiplayer 0.7.1. Players: get the launcher from that page; the launchers download these from the packages release.
0.7.1 - faster dedicated servers, shorter autosaves, Sandbox towns, a Multiplayer button
Feature update based on 0.7.0.7, for Windows, Proton and the native Linux game. Everyone in a session, including the dedicated server, must update to 0.7.1.
Changes
- Dedicated servers run at full speed. A Linux server's simulation had been running at about half speed: every road vehicle entering a road segment cost around 1,000 system calls. It now costs a few, and the engine is back on its normal 200 ms step. The simulation thread went from 82% to 22% of a core on the project's server, with the same results.
- Shorter autosave and join pauses. A save's compression now runs on worker threads instead of the simulation thread, on Windows, Proton and native Linux. On the project's server a 1.2 GB world saves in 3 seconds instead of 7-9, so everyone waits less at every autosave and every hot join. The saved file is unchanged in format and loads as before.
save_threads=0intpf2_menu_flags.txtturns it off. - Big maps load faster on Linux. New terrain was being set up in a way that interrupted every CPU core for each page written; the slowest loading step (at 70%) went from 1-4 minutes to under a minute.
- Less wasted work while loading and on headless servers. The game's Steam status thread no longer spins at full speed during a load (Windows and Linux;
steam_poll_ms=0turns the change off). A dedicated server that draws nothing no longer re-creates its graphics buffers every frame (dedicated_recycle_sets=0turns that off). - Sandbox mode's town tool works in multiplayer. A town placed with it is built on every player's game. Before, only the placing player got it, which caused a desync and then a resync that threw the town away.
- A Multiplayer button in the main toolbar, next to the minimap's. It shows and hides the Multiplayer window, the same as Ctrl+Shift+D.
- The New Game map preview no longer regenerates endlessly. With Big Maps installed (0.7.0.7), the preview threw its map away and started again forever, on every generator and map size.
- Big Maps minimap: it has its own toolbar button, M opens it (except while typing), and its colours follow the map's climate, so dry maps are no longer green.
- A host leaving no longer strands the other player at a quarter speed. In a two-player game where the host left, the remaining player stayed at the slowest speed until they restarted.
- Large saves no longer fail to transfer after 120 seconds over the master server's pipe; they used to fall back to the slower path.
- Fences compatibility can no longer stop the game script: if its file fails to load, multiplayer turns off with a message, as other modules do.
Update
Use the launcher: Update & play (Windows and Linux), or install directly: the MSI on Windows, install_proton.sh under Proton, the native .run on Linux. A Linux dedicated server: tpf2server stop, tpf2server install, tpf2server configure, tpf2server start. All participants need the same version.
Known limitations
- A cargo filter set while creating a new line (before its first save) is not carried; set it on the line once it exists.
Validation
Measured on the project's dedicated server (Linux, 8 vCPU, a 37,000-tile Big Maps world): simulation step, per-thread CPU, system calls and load phases before and after each change; a multithreaded save checked with zstd -t and a full decompress, then loaded by a joining game and by the server itself. Tests: the page-batched reads and the road sort's batched names against the one-at-a-time path (test_movement_linux, test_train_order_linux); the descriptor recycler against a fake driver (test_descriptor_recycle); the save stream routing against a fake that behaves like multithreaded zstd, and a real round trip in boost's call pattern (test_save_zstd on Linux; save_zstd_win_test and an in-process self-test before patching on Windows); the served generator copy's times (test_generator_memory); the terrain pager's zero fill (test_pager). The Linux libraries are built and tested in the pinned Steam Runtime soldier SDK; the Windows DLLs are built with MSVC.
Full Changelog: 0.7.0.7...v0.7.1