Releases: c-orter/ModSync
v0.11.1 - Dedicated Client renamed to Headless Client
What's Changed
- Fix plugin not switching into headless mode due to rename of dedicated to headless client in Fika by @JonBons in #14
New Contributors
Full Changelog: v0.11.0...v0.11.1
v0.11.0 - SPT 3.11 Compat
v0.11.0 (2025-03-17)
ONLY COMPATIBLE WITH SPT 3.11
Essentially no changes except to make compatible with SPT 3.11
Bug Fixes
- client: fix corrupted sln file
v0.10.2 - Bug fixing
v0.10.2 (2025-01-02)
Bug Fixes
- client: fix formatting issue with config tooltips and add error handling for config binding (5f6e814)
- plugin: fixed incorrect detection of created empty directories when populated on client (ccd3460)
Features
- config: add name field to syncPaths to allow more descriptive naming of config options (11affa6)
v0.10.1
v0.10.1 (2024-12-31)
Bug Fixes
- client: fix memory leak allocating button textures (76b59c0)
- client: fix skipping when enforced updates are present (23c6a90)
- config: disallow duplicate paths in server config to fix client crashes (bcd1b9b)
- plugin: fix error when downloading an empty file (f10dedd)
- server: fix a folder with all excluded files being considered empty (e978ec0)
Features
- config: show a warning when explicitly excluding a syncpath (just remove it) (ae8ea6b)
v0.10.0 - SPT 3.10 Support
0.10.0 (2024-11-26)
Updated to SPT 3.10
SPT 3.10 is now the only supported version. Please update to use ModSync v0.10.0!
Bug Fixes
- client: Attempted fixes for a couple of cases where fetching hashes would fail
- client: Fix strange semaphore issue I wasn't running into before.
v0.9.1 - Bug Fix
v0.9.0
v0.9.0 (2024-10-25)
⚠ BREAKING CHANGES
- config: Entries specifying previously described SyncPaths will be overridden by the hardcoded defaults
- client & server: Removed .nosync file support. The .nosync system has been superseded by server/client side exclusions checkout the Configuration docs for more info on the new system
- server: Renamed commonModExclusions -> exclusions
Features
- Add support for empty folders (Fixes mods like AmandsSense and Bobby's music player)
- Sync exclusions instead of excluded files to reduce network traffic, size of PreviousSync, and cost of hashing on client
- Client and Server hashing processes have been made properly async to prevent blocking/freezing when loading
- Massive hashing overhaul, moved from CRC to a two-prong solution depending on file size:
* Small files (< 5MB) are hashed directly using Metrohash a tiny, performant non-cryptographic hash function
* Large files (> 5MB) are hashed using an algorithm called ImoHash which uses file size and distributed sampling of files to quickly hash even very large files (bundles lmao)
* Hashing on the server is now done via WASM for near native hashing performance instead of using JS
* Renamed PreviousSync data key from crc -> hash
* Client will now only request hashes for enabled and enforced sync paths reducing network traffic and load while hashing - SyncPaths are now applied in order of specificity and can "overlay" different settings into subdirectories (for example you could enforce BepInEx/config/RealismMod.cfg, while not enforcing the rest of your configs)
- SyncPaths can now override less specific exclusions to "whitelist" files in excluded folders. For example:
* A file or folder in an excluded directory can be added as its own syncPath and will override the exclusion - Added clientside exclusions list. ModSync_Data/Exclusions.json can now exclude files from syncing on the client
* Can prevent files from being added/removed/updated even when present on the server
* Enforced paths will ignore client exclusions - Renamed commonModExclusions -> exclusions
- Removed .nosync file support. The exclusion system has been improved to the point where I think the nosync files were simply less useable. Let me know if you find any edge cases where they would've been better
- Generally improved exception handling to provide more specific error messages and better reproduction information when things go wrong
- client: always dump local hashes to improve debugging for user issues
- config: hardcode plugin dll and updater exe as the mod doesn't work without them
- plugin: increase timeout to 10 minutes when retrying requests
Bug Fixes
- attempt to fix timeout when hashing files
- client: enforced paths will still have their files deleted regardless of client config
- config: add :Zone.Identifier files to default exclusions list
v0.8.2 - Bug fix
v0.8.1 - Hotfix
v0.8.0 - External Updater
0.8.0 (2024-08-09)
ℹ️ Migration Process
The migration process for this update is substantially better as special care has been taken to improve the process. With this update a special "rescue" mode has been added to the server mod that will allow older versions of the plugin to exclusively update itself to the server's version. A typical update process should look something like this:
- Server admin (probably you) will shutdown the server and update all ModSync files on the server.
Remove BepInEx/patchers/Corter-ModSync-Patcher.dll Update BepInEx/plugins/Corter-ModSync.dll Update user/mods/Corter-ModSync Add ModSync.Updater.exe - (Optional) Customize server config (or copy old config) at new location
/user/mods/Corter-ModSync/config.jsonc - Server is restarted - booting up with ModSync 0.8.0
- User connects with version ≤ 0.7.0. User is served "rescue" mode /modsync/paths and /modsync/hashes, exclusively updating ModSync to the latest version.
- User is prompted to restart and apply update.
- Game restarts with new version of ModSync, server exits "rescue" mode, and additional updates are shown. (Possibly meaning a second update in row, users may ask about why they've gotten one right after the other)
🆕 New Features
The config overhaul is finally here! Server admins can now specify a number of options with the sync paths specified in the config.
- enabled (default:
true) - whether or not the client will sync this path by defaultUsers can opt in to these directories through the BepInEx configuration manager (F12). (
user/modsfor instance) - enforced (default:
false) - server authoritative syncingThis mode enables server admins to (more or less) guarantee what files their clients will have. On sync paths with this option enabled any files added by the client will be removed, files modified by the client will be updated, and files removed will be re-downloaded.
These updates cannot be skipped or cancelled.
Note: For enforced paths, any excluded files will have to be present on the server in order to not be deleted by the client. For exampleBepInEx/plugins/sptwill have to be copied onto the server if you want to enforceBepInEx/plugins. These nosync files could be empty text files, as their hash isn't actually checked.
Note: Users could just uninstall the plugin and change files at will. ¯\_(ツ)_/¯ - silent (default:
false) - whether user will be prompted to apply these updatesWhen some silent and some non-silent updates are available to download, these updates will still be shown in the changelog. However, if applied on their own, these updates will be downloaded and the first prompt the user sees will be the restart required screen.
- restartRequired (default:
true) - controls if updates are applied immediately or using the updater outside of game.This can be particularly useful for
user/modsor if admins wanted to sync profiles so users could continue playing offline (though nothing would be synced back to the server). Paired with silent, this leads to updates where users only see the main menu when relevant updates occur.
Other features:
- Client files are now included in the server zip to ease installation.
- The server now reports mime type for downloads, addressing some edge cases with client-side antivirus.
- Server routes are now fully async, and hashing performance has improved after integrating a stream-based CRC library.
- Updates are now moved from the PendingUpdates folder to prevent excessive writes to disk.
⚙️ ModSync.Updater.exe
Virus Total: a095701dceadc4ec15fdb7564d68ce7fecaddde0ffe03a2e1a115a11f4c58268
I finally bit the bullet and created an external updater to replace the prepatcher. This is a pretty basic application that pretty much does the same thing the patcher did. Once the user clicks "restart game" (or the dedicated client finishes downloading files), the updater starts and the following steps are taken:
- Waits for Tarkov to close completely
- Copies updated files from
ModSync_Data/PendingUpdatesinto the SPT folder - Deleted files that have been marked as removed.
- Returns user to the launcher
⚠️ BREAKING CHANGES
- updater: Patcher has been removed. It has been superseded by the updater
- config: config.jsonc is now found under Corter-ModSync directly, not in src, please move your config or update the newly generated one appropriately
- server: format for /modsync/hashes and previous sync data has changed and is now grouped by sync path. ie.
{ "BepInEx\\plugins": { "BepInEx\\plugins\\SAIN.dll": { "crc": 000000000 } } }
Features
- add fallback responses to "rescue" old installations of the plugin (0c4fa8f)
- config overhaul, moved enabled to client, implement enforced (1fa0ec1)
- config: moved config outside src folder and automatically create one on initial start (0e13327)
- migrator: add Migrator to handle upgrading local modsync files to latest versions (dc823af)
- plugin: EFT console command now runs asynchronously to prevent blocking the game thread (a6ed099)
- plugin: force silent mode when dedicated client is detected (db4d07f)
- plugin: update window will only show cancel when non-enforced downloads are present (1f20049)
- updater: change updater type to Exe to allow Console.Writing (1ce38a3)
- updater: implement separate executable for replacing updated files outside of game (3f75529)
- updater: improve updater UI (238a7cc)