You are viewing a potentially older version of this package. View all versions.
Skitale-ValheimAdminForge-0.4.0 icon

ValheimAdminForge

Server-authoritative admin GUI: dynamic catalogs (items, effects, creatures, events) for vanilla + modded content, plus player, world and teleport tools.

By Skitale
Date uploaded 3 hours ago
Version 0.4.0
Download link Skitale-ValheimAdminForge-0.4.0.zip
Downloads 76
Dependency string Skitale-ValheimAdminForge-0.4.0

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2350 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2350

README

Valheim Admin Forge

One hotkey. Every item, creature, event and status effect in the game β€” searchable, inspectable, spawnable. Single-player, listen-server with friends, or dedicated, where every action is authorised by the server so a modified client can't abuse it.

Press Insert. That's the whole learning curve.


Why you'd want it

πŸ” An in-game wiki you can spawn from

Stop alt-tabbing to a wiki that's three patches out of date. Admin Forge reads the catalogs out of your game, so what you see is what you're actually running:

  • Items β€” weight, stack size, max quality, value, prefab id.
  • Creatures β€” faction, base health, boss flag, tameable or not.
  • Every random event β€” biome, duration, trigger radius, exactly what it spawns, and which global keys gate it (missing ones flagged).
  • Status effects β€” with real duration and power, so Poison / Burning / Frost behave like they do in a fight instead of ticking for nothing.

Want to know what a 2-star Fenring actually hits like, or whether a late-game armour set is worth the grind? Spawn it, look at it, despawn it β€” no loot, no death, no event credit. The world is exactly as you left it.

🎲 Run events on demand β€” including on dedicated servers

Vanilla's event command is server-only, so an admin connected to a dedicated server can't start one at all. Admin Forge routes it through the server properly: start any event on yourself, on another player, or at coordinates; stop the active one; or roll a random. Good for raid nights, testing base defences, or giving your server a story beat.

πŸ›  A moderation kit that works where the console doesn't

Most vanilla admin commands are refused for clients on a dedicated server. These aren't: teleport a stuck player out of a rock, bring someone to you, heal them, hand out gear, clear a griefed area, or sweep away a raid nobody wants to finish. Per-player name tags (MODER, EVENT, your choice of colour) show on head-plates and in chat, so your team is recognisable at a glance.

Need to send someone somewhere? Hit Map, click the spot on your own map, done β€” no copying coordinates out of a wiki. And when the whole admin team jumps to the same player, everyone lands in a ring around them instead of inside each other.

πŸ§ͺ Practise fights without burning a real save

God, ghost, fly, no-cost building, instant skill levels, weather and time control, and a natural-spawn toggle for when you want silence. Set up the exact fight you want, then put everything back.

🧩 Mods just work

Nothing is hard-coded β€” catalogs are rebuilt from live game data every session, so items, creatures, status effects and events added by other mods appear next to the vanilla ones with no per-mod support and no update needed from us.

Running a twenty-mod pack and can't remember which one added that sword? Type a mod's name into the Mod filter and the list collapses to exactly what it brought β€” items, creatures and effects alike.


What's in it

Tab What you get
Items Search, category tabs, vanilla / modded / per-mod filter, sort, detail card, quantity stepper.
Effects Every status effect, with optional duration / power and a Clear button for the ones that ignore their own timer. Same vanilla / modded / per-mod filter.
Creatures Spawn with count, star level, tamed, health override and spread β€” filter by mod too. Plus Despawn: remove creatures / dropped items / fish / birds around a player without killing them. Players and tombstones are never touched.
Events Full event list with detail cards. Start at self / player / coordinates, Stop, or Random. Header shows the active event.
Players Teleport to a player, bring a player, send anyone to coordinates β€” or click the spot on the map and let Map fill them in. God, ghost, fly, nocost, heal, die, puke, repair-all, clean inventory, explore / reset map, raise / reset skill, and radius sweeps (kill all / enemies / tame, tame, aggravate).
World Time of day, weather, wind and a natural-spawn toggle, broadcast to every client. Skip time or jump to next morning. Global-key editor with a reference list of what each key unlocks.

A shared target picker runs through the whole mod β€” act on yourself or any online player from any tab.


Install

Requires BepInExPack Valheim or here. Use a mod manager (Gale / r2modman), or drop ValheimAdminForge.dll into BepInEx/plugins/.

Dedicated servers: install it on the server too β€” that's what makes events, cross-player actions and name tags work. Admins come from adminlist.txt; the mod matches tolerantly, so a bare SteamID64 works even where Valheim's own check misses it.

Usage

Insert opens the window (rebindable), Esc or Insert closes it. Non-admins can't open it unless General/AllowNonAdminWindow is set β€” and even then the server still refuses every action.

Configuration

Section / Key Default Notes
General/ToggleKey Insert Open/close the window
General/MaxQuantity 100 Upper bound for the quantity field (client-side)
General/AllowNonAdminWindow false Let non-admins open the window (actions still refused server-side)
Window/Width, Window/Height 640 Γ— 720 Live-editable; min 560 Γ— 560
Window/Opacity 0.8 Window background opacity (1 = fully solid)
Window/TextColor, Window/DimTextColor #000000 Text colours as hex, for whatever skin you like
Server/MaxQuantity 1000 Hard cap the server enforces per give request
Server/StrictItemCheck false Reject items and effects the server's ObjectDB doesn't know. Off by default so client-only modded content works
Server/MaxActionRadius 100 Cap (m) on the Players-tab radius sweeps
Server/MaxCreatureSpawn 20 Cap on creatures per spawn request
Server/AllowBossSpawn false Off by default β€” a stray Moder over someone's base ruins a server
Server/MaxDespawnRadius 100 Cap (m) on the despawn / cleanup sweep
Server/PlayerTags true Name tags β€” see Player name tags for the file format

Server/* only matters on the server/host machine β€” that's the point: the server owner sets the limits, not the client.

Player name tags

Tags are defined on the server in BepInEx/config/ValheimAdminForge.tags.json β€” a template is written there the first time the server runs with Server/PlayerTags on. One entry per player, keyed by SteamID64:

{
  "entries": [
    { "id": "76561198000000000", "tag": "ADMIN", "color": "#FF8800" },
    { "id": "76561198000000001", "tag": "EVENT", "color": "#33CCFF" }
  ]
}
Field Required Notes
id yes The player's SteamID64 (17 digits). It's in the server log when they connect, or on their Steam profile page.
tag yes Text shown in brackets, e.g. [ADMIN].
color no Hex #RRGGBB. Defaults to white if omitted.

Edits apply within ~2 s β€” no restart. The tag renders on the head-plate / hover name, in chat, on shout text, and in the Players tab, and survives death and respawn. A client can't tag itself; the file only exists server-side. Set Server/PlayerTags = false to turn the whole feature off (nothing is read or written).

Security model

  • The GUI is never the gate. Every action is authorised server-side against the real connection identity, which a client can't forge. A modified client that skips the window entirely still gets refused.
  • The server owner sets the caps. Spawn counts, radii and quantities are bounded by Server/* on the server machine. Unidentified or spammy requests are dropped silently.
  • Trust runs one way. A client trusts its server, so a malicious server running this mod could push items or a teleport onto you β€” inherent to any server-authoritative design. Only connect to servers you trust.
  • Server/StrictItemCheck = false lets a verified admin name a prefab the server doesn't know (needed for client-only content mods). Deliberate trade-off: no server-side whitelist of names, but the requester is already an authenticated admin.

Notes

  • Client-only modded items still spawn β€” the admin's client resolves the prefab.
  • Far teleports can leave a frozen copy of a player on other clients (a vanilla netcode quirk); the mod clears it a few seconds later.
  • Weather / time / wind are process-local in vanilla, so the mod broadcasts them to keep everyone in the same world.

CHANGELOG

Changelog

0.4.0

  • New Server/TeleportSpread config (default 2m, 0 disables): when several admins "Go to" the same player, each now lands at a different point on a ring around them instead of stacking on top of the target and each other.
  • New "Map" button next to the X/Y/Z coordinate fields (teleport picker and the Players tab's own coordinate row) β€” click a spot on the in-game map to fill the fields instead of typing coordinates. Closes the Admin Forge window while the map is up so nothing overlaps, and reopens it after the click.
  • "Bring" now goes through the same server-resolved path as "Go to" instead of a separate, client-computed position β€” it gets the spread-out-admins fix too (no longer stacks the brought player exactly on top of you) and no longer silently no-ops when it can't confirm the target's position.
  • Window border/tooltip-strip flicker while dragging: fixed by switching the window to GUI.Window (not GUILayout.Window) and snapping its remembered position to whole pixels β€” GUILayout.Window silently discards a rounded position every frame.
  • Window/DimTextColor now also applies to the plain toolbar captions ("Search", "Count", the drag hint, etc.) that previously ignored it. Its default is now black (was grey); default window opacity is now 0.8 (was 1, fully solid).
  • Items/Creatures "Mod" filter is a type-to-filter + cycle button now (same UX as World tab's Weather picker), not a row of one button per mod.
  • Effects tab: vanilla/modded distinction, plus the same "Mod" filter, for status effects added by mods that ship their own.
  • Fixed the Mod filter's cycle button showing the next candidate instead of the one it had just applied β€” clicking one mod would immediately relabel the button with a different mod's name while still (correctly) filtering to the one you clicked, reading as if the wrong mod's entries had appeared.
  • Modded creatures never got a mod name (so the Creatures "Mod" filter row never appeared), because the attribution diff read ZNetScene.instance, which is still null for the whole Awake prefix chain β€” exactly where most mods add their prefabs outside the common modding framework's own path. It now uses the instance the Awake was actually called on. Item attribution happened to work around this by accident; status effects and creatures did not.
  • "Go to" landed every admin at the exact same offset from the target player instead of spreading them out (the spread angle was seeded from a value that's a constant for every admin); "Bring" failed outright ("target player position is not available") when the admin doing it was the listen-server host, and could in rare cases pull the wrong player instead. Both were teleport-resolution bugs on the server side.
  • The mod-filter row (Items/Creatures/Effects) could throw an IMGUI "pushing more GUIClips than popping" error the instant you clicked into the Origin toolbar, and the window could overflow past its own bottom edge once the row appeared, especially at the minimum window height.
  • DimTextColor now falls back to the default like its description already claimed, instead of showing broken markup for an unparsable value.
  • Mod-name attribution for third-party content no longer goes stale after the catalog it's attached to reloads (world change, late-loading mod), and no longer merges two unrelated mods that both embed the same shared helper library under one fake name.
  • The Mod filter's cycle button could still relabel itself away from the active filter by a second path: typing a search that filters the active mod itself out of the match list left the button showing a different candidate while the item/creature/effect list stayed filtered to the old one. Clears the active filter (back to "All") when that happens, instead of leaving the two disagreeing.
  • Players/Raise skill failed outright ("Method not found: void .Character.Message(...)") for every skill, vanilla ones included, on any setup carrying a mod built on a commonly-embedded skill-management helper library. That library's Harmony prefix on Skills.CheatRaiseSkill holds a call to a Character.Message overload vanilla no longer has, and Mono resolves it while JIT-compiling the prefix β€” so it throws before the prefix can even decide the skill isn't one of its own. Raise now does the level change itself through public API and never calls CheatRaiseSkill, so it no longer depends on that method being patch-free.
  • Mod attribution could overwrite an already-known owner with "unattributed" if ObjectDB.Awake ran a second time in the same session and re-added a prefab/effect of the same name through a patch call that couldn't be attributed β€” now skipped instead of clobbering a good value with nothing.
  • Fixed a rare crash ("can only be called from the main thread") when a text-color config value changed off the main thread (e.g. a config-file reload) instead of via the F1 manager β€” the stale GUI skin it leaves behind is now cleaned up from the next GUI frame instead of destroyed on the spot.

0.3.2

  • Player target picker is a click-to-select grid with a filter box now, not a cycle button

0.3.1

  • Update readme

0.3.0

  • Despawn: a mob spawned moments earlier could be "resurrected" a second later β€” its destroy RPC beat its own create RPC to the server, which then ignored the destroy and synced the mob back ("mobs reappear / press despawn twice"). Fixed by pulling each ZDO out of the sector index immediately (so ZNetScene can't re-instantiate it before the destroy broadcast lands) plus one delayed re-sweep ~1.5 s after each despawn for anything that still slipped through. Runs on the target player's client (a dedicated server doesn't instantiate creatures, so a server-side sweep sees nothing).
  • Post-review hardening: the world / event commands now reject NaN / out-of-bounds payloads and unknown environment names, the env override toast only shows to admins, cross-player actions echo a confirmation to the admin, the weather list rebuilds on a world change, PositionPicker no longer flips its control set mid-frame, the client tag table clears on disconnect, and one failed Harmony patch no longer aborts the whole mod. New Server/PlayerTags toggle; minimum window size raised to 560Γ—560.
  • Player name tags: a per-player tag (text + colour) driven by a server-side BepInEx/config/ValheimAdminForge.tags.json (keyed by SteamID64) β€” a client can't tag itself. The server broadcasts a characterZDOID -> tag table; each client renders it on the head-plate / hover name, in chat, and in the Players tab. Edits to the file apply within ~2 s, and the tag survives death / respawn.
  • Players tab: Die action (kill the selected target; blocked by god mode, like the console command).
  • World tab: time of day, weather (from EnvMan.m_environments), wind, and the natural-spawn toggle are broadcast to every client (they're process-local overrides that don't sync on their own); time skip (advance shared net time, or jump to next morning), time scale, and a global-key editor run on the server. New ExecutionSite.AllClients for the broadcast.
  • Events tab: the random-event list is built dynamically from RandEventSystem (mod events included). Start an event at yourself / at a player / at coordinates, Stop, or Random β€” all run on the server (the vanilla event command is onlyServer and unreachable from a dedicated-server client). Detail card shows biome, duration, range, what it spawns, and required global keys (missing ones flagged). Header shows the active event with a Stop button.
  • Internal: IAdminCommand.Site (ExecutionSite.TargetClient / Server) so the dispatcher knows whether to forward a command to a client or run it in the server process. Shared AnchorMode enum for the "at me / at target / coords" picker.
  • Creatures tab: the creature list is built dynamically from ZNetScene β€” vanilla and mod-added creatures appear with no per-mod code, same as the item catalog. Search, vanilla/modded filter, detail panel (faction, base health, boss, tameable). Spawn with count / star level / tamed / health override / spread, at yourself, at another player, or at coordinates β€” the server resolves the position and caps the count (Server/MaxCreatureSpawn); bosses need Server/AllowBossSpawn. Force-tamed non-tameable creatures go passive instead of spamming a vanilla warning.
  • Creatures tab Despawn block: remove creatures / ground items / fish / birds around a player without killing them β€” no loot, no death, no progress or event credit. Filter by enemies / tamed / all, prefab name, minimum star level. Players and tombstones are never touched; radius capped by Server/MaxDespawnRadius. Claims ZDO ownership first, so it clears objects owned by other clients (vanilla removedrops / removefish don't).
  • Players tab: the "send to coordinates" row now uses the same target picker as the rest of the mod instead of its own separate one.
  • Player admin actions (Players tab): god, ghost, fly, nocost, heal, puke, repair all, clean inventory, explore / reset map, raise / reset skill, and radius sweeps (kill all / kill enemies / kill tame / tame / aggravate) β€” applied to the shared target (self or any online player). Freefly toggles the local camera only. Each mirrors the vanilla console command of the same name, most of which a dedicated server denies to clients. Radius sweeps are capped by Server/MaxActionRadius.
  • Listen-server (host + friends) parity. Cross-player give / effect / teleport on a non-dedicated host now applies to the actual target instead of the host, and the post-teleport ghost cleanup broadcasts from the host too. Previously only tested on dedicated, where the host is headless.
  • Server drops unidentified and rate-exceeding requests silently (per-peer limit) β€” a spammy client can no longer flood the server log.
  • ItemCatalog no longer permanently discards items whose localized name didn't resolve (e.g. a mod that registers its localization late); it falls back to the internal name, matching the status-effect catalog. Catalog version bumps on invalidation, not on lazy rebuild.
  • Internal: shared LazyCatalog / CatalogLoc skeleton behind both catalogs and a FilteredList helper behind the Items / Effects tabs, so the upcoming Creatures tab doesn't fork the pattern a third time (~100 fewer lines).
  • Admin permission is enforced once in the RPC dispatcher instead of being repeated in every command.
  • Docs, dead code, and minor allocation/redraw cleanups. Server/StrictItemCheck now documented as also gating status effects.

0.2.0

  • Effects tab: status effects discovered from ObjectDB, with optional duration/power and a Clear button.
  • Players tab: teleport to a player, bring a player, send any player to coordinates. Server resolves target positions (works even when map-sharing is off). Instant vs loading-screen teleport with freeze protection; post-teleport ghost cleanup.
  • Target picker on the Items and Effects tabs (self / any online player).
  • Item catalog now drops unresolved/cut-content entries; localized names and descriptions.
  • Client↔server handshake reports the admin verdict and warns on a mod-version mismatch.
  • RPC handlers are exception-guarded; diagnostic logging moved to Debug level.

0.1.0

  • Item catalog built dynamically from ObjectDB (vanilla + modded), with search, categories, vanilla/modded filter, sort, detail panel and quantity stepper.
  • Server-authoritative give: per-connection RPC, admin check against the real socket identity, IAdminCommand extension point.
  • IMGUI window (Insert), input capture while open.