Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
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 | a day ago |
| Version | 0.3.2 |
| Download link | Skitale-ValheimAdminForge-0.3.2.zip |
| Downloads | 197 |
| Dependency string | Skitale-ValheimAdminForge-0.3.2 |
This mod requires the following mods to function
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.2350README
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:
- ~990 items β weight, stack size, max quality, value, prefab id.
- 161 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 that mod armour 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.
π§ͺ 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 and events from other mods (Jotunn packs, ValheimArmory, and the rest) appear next to the vanilla ones with no per-mod support and no update needed from us.
What's in it
| Tab | What you get |
|---|---|
| Items | Search, category tabs, vanilla/modded 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. |
| Creatures | Spawn with count, star level, tamed, health override and spread. 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. 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 |
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; the server reads/writes ValheimAdminForge.tags.json next to this file |
Server/* only matters on the server/host machine β that's the point: the server owner
sets the limits, not the client.
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 = falselets 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.
- Name tags live in
BepInEx/config/ValheimAdminForge.tags.jsonon the server (keyed by SteamID64). A template is written on first run, edits apply within ~2 s, and a tag survives death. A client can't tag itself. - 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/TeleportSpreadconfig (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(notGUILayout.Window) and snapping its remembered position to whole pixels βGUILayout.Windowsilently 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 wholeAwakeprefix 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.
DimTextColornow 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.CheatRaiseSkillholds a call to aCharacter.Messageoverload 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.Awakeran 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
ZNetScenecan'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
envoverride toast only shows to admins, cross-player actions echo a confirmation to the admin, the weather list rebuilds on a world change,PositionPickerno 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. NewServer/PlayerTagstoggle; 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 acharacterZDOID -> tagtable; 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. NewExecutionSite.AllClientsfor 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 vanillaeventcommand isonlyServerand 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. SharedAnchorModeenum 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 needServer/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 (vanillaremovedrops/removefishdon'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.
ItemCatalogno 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/CatalogLocskeleton behind both catalogs and aFilteredListhelper 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/StrictItemChecknow 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,
IAdminCommandextension point. - IMGUI window (Insert), input capture while open.