ConditionalConfigSync
Shared config synchronization and server policy library for Valheim mods. Installed as a dependency and compatible with Jotunn and ServerSync.1.0.4
- fixed a Visual Studio CPS
LimitedFunctionalityproject-tree error by removing the importedThunderstore.targetsfile from the SDK defaultNoneitem list while keeping it as an explicit MSBuild import - fixed the 1.0.4 source build against the existing Unity reference set by removing an unnecessary
Canvas.ForceUpdateCanvases()call from connection-error layout normalization - fixed optional client-side CCS consumers remaining in a fail-closed replica state when the connected server does not provide that mod; after successful
PeerInfo, the instance now returns to local config ownership without raisingInitialSyncCompleted - classified version-check failures as a missing handshake, missing protocol metadata, protocol mismatch, invalid version data, or a specific mod-version range mismatch
- changed connection-rejection diagnostics to unconditional error logs so disconnect causes are recorded even when debug logging is disabled
- added the remote client identifier, reported Conditional Config Sync package version, protocol, and handshake timing to version-check logs
- kept received version-handshake state per peer so simultaneous connections cannot overwrite the diagnostics used for another client
- added an optional trailing Conditional Config Sync package version to the compatible protocol 1 handshake without changing the wire protocol version
- sends one bounded structured English disconnect report with a report ID and explicit reason codes before the vanilla version error
- associates pending disconnect reports with one client connection attempt, preserves them across the failed
ZNetshutdown, and clears them after success, display, a new attempt, or timeout - appends CCS diagnostics to the existing Valheim error text before Jotunn and ServerSync process it, preserving Jotunn's separate compatibility window
- only augments the connection error when an explicit report belongs to the current CCS rejection, avoiding speculative CCS text for unrelated
ErrorVersionfailures - normalizes the vanilla connection-error layout one frame later without repeatedly moving the confirmation button
- records malformed version-handshake packages and improves reporting when a required remote mod did not process the shared version RPC
1.0.3
- fixed initial handshake buffering so vanilla
PlayerListandAdminListare delivered afterPeerInfo, preservingLocalPlayerIsAdminOrHost()and the initial player list
1.0.2
- exposed a structured policy-control availability state so configuration UIs can distinguish a missing compatible server session from missing administrator access
- renamed the public package metadata type from
PluginSelfInfotoPluginInfoCCS - added public read-only effective synchronization metadata for configuration UIs and diagnostics
- exposed normalized default ownership, effective ownership, policy initialization, hidden state, and effective ownership overrides
- effective ownership falls back to the normalized mod default until policy state is initialized
- added an administrator-authorized API for toggling individual Conditional settings between server and client ownership
- policy changes requested by compatible configuration UIs are persisted as minimal exact-setting rules in SyncPolicy.cfg
- fixed-mode settings and unauthorized clients cannot use the policy toggle API
- compatible servers advertise policy-control support through an optional extension of the existing lock-exemption entry
- no network protocol changes
- fixed stale configuration-manager permissions by failing closed during connection and re-evaluating read-only metadata after initial synchronization
- added a high-priority runtime guard that restores protected BepInEx config values before an unauthorized change notification can be processed
- removed local fallback presence from write authorization; effective ownership, initial sync, admin status, server lock, and explicit unlocked-update opt-in now determine writability
- changed
AllowClientConfigUpdatesWhenUnlockedto a secure disabled-by-default opt-in for non-admin clients - hardened server-side client update validation with ready-peer checks, per-entry ownership and permission checks, duplicate/unknown/trailing-data rejection, and all-or-nothing parsing before application
- client updates no longer send authoritative config state; matching legacy state claims remain accepted only as non-authoritative compatibility validation
- stopped forwarding original client packages and now redistribute canonical values and server-computed state to every client, including the initiator
- added rate-limited authoritative correction or full resynchronization after rejected client updates
- added explicit accepted/rejected client-update audit logs with sender and authorization state
- ensured an already registered locking entry is upgraded to protected always-server-controlled state
- stabilized the public core assembly identity at
1.0.0.0for compatible 1.x releases while retaining current file and informational versions - renamed the policy reload summary tag from
[Policy]to[SyncPolicy] - added comprehensive architecture, rationale, compatibility, security, test, and release context in
PROJECT_CONTEXT.md
1.0.1
- renamed PluginInfo class to resolve conflict with BepInEx class with similar name
1.0.0
Initial release of Conditional Config Sync, a standalone shared dependency for Valheim mods.
For players
- Provides synchronization infrastructure for mods that declare Conditional Config Sync as a dependency.
- Adds no gameplay content, items, UI, or standalone configuration of its own.
- Can run alongside Jotunn and mods that use ServerSync without replacing, modifying, or intercepting either library.
- Keeps synchronization fixes centralized, so dependent mods can receive runtime fixes by updating this package.
For server administrators
- Provides three setting ownership modes:
AlwaysServerControlled,Conditional, andAlwaysClientControlled. - Supports exact-setting and whole-section ownership rules through
ConditionalConfigSync.SyncPolicy.cfg. - Supports exact-setting and whole-section visibility rules through
ConditionalConfigSync.HiddenConfigs.cfg. - Loads policy during server startup and applies stable file changes at runtime on the Unity main thread.
- Provides a protected locking setting with administrator exemption and non-admin write validation.
- Includes
status,policy_reload,policy_validate, andpolicy_dumpcommands for policy operation and diagnostics. - Synchronizes regular BepInEx configuration values and runtime custom values with bounded payloads, fragmentation support, and explicit rejection errors.
- Restores local client values and ownership state correctly when policy changes or the server connection ends.
For mod authors
- Distributed as a standalone BepInEx hard dependency; reference
ConditionalConfigSync.dllinstead of embedding or ILRepacking a private copy. - Provides familiar
ConfigSync,SyncedConfigEntry,CustomSyncedValue, andVersionCheckAPIs with XML IntelliSense documentation. - Lets each mod explicitly require a compatible copy on the remote client or server through the documented
ModRequiredoption. - Supports one-call bind-and-register overloads that assign ownership before registration.
- Provides fixed and policy-controlled config modes for shared mechanics, client-local presentation, and administrator-selectable behavior.
- Provides state-like and sequenced custom values, priorities, equality comparers, explicit assignment modes, and
ISerializableParametersupport. - Uses TOML conversion for regular BepInEx entries and length-prefixed package entries for safer parsing and forward handling.
- Provides lifecycle, policy, lock, connection-reset, rejection, and initial-sync events.
- Supports late registration, automatic resynchronization, and explicit
RequestFullSync(). - Isolates failures from individual
SettingChangedhandlers so remaining package entries can still be applied. - Uses an independent numeric wire protocol and requires an exact client/server protocol match.
- Includes release SHA-256 hashes for both runtime DLL files.
