Valheim
You are viewing a potentially older version of this package. View Latest Version
Install with App

Details

Date Uploaded
3 days ago
Downloads
135
Size
591KB
ADDatHost Valheim hosting
€1

Ultimate Server Configuration Manager (Ultimate SCM) 1.0

Every mod's settings. One panel. Synced live with the server.
💬 Join the Discord

Version 1.0.0 15 languages Multiplayer, server synced Discord

💡 Suggestions, bugs and questions: https://discord.gg/aMkN89Cuas — when reporting a bug, attach your BepInEx LogOutput.log and say what you expected to happen.

A universal settings panel for Valheim. It shows the configs of all installed BepInEx mods, explains each one using the mod's own comment (with a button to translate it into your Valheim language), and syncs everything with the server.

Install on the server and on all clients.

Screenshots

Home screen — every mod, what changed, what is pending:

Home screen

Editing a mod as admin — edit any config live, choose per config or per mod what players see (Hidden · View only · Can edit), draft several changes and apply them at once:

Admin editing configs

What a player sees — by default everything is hidden until the admin releases it:

Player view with everything hidden

Installation

  • Install through a mod manager (Thunderstore Mod Manager, r2modman, etc.), or copy the contents of plugins/ to BepInEx/plugins/Ultimate_SCM/.
  • It must be installed on the server AND all clients.
  • Requires BepInExPack_Valheim.

How to open

  • ESC → "Mod Settings" (a button added to the pause menu), or
  • F1 (configurable in Panel hotkey). ConfigurationManager also uses F1 by default: change the key of one of the two.
  • ESC closes the panel (if a search is typed, the first ESC press clears the search).
  • The window remembers where you left off: position, size (drag the top to move it and the bottom-right corner to resize it), last opened mod, collapsed sections, and filters. Center window resets it to the default.

Shortcuts

Key Action
F1 opens/closes
Ctrl+F jumps to search
Enter applies the typed value
Ctrl+Z undoes the last change (outside text fields)
Ctrl+S applies the draft
ESC closes the confirmation → cancels the note → clears the search → closes the panel

Sync rules

Situation What happens
Player joins the server Immediately receives the server's values for the configs of all mods the server has.
Config Hidden (default) The player doesn't see it. The server value is enforced and only admins change it. The player's .cfg is not overwritten.
Config View only The player sees it but cannot change it. The server value is enforced.
Config Can edit Each player uses and changes their own value.
Admin changes something The server validates it, saves it, and sends only what changed to everyone.
Owner edits the .cfg on the server while it is running The server reloads the file and syncs everyone (checked every 60 s; changes made in the panel are instant).
Player leaves the server All configs go back to their local value.
Mod that only the player has Stays local (the server doesn't know about it).
Mod that only the server has The admin can see and edit it in the panel even without having the mod.
Mod that already uses ServerSync / Jotunn / ConditionalConfigSync Ultimate SCM does not enforce values (the mod does that itself); admin changes are sent to the server.
Server without Ultimate SCM Everything works as a local panel.

Who is an admin: anyone listed in the server's adminlist.txt (the same admins as devcommands). In single-player, you are an admin. Admin tools only turn on after you type devcommands in the console (F5): until then even an admin sees the panel as a normal player (hidden configs don't show, locked ones are read-only). Turn off Admin needs devcommands to drop this requirement. On a server, Ultimate SCM's own options follow the same rule: players only see/change them if the admin releases them (in the main menu everyone can always change their own hotkey and language).

Releasing configs: in the panel, as an admin, use the Players: selector (Hidden · View only · Can edit) on each config or on the whole mod (a config's own choice wins over the mod's; changing the mod resets its configs to follow it), or Unlock suggested (the panel suggests configs that look player-only: hotkeys, interface, sound, colors). This is saved in BepInEx/config/Ultimate_SCM/access.json.


When each change takes effect (automatic detection)

Each config gets a badge: LIVE, RELOG, RESTART, or ?. Hover over it to see why. Ultimate SCM figures this out on its own, in this order:

  1. Author tag (the most reliable): the developer can add the tag "scm:live", "scm:relog", or "scm:restart" to the ConfigDescription. It doesn't depend on Ultimate SCM being installed:
    Config.Bind("Combate", "Dano", 1f, new ConfigDescription("Multiplicador de dano", null, "scm:live"));
    
  2. The mod listens for the change (SettingChanged): it then reacts immediately.
  3. Reading the mod's code (Mono.Cecil, already included in BepInEx): Ultimate SCM finds where the mod reads each config.
    • In the plugin's Awake → RESTART.
    • In ObjectDB/ZNetScene/Player.Awake → RELOG.
    • In Update or game patches → LIVE.
    • If it is read during gameplay anywhere, it counts as LIVE.

Dedicated server: "relog" doesn't exist there, so anything that is RELOG/RESTART on the server becomes SERVER: RESTART for the admin. The panel shows the list of what is waiting for a server restart. If the value goes back to the original, the item leaves the list on its own.

Pending changes and "Relog now"

  • When something has changed but only takes effect after relogging, a banner appears in the panel and a notice appears on the player's screen.
  • Relog now leaves the world and rejoins the same server by itself (Auto reconnect on relog). In single-player/host, it becomes Leave world.
  • Configs that are only read when the game starts would never pick up the server's value, because the game starts with the local .cfg. The Save on my PC button writes the server's value to the player's .cfg (with their consent). After restarting the game, it takes effect.

Values applied before the world loads

In Valheim, the server's configs arrive after the world and items have already loaded. That is why configs read while the world loads don't pick up the server's value, not even with ServerSync.

Ultimate SCM stores the values each server enforces (BepInEx/config/Ultimate_SCM/servers/) and applies them before the world loads on the next join. From the second join onward, everything is already correct. On the first join, the panel tells you to relog. The server has a permanent identity (server_id.txt), so the cache works by IP, server list, or invite.

Mods that already sync (ServerSync / Jotunn): mirror mode

Ultimate SCM reads the list from ServerSync/Jotunn itself and mirrors only the configs the mod enforces (respecting "Lock Configuration"). That way they are also applied before the world loads. The rest (hotkeys, interface) stays free.

Ultimate SCM is the "outer layer": it saves the player's value before everyone else and restores it last, already in the menu. Even if another system restores it incorrectly, the player's .cfg ends up correct.

The panel

  • Mod list on the left, showing how many configs each mod has and how many are changed.
  • Layout that adapts to the mod: up to 6 sections → collapsible sections; more than that → tabs.
  • Respects the mod author: display name, order, advanced and hidden configs (ConfigurationManager attributes).
  • The right editor for each type: on/off toggle, slider + field for ranged numbers, buttons or a list for options, multiple choice for flags, text for everything else. Accepts 1,5 or 1.5.
  • Visual editors: Capture key for hotkeys (KeyboardShortcut/KeyCode: click and press the key, with Ctrl/Shift/Alt for combinations; ESC cancels); color picker (swatch + hex field + R, G, B, A bars); vectors with separate X, Y, Z (W) fields.
  • The mod's own editor: if the mod defines ConfigurationManagerAttributes.CustomDrawer, Ultimate SCM draws its editor inside the card — only when the change is local (configs synced by the server use the default editor, so the server stays in control).
  • Extra .cfg files: configs from additional files created by the mod (outside the main .cfg) also show up, in a section named after the file.
  • Open .cfg and Reload from disk in each mod's header. Reload is unavailable while you are on a server that syncs configs.
  • Compact mode (players): a player on a server sees only the name, editor, badges, note, and comment. The Details button on the bar shows key, default, type, and history. Admins and the host always see everything.
  • Mod comment below each config, with default, range, and type.
  • Badges with explanations on hover: MODIFIED, LOCKED, UNLOCKED, SERVER, LIVE/RELOG/RESTART/?, WARNING (the comment contains a warning), CLIENT? (a suggestion for the admin).
  • Back to default: a Default button on each config; Reset section and Reset mod to defaults (they ask for confirmation).
  • Undo: undoes the last 50 changes (a "reset section" counts as one step).
  • Search across all mods: name, key, section, original comment, and translations already made, even if the comment is being shown in the original. Searching "dano" finds "Damage multiplier" through the translated comment.
  • Filters: modified only, show advanced.
  • Home: your situation explained in one sentence (menu, host, admin, player, server without Ultimate SCM), clickable numbers (mods, configs, changed, pinned, what's new, pending), your pinned configs, tips, and shortcuts.
  • Sidebar shortcuts: Home, Pinned, Changed (all non-default configs, across all mods), and What's new.
  • Pin: the Pin button puts the config on Home and in "Pinned". It is personal and saved on this PC (ui_state.json).
  • Why it is locked: every config that can't be changed shows the reason in one sentence (locked by the admin, read-only in the mod, waiting for the server, mod not installed).
  • Validation as you type: an invalid value turns the field red, says what is accepted ("Outside the allowed range: 0 – 100"), and Apply only unlocks when it is correct.
  • Draft mode: turn on Draft to gather several changes and apply them all with Apply all (Ctrl+S). It is a single Undo, a single send to the server, and a single confirmation for extreme values. Useful for tuning balance without leaving the server "half-done". If a draft config becomes locked along the way, it leaves the draft with a notice.
  • Errors that tell you what to do: every error notice comes with a second line explaining the fix, and the Errors (n) button in the footer keeps the last 20 with the time.

What's new since your last visit

The panel marks configs with CHANGED (or NEW) when the server changed them since the last time you closed the panel on that server. The tooltip shows the old and new values. When you join a server with news, a notice appears on screen ("press the panel hotkey to view"). On the first visit to a server nothing is marked. Whatever you changed yourself as an admin doesn't show up as news for you.

It is saved per server in BepInEx/config/Ultimate_SCM/servers/<id>.seen.json (without secret values).

Admin notes and "who changed it"

  • Admin note: the Note button (admins only) adds a short text (up to 300 characters) that all players see highlighted on the config, e.g. "Above 3 causes lag with 10+ players". Each player can translate the note into their own language, with the same translator used for comments. Search also looks in notes.
  • Last change: each config shows when the server changed it. Admins also see who changed it ("Last changed by Igao · 2 h ago (today, 18:47)") or whether it was "outside the panel" (.cfg file or another mod). Regular players only see "Changed by the server · 2 h ago", without names.
  • Times in everyone's own time zone: everything is stored in UTC and each PC displays it in its own time zone and in the date format of the panel's language. An admin in Brazil sees 18:47 and a player in Portugal sees 22:47 for the same change. If the server's clock is ahead or behind, the panel corrects the difference.
  • Notes and history are kept on the server in BepInEx/config/Ultimate_SCM/server_meta.json. Hidden or secret configs never have notes or history sent to regular players.

Comment translation

Each PC translates into the language selected in Valheim for that player.

  • Translate on each config swaps in the translated text; Show original undoes it.
  • Translate section and Translate all do the whole mod.
  • Below the text, the source of the translation is shown: community or MyMemory (or DeepL).

Lookup order (redundancy)

Translation goes through a chain; the first step that answers wins:

  1. Community pack: a hand-made file. Best quality, works offline.
  2. Local cache: everything already translated on this PC. Works offline.
  3. Main service (Provider, default MyMemory).
  4. Backup service (Fallback provider, default DeepL, works out of the box; creating your own free key and pasting it in DeepL API key is recommended). Takes over immediately if the main one fails.
  5. None answered: shows the original, and the player can try again.

To keep it reliable:

  • Circuit breaker: a service that fails 3 times in a row is left out for 10 minutes, and the backup serves requests directly, without waiting.
  • Checked responses: before going into the cache, Ultimate SCM rejects empty text, an error message in place of the translation (such as "daily limit reached"), or an absurd length.
  • No internet: it doesn't keep trying and doesn't mark the services as broken. What has already been translated keeps working.
  • Long texts: are split into sentences at each service's limit, so nothing gets cut off.
Service Cost Reliability
MyMemory (main) Free, no key Public, documented API. Limit of ~5,000 characters/day per PC, or ~50,000 with an email in MyMemory email. Assumes the original is in English.
DeepL (last resort) Free key (500,000 characters/month) Official API, only used if MyMemory fails. Recommended: create your own free key at deepl.com/pro-api and paste it in DeepL API key.
Off — Cache and community packs only.

A typical mod comment is 50 to 150 characters. Even without an email, MyMemory's limit covers hundreds of configs per day, and the backup is only used when MyMemory fails.

Background translation (advanced, hidden on purpose)

For those who want everything translated without clicking: in Ultimate SCM's configs, turn on the Advanced filter and enable Background translation (advanced). While you play, Ultimate SCM translates one comment every 30 seconds (adjustable in "Background translation interval", minimum 10 s), across all mods, and stores it in the cache.

  • It starts with the mod you open in the panel.
  • It doesn't touch the screen and doesn't show errors (it only logs them). The footer shows progress ("Background translation: 340/1200").
  • It pauses on its own without internet, when the services are paused, or while you are translating something yourself.
  • A text the service can't translate is skipped; connection or limit failures are retried later. Difficult texts don't take the service down for you.
  • With it (or with "Translate automatically") on, what is already translated appears translated right away. "Show original" still works.
  • Texts repeated across mods are translated only once. 30 s ≈ 120 texts per hour, a pace well below what usually triggers a block.

Community packs

These are the best-quality option and work offline. Put .json files in BepInEx/config/Ultimate_SCM/translations/Portuguese_Brazilian/ or plugins/Ultimate_SCM/translations/packs/Portuguese_Brazilian/. The folder name is the language name in Valheim.

{
  "com.autor.meumod|Combate|DamageMultiplier": "Multiplicador de dano de todos os ataques.",
  "Texto original em inglês exatamente igual": "Tradução"
}

The server owner can distribute these packs together with the modpack.

Mismatched mods with the server

When joining a server, Ultimate SCM compares the player's mods with the server's:

  • A different version appears in red in the panel, with a notice on screen when joining. Example: "EpicLoot: server 0.10.3, you 0.10.1".
  • Mods the server has and the player doesn't appear in a list. Some may be server-only and don't need to be on the player's PC.

This is the most common cause of "the mod doesn't work on the server", and now the player finds out on their own.

Player-only configs unlocked automatically (optional, off by default)

By default everything starts Hidden: players see nothing until the admin releases it. If you turn on Auto unlock player-only settings, hotkeys, interface, sound, colors and fonts (which don't affect anyone but the player) start out UNLOCKED (Can edit) the first time the server sees them. Without it, the panel still suggests them to the admin with Unlock suggested. The criterion is strict: ambiguous words like "scale" or "display" are left out, because they also appear in gameplay configs.

Each config is evaluated only once. If the admin locks it later, it stays locked.

What players see: Hidden · View only · Can edit

Everything starts Hidden. A player who joins sees nothing until the admin releases it. For each config, or for a whole mod, the admin picks one of three states with the Players: selector:

State What the player sees Whose value counts
Hidden (default) Nothing. The config is not in the list, search, counts, or the "Copy changes" summary. The server's, enforced.
View only The config, read-only (with the admin note and the reason it is locked). The server's, enforced.
Can edit The config, editable. Each player's own.
  • Choosing a state on the mod applies it to all its configs (and clears the per-config choices of that mod). Inside a mod that is View only, you can still set single configs to Can edit; a mod that is Can edit locks the per-config selector.
  • A mod appears in the player's list only when at least one of its configs is visible. If nothing is released yet, the player sees a note saying so.
  • The value still applies to everyone, whatever the state. Hidden only controls what the player sees.
  • For the admin: every config shows its state; the Show hidden filter hides or shows the Hidden ones in your view.
  • Saved in BepInEx/config/Ultimate_SCM/access.json (shownMods/shownEntries = View only; unlockedMods/unlockedEntries = Can edit).

Values in plain language

Next to each number, the panel shows what it means:

Config Value Shows
DamageMultiplier 1.5 +50%
DropRate 0.5 −50%
XpMultiplier 3 3× (+200%)
RespawnCooldown (seconds) 5400 1 h 30 min
RareDropChance (0–1) 0.05 5%

Ultimate SCM infers this from the config's name, type, range, and default. When in doubt, it shows nothing: better no hint than a wrong hint. The default value also gets the hint, for example "Default: 1 (normal)".

Copy "what this server changed"

The Copy changes button generates a summary ready to paste into Discord:

**Alterações deste servidor** (<t:1759270000:f>)

__EpicLoot__
• Drop rate: 1 → 2
  • When connected to a server, or when being the server, it shows what the server enforces. In the main menu, it shows your own changes.
  • Secrets (tokens, passwords) never go in.
  • The date uses Discord's timestamp (<t:...:f>): each person sees it in their own time zone and language.
  • If it exceeds Discord's limit, it copies the beginning and saves the full list in BepInEx/config/Ultimate_SCM/changes_summary.txt.

Protection against absurd values

When a change is going to apply to the whole server and the value is far outside the mod's default, the panel asks for confirmation before applying. This applies to:

  • a value 10× larger or smaller than the default;
  • zeroing something that isn't zero;
  • flipping the sign.

The window shows how many players are online. Adjust or turn it off in Extreme value factor (0 = off). Changes that only apply to you don't ask for confirmation.

Panel languages

The panel comes translated into 15 languages, all embedded in the DLL and also copied to plugins/Ultimate_SCM/translations/:

File Language
English.json English (base, used if a translation is missing)
Portuguese_Brazilian.json Portuguese (Brazil)
Portuguese_European.json Portuguese (Portugal)
Spanish.json Spanish
French.json French
German.json German
Italian.json Italian
Dutch.json Dutch
Polish.json Polish
Swedish.json Swedish
Turkish.json Turkish
Russian.json Russian
Japanese.json Japanese
Korean.json Korean
Chinese.json Simplified Chinese (Valheim's Traditional Chinese uses this file)

Everything the panel shows comes from these files: buttons, badges, tips, on-screen notices, translation service errors, times and numbers (date format and comma/period according to the language), and even Ultimate SCM's own settings (name, description, and section). Only proper names (mods, services, files) and the mods' comments stay as they are; the comments have their own translation, described above.

The panel uses a system font with fallbacks for Chinese, Japanese, Korean, and Cyrillic, so no little squares appear.

Ultimate SCM's .cfg and the BepInEx log stay in English, which is the standard for people who edit files and ask for support.

To translate the panel into another language, copy English.json using Valheim's name (Spanish.json, German.json, French.json...) and translate the values. No need to touch code or memorize codes like "pt-BR". The panel picks based on the language selected in Valheim, or you can force it in Language (e.g. Portuguese_Brazilian).

If there is no file for the language, the panel uses a variant of the same language (Portuguese_European uses Portuguese_Brazilian) and, last of all, English.


Files

BepInEx/plugins/Ultimate_SCM/Ultimate_SCM.dll
BepInEx/plugins/Ultimate_SCM/translations/English.json, Portuguese_Brazilian.json
BepInEx/config/Igao.UltimateSCM.cfg     ← Ultimate SCM options
BepInEx/config/Ultimate_SCM/access.json                  ← server: what is unlocked
BepInEx/config/Ultimate_SCM/changes.log                  ← server: who changed what (time with time zone, e.g. -03:00)
BepInEx/config/Ultimate_SCM/server_meta.json             ← server: admin notes and last change (UTC)
BepInEx/config/Ultimate_SCM/translation_cache.<Language>.json ← client: translation cache (with the service that translated)
BepInEx/config/Ultimate_SCM/servers/*.json               ← client: each server's values (pre-application)
BepInEx/config/Ultimate_SCM/servers/*.seen.json          ← client: what you have already seen from each server (news)
BepInEx/config/Ultimate_SCM/server_id.txt                ← server: permanent identity
BepInEx/config/Ultimate_SCM/ui_state.json                ← client: window, last mod, filters, pinned

Server options

Watch config files, File check interval, Excluded mods (GUIDs that are never enforced), Auto unlock player-only settings, Audit log.


Security

  • The client only accepts packets coming from the server; only admins in adminlist.txt can change or unlock configs, and the server validates everything again.
  • Configs that look like secrets (token, webhook, password, API key) are never sent to regular players — only to admins.
  • If the game closes suddenly while connected, the player's local values are recovered the next time the game starts (BepInEx/config/Ultimate_SCM/client_backup.json).

Known limitations

  • "Real time" depends on the mod: no panel can instantly change what a mod only reads at startup. Ultimate SCM detects this, warns you, and shortens the path (pre-application, Relog now, Save on my PC). Code-reading detection gets most cases right; mods that read configs through indirect paths show up as ?.
  • Extra ConfigFile files from a mod are found when the mod keeps them in a field (of the plugin or static). Files kept only in local variables can't be discovered.
  • The mod's own editor (CustomDrawer) is only used for local changes; server-controlled configs use the default editor.
  • As with any mod that uses Valheim RPC, the server trusts the message's sender identifier; on public servers, keep adminlist.txt lean.
  • "Hide" hides the config from the players' panel, but it is not anti-cheat: the value still applies to (and is still sent to) all clients.
  • A client without Ultimate SCM on a server with Ultimate SCM does not receive the enforced values.
  • Server and players need the same protocol version (1.0 uses protocol 8). With different versions, the panel tells who needs to update and everything stays local.

Building from source

  1. Open Ultimate_SCM_1.0.0/Ultimate_SCM.sln in Visual Studio 2022.
  2. Copy the missing DLLs listed in Ultimate_SCM/libs/LEIA-ME_DLLs_que_faltam.txt into Ultimate_SCM/libs: UnityEngine.InputLegacyModule.dll, UnityEngine.TextRenderingModule.dll, UnityEngine.UnityWebRequestModule.dll, UnityEngine.UI.dll, and UnityEngine.UIModule.dll from valheim_Data\Managed, and Mono.Cecil.dll from BepInEx\core.
  3. Build with Ctrl+Shift+B. Ultimate_SCM.dll is copied to the ThunderStore plugins folder.
  4. To test, copy the contents of plugins/ to BepInEx/plugins/Ultimate_SCM/ on the client AND the server.

AI tools were used to help review the code, hunt down bugs and optimize performance. All features were designed and tested by the author.


Found a bug? Got an idea for the panel? Want a mod's comments translated for everyone?
💬 https://discord.gg/aMkN89Cuas

DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro