Source-checkedAdmin & protection

Dyrr

by Ezomic · for Valheim

A door policy: characters that have played elsewhere do not come in. Off until an admin turns it on.

823Downloads
44d agoLast updated
BepInExLoaders
ThunderstoreSource

About Dyrr

From Thunderstore

A door policy: characters that have played elsewhere do not come in. Off until an admin turns it on.

Dyrr

Dyrr is a join policy for Valheim servers. A character that has played on other worlds, that has used cheats, or that arrives with mods the server does not permit can be refused when it connects. Nothing is refused until an admin turns Enforce on.

It also kicks idle players on dedicated servers, reports when a character comes back carrying something it did not leave with, and stops your own client from taking a character into a world it does not belong to.

Features

  • Six checks at the join: the character has spawned in another world, the game has flagged it

for cheats, it has run a console command the game classes as a cheat, its own records disagree with each other, the client is running mods the server does not permit, or it did not answer at all. Each can be switched off on its own.

  • Enforce is off by default. Every connection is still judged and the verdict is written to

the log, so you can see who would be turned away before anyone actually is.

  • A refused player is told which rule they broke, on their own screen if they have Longhouse

Core, and in their own log either way.

  • Character protection on the client: a character is bound to the first world it plays in, and

the game refuses to start it anywhere else. This works whether or not the server runs Dyrr.

  • Idle kick on dedicated servers, with a chat warning first.
  • Inventory watch: a log line when a character's inventory changed while it was offline. This

only ever reports. It never refuses or kicks.

  • A dyrr console command that prints the standing verdict for everyone currently connected.

How the join check works

Both ends register an RPC as soon as the connection object exists, before either side sends PeerInfo. The client sends what it knows about its own character: the character name, the cheats flag and its counter, the name of every console command the character has ever run, the UIDs of every world it has spawned in, and the BepInEx plugin GUIDs loaded on that machine. The server does the arithmetic in a prefix on ZNet.RPC_PeerInfo and refuses before the player spawns, so a refused player never watches the world load first. All of it comes out of PlayerProfile, which lives on the client's disk, so all of it is self-reported. See Known limits.

Which console commands count as cheats is decided on the server, from the server's own Terminal command table, so a cheat command added by some other mod on the server counts for free. A dedicated server has no guarantee of having built that table when the first player knocks, so there is a fallback list of the 73 vanilla commands registered with isCheat: true.

The mod check is the one that reaches cheating on a dedicated server. Console.IsCheatsEnabled() returns ZNet.instance.IsServer(), so a client's own devcommands does nothing on someone else's server. Anyone cheating there is running a mod that patched around that line, which makes "what is this client running" the more useful question.

The tamper check does not need the client to be honest, only consistent. The game writes the same facts in more than one place: m_usedCheats is a bool, PlayerStatType.Cheats is a counter incremented on the next line, and m_knownWorlds records worlds by name at save time where m_worldData records them by UID at spawn. A flag that is clear beside a counter above zero, or more world names than world UIDs, is an edited save. Neither inequality can be produced by playing the game.

Character protection

Refusing a character at the join arrives too late to help it. Loading a character into any world writes that world into PlayerProfile.m_worldData permanently, and nothing in the game ever removes the entry. So the client half refuses the trip instead.

Each character is bound to the first world it is seen in, recorded in BepInEx/config/dyrr-home.txt. After that:

  • Starting a local world with a character bound elsewhere is refused at

FejdStartup.OnWorldStart, with a popup naming both worlds and the file to edit.

  • Joining a server whose world is not the character's home is dropped inside

RPC_PeerInfo, before the character spawns and before the game writes anything. This works whatever the server does, and whether or not the server runs Dyrr at all. That is ProtectOnServers.

Neither asks for confirmation. The damage has no undo, so a confirm dialog would just be a button for doing the unfixable thing.

The character select screen carries the answer under the character's name, in a clone of vanilla's own "Cloud save" label: Belongs to <world>, Not bound to a world yet, Has played in <world> and <world> for a character that already has more than one, or Belongs to a world that is not on this PC when the world is a server's. The line follows ProtectCharacter and disappears with it.

A character with exactly one world in its own save is bound on the spot even if Dyrr has never watched it play. A character with more than one is left unbound, since there is no single home left to defend, and those are exactly the characters an enforcing server turns away.

Idle kick

On dedicated servers only. A player whose character has not moved 5cm or turned one degree for IdleMinutes is kicked, after a chat warning IdleWarnMinutes ahead. Position and facing are read off the character's ZDO every five seconds. Walking, fighting, turning the camera or sorting a chest all reset the clock.

The kick itself is vanilla's own InternalKick, the same path the console command takes, so the player gets the ordinary kicked screen with a reason attached. A locally hosted world is never watched.

Read the full description on Thunderstore →

Highlights

From source data

Loaders

Runs on BepInEx.

Footprint

Rated a light load on a server.

Last update

Its author last shipped an update 44d ago.

Dyrr on Nxeon

From our catalogue
One-click install
Supported on Nxeon Valheim servers, for BepInEx servers. We download it from Thunderstore, place it, and restart the server.
Server type needed
BepInEx
Server load
light
Smallest plan we suggest
Valheim — 4 GB (4 GB RAM). This follows our own load rating above, not a benchmark.
Latest build
1.4.2, released 2026-09-21

Game versions by loader

LoaderGame versionsNewest
BepInEx

From 8 recorded builds of Dyrr.

Recent builds

BuildReleasedGame versionsLoaders
1.4.22026-09-21n/aBepInEx
1.4.12026-09-12n/aBepInEx
1.4.02026-09-10n/aBepInEx
1.3.02026-08-29n/aBepInEx
1.2.02026-08-26n/aBepInEx
1.1.12026-08-25n/aBepInEx

Dependencies

Declared by the newest build that lists any. Required ones are installed with it on one-click installs.

Run Dyrr on a Valheim server

Pick a server or deploy a new one above; it is installed in one click.

What kind of mod it is

From the catalog
Listed on Thunderstore as “Content”

Admin & protection

Permissions, moderation, anti-cheat and land protection for the people running the server.

Compatibility

Game
Valheim
Loaders
BepInEx
Requires
One-click install needs a BepInEx server.

Verified at the source

  • ✓ThunderstoreOfficial listing, checked 2026-10-01Open ↗
  • ✓AuthorEzomic, as published on Thunderstore
  • ✓LicenseNot published by the sourceFree

Dyrr, answered

Generated from the mod’s own source data.

Which loaders does it support?

BepInEx.

Is it free?

Yes. Dyrr is free to download from Thunderstore.

How do I add it to my Nxeon server?

Use “Add to a server” on this page, or open NxLabs from your dashboard. We install it, restart your server and switch it on.

NxLabs

Run Dyrr on a Valheim server.

Deploy in about a minute from $9.99 a month, then add Dyrr in one click.