Valheim
Install with App

Details

Latest version
1.1.2
Last Updated
First Uploaded
Downloads
1.3K
Likes
2
Size
1.4MB
Dependants
ADDatHost Valheim hosting
30% off

Hoedin

This is MagicMike's mod. Hoedin is nothing more than a compatibility port of MyDirtyHoe 2.0.2 so it runs on current Valheim. Every tool, every piece, every bit of design in here is MagicMike's work — the only thing added was the plumbing needed to make it load again.

It is meant to be temporary. The moment MagicMike updates MyDirtyHoe, install his and delete this; this package will be taken down. If MagicMike would like it removed sooner, say the word and it goes immediately.

Sorry about 1.1.0

1.1.0 (14 Sep 2026) broke every hoe operation on the client — the piece placed, the effect played, and the ground never moved, with a stack trace in the log per click. That was a typo-class mistake in the radius fix, not anything in MagicMike's mod, and it was live for about two hours before 1.1.1 replaced it. If you played in that window and thought the mod was dead, it was: update and it works. Apologies for the wasted evening.

Why it exists

MyDirtyHoe 2.0.2 was published in June 2025 and still installs cleanly today — which is exactly the problem. On current Valheim the hammer menu fills in, the pieces place, the effects play, and the ground never moves. No error, no crash, nothing in the log that looks wrong. It just silently does nothing.

Three separate changes cause it:

  1. TerrainComp was sealed. m_initialized, m_width, m_modifiedHeight, m_levelDelta, m_smoothDelta, m_modifiedPaint, m_paintMask, m_nview and Save() all became private; the mod read and wrote them directly.
  2. Signatures changed. Heightmap.Poke(bool) became Poke(int delayed = 0, bool paintOnly = false), Piece.SetCreator gained a PlatformUserID, and Terminal.ConsoleCommand's constructor gained an argument before the options fetcher.
  3. Terrain operations stopped carrying their settings over the wire. The game now sends only a prefab hash and resolves it against a registry built from the shipped ObjectDB. A modded piece is not in that list, so the server logs "Failed to deserialize TerrainOp settings … cancelling TerrainOp" and returns null — the piece still places, and the terrain is never touched. This one breaks every mod that adds terrain pieces, not just this one.

Note that none of the first two is a missing name, which is why a name-only compatibility check calls the mod healthy. It is not.

What changed

  • Every now-private TerrainComp member goes through Harmony FieldRefAccess delegates, built once at load. This runs per terrain vertex across a radius, so reflection on every access would have been felt.
  • Call sites were fixed against the game's own usage rather than guesswork — Poke(1) because the game itself calls the delayed form that way, and SetCreator(id, PlatformManager.DistributionPlatform.LocalUser.PlatformUserID) copied from Player.
  • A Harmony prefix on ObjectDB.UpdateRegisters adds the bundle's terrain-op prefabs to m_terrainOps before the game rebuilds its hash table, which fixes point 3 above. A prefix rather than a postfix so the game does its own hashing — a postfix would have to duplicate that and would rot when it changes.
  • The scroll-wheel radius works again (1.1.1). MyDirtyHoe changes the radius by adjusting the placed piece's settings, and before 1.0.7 those settings travelled with the terrain operation. Now only the prefab hash does, so the server applied the default size every time while the preview happily scaled — a feature that looked like it worked and did nothing. Hoedin appends the radius change to the operation itself and reads it back on the receiving side. An unscrolled placement is byte-for-byte vanilla, and a sender or receiver without this build is simply applied at the default size. If Ctrl+scroll grew the preview but the ground always came out the same size, 1.1.1 should fix it (1.1.0 tried and broke every hoe operation on the client instead — do not run it). If it still does not on a 1.1.1 server, send the server owner your BepInEx/LogOutput.log.
  • Its own plugin GUID (org.zrikzinc.hoedin) and config folder, so it can sit beside the original instead of fighting it.

No features were added, removed or rebalanced — the radius change above restores one of MagicMike's, it does not add one.

Install

Needs BepInEx and Jotunn (both listed as dependencies, so a mod manager pulls them in).

Install it on the server and on every client. Each side resolves terrain-op prefab hashes against its own ObjectDB, so a client without it cannot apply the operations even when the server has it.

Manual install:

BepInEx/plugins/Hoedin/Hoedin.dll
BepInEx/config/Hoedin/Translations/English/Hoedin.json

Remove MagicMike-MyDirtyHoe first if you have it. The two carry different plugin ids, so BepInEx loads both side by side without a word of complaint, and they then fight over the same prefabs. If the ground still refuses to move, check your profile for a leftover copy — that is the usual cause.

Usage

Craft the Dirty Hoe. With it equipped, right-click opens the piece menu (the same button that opens the hammer's build menu — it is not Tab, which trips people up). The menu gives you smooth, flatten, raise, lower, cultivate and the removal tools.

Changing the size: with a piece selected, hold Left Ctrl and scroll to grow or shrink the radius (0.3 m per notch), or hold = / -. The ghost preview scales with it, and the size resets when you leave build mode. The keys, the modifier and the step are all in BepInEx/config/org.zrikzinc.hoedin.cfg under Hoe Radius Settings. Both the server and the placing client need 1.1.1 or newer for the change to apply; on an older server the piece lands at its default size.

resetterrain is available in the console.

Versions

The package is 1.1.2. The plugin reports 1.0.7.4 in game — that is this port's own build number, carried over from when the port was first made. Verified loading clean on Valheim 1.0.12 with BepInEx 5.4.2350 and Jotunn 2.30.0.

Credit and licence

MyDirtyHoe is MagicMike's, including the asset bundle this package ships. It is redistributed here only to keep a much-loved tool working during a gap in compatibility, with no claim of ownership and nothing charged for it. No licence file accompanied the original, so this is published on the understanding that it comes down on request or on the original being updated, whichever is first.

Port by zrikz. Bug reports for the port belong here; bug reports for the mod belong with MagicMike once his build is current again.

Thunderstore development is made possible with ads. Please consider making an exception to your adblock.