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.
MoveBuildPieces
Move existing Valheim build pieces inside base build areas with preserved state, multiplayer locks, direct recipe knowledge checks, and optional AAABuildMenu compatibility.
| Date uploaded | 2 weeks ago |
| Version | 1.1.1 |
| Download link | DragonMotion-MoveBuildPieces-1.1.1.zip |
| Downloads | 240 |
| Dependency string | DragonMotion-MoveBuildPieces-1.1.1 |
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.2333README
MoveBuildPieces
Move existing player-built Valheim pieces without destroying them. Inventories, fuel, production state, ownership, upgrades, and other ZDO-backed data stay on the original network object.
Usage
World: outside build mode, hover a removable player-built piece and press the world hotkey.BuildMenu: equip a build tool, hover a removable player-built piece, and press the build-menu hotkey.Mixed: use one hotkey in either context; the mod chooses the correct placement path.- Place the blue vanilla placement ghost to move the original object.
- Press the same hotkey again or
Escapeto cancel. Estill interacts with doors during an active move.Emay also be assigned as a move hotkey; a successful door interaction takes priority for that press.
New configs default to Mixed and U. Existing BepInEx configs keep their saved values.
Config defaults
Move mode = MixedWorld mode move hotkey = UBuild mode move hotkey = UMixed mode move hotkey = URequire known piece = falseBlock terrain modifiers = trueBlock dynamic objects = trueMove lock timeout seconds = 45
Require known piece is independent of the build-menu UI. When enabled, the mod checks the player's real known-recipe set through Player.IsRecipeKnown using the runtime and canonical prefab names. When disabled, recipe knowledge is not queried at all; the mod only permits relocating that existing piece and never teaches or exposes recipes.
Placement and state refresh
Both the source and destination must stay inside the source position's existing EffectArea.Type.PlayerBase territory - the same base area Valheim counts when suppressing nearby creature spawning. The destination is checked against the exact source-area instances captured before the relocation ghost is created, so a workbench ghost cannot provide its own permission.
The move preview and final click also use Valheim's current placement status: ward, no-build, biome, teleport-area, dungeon, spacing, clipping, support-connection, and station-extension rules remain intact. Relocation does not consume resources, refund materials, invoke PlacePiece, inspect required materials, or require the object's original crafting station. Build-menu visibility, categories, filters, and ordering are not authorization inputs.
After a successful move, the mod invalidates and rebuilds position-dependent state once: WearNTear support and environment caches, nearby crafting-station upgrades and ranges, StationExtension links, cached fire/no-monster bounds, ward connections, sap collectors, shields, fireplaces, static rotation, and claimed-bed spawn points. Unsupported structural pieces are rolled back before their new transform is synchronized.
Terrain-changing pieces, unsafe dynamic objects, nested network objects, occupied attach points, active containers, and beds claimed by another player remain blocked by default where a single-object relocation cannot preserve their state safely.
Multiplayer
Install the same mod version on the server and on every client that can own or move pieces. Moves use an expiring per-object lock and one-time transaction token. The current ZDO owner validates and applies the transform; the requester finishes only after the server has observed the exact token and transform. The lock stays held until that confirmation, preventing a second move from overwriting the pending transaction.
The server distributes Enabled, Require known piece, terrain/dynamic safety, and lock-timeout policy. Valheim does not replicate a remote player's complete known-recipe set, so Require known piece is enforced by the requesting client under that server policy rather than being described as a server-verifiable fact.
Move traffic uses six session-level routed handlers instead of registering six closures on every loaded build piece. Protocol V4 rejects mixed releases before a move starts. Placement and visual scans run only while the local player is actively moving an object, and unchanged visual geometry is cached.
AAABuildMenu compatibility
Compatibility activates only when Azumatt.AAABuildMenu is installed. Every move uses an isolated one-piece PieceTable normalized to the internal vanilla Misc slot; the real piece category and AAABuildMenu's column count, search, filters, and ordering are irrelevant to selection. AAABuildMenu's refresh is prevented from mutating only that temporary table. The normal build table, active filter, search text, and previous selection are restored after move or cancel.
CHANGELOG
1.1.1
- Fixed the false
Not all requirements have been metrejection for Magic Supremacy'sMagicWeaverDOand every other piece in a custom build category. The isolated relocation table now uses its own vanillaMiscslot and never calls category/index lookup. - Removed build-menu visibility, category order, AAABuildMenu columns/search/filters, required materials, and
Player.HaveRequirementsfrom relocation authorization. - Made
Require known pieceuse only the player's real known-recipe set throughPlayer.IsRecipeKnown; when disabled, knowledge is bypassed unconditionally. - Restored the intended build-area boundary using the source position's existing
EffectArea.Type.PlayerBaseterritory (the base area used by Valheim's spawn suppression), without requiring the piece's original crafting station. - Capture the exact source build-area instances before creating the ghost, preventing a workbench or other base-piece ghost from authorizing its own destination.
- Resolve the canonical relocation prefab from the authoritative ZDO prefab hash before falling back to its name, improving compatibility with renamed runtime instances.
- Kept the final vanilla placement ghost as the surface/connection/biome/spacing validator and removed the second divergent owner-side static-rule clone that could reject a valid preview.
- Retained owner-side source/target build-area, ward, no-build, reach, unsafe-state, and structural-support rollback checks; bumped multiplayer traffic to protocol V4 so mixed releases fail cleanly.
1.1.0
- Re-audited relocation against the current vanilla placement, ZDO synchronization, crafting-station, station-extension, effect-area, and structural-support paths.
- Removed non-vanilla
PlayerBase, station-at-destination, and repeated source-distance requirements while preserving final vanilla placement validation, ward/no-build checks, target reach, connection rules, and structural support. - Preserved
Require known pieceas an independent recipe-knowledge policy; disabling it permits only the selected existing object and never teaches or exposes recipes. - Always use an isolated one-piece placement table in
World,BuildMenu, andMixed, preserving the normal table and selection across success or cancellation. - Unified placement input across all three modes so relocation is not accidentally gated by the hammer's stamina, durability, or resource-consumption path.
- Added optional AAABuildMenu compatibility for its filtered/search build lists without adding a hard dependency or changing AAABuildMenu when it is absent.
- Rebuild moved workbench upgrade lists/ranges, station-extension links, cached burning/no-monster bounds, and ward connection caches after move and rollback.
- Made nonessential
WearNTearreflection caches optional while retaining the fail-closed support check for pieces that can break without support. - Replaced six per-piece routed-RPC closures with six session-level handlers keyed by
ZDOID; bumped the network protocol and message names to V3. - Hold the object lock until server observation completes so a second move cannot overwrite a pending transaction record.
- Keep that lock lease refreshed while confirmation is pending, and validate fast visual updates against the committed token and ZDO pose.
- Snapshot and restore moved rigidbody velocities plus component cache/environment fields when an owner-side transaction rolls back.
- Store cancelled-request tombstones without retaining player, piece, or
ZNetViewobjects for the late-response safety window. - Cache unchanged move-link geometry and stopped duplicate placement-ghost setup and per-frame duplicate destination scans.
- Allow an explicitly configured
Emove hotkey while giving a successful door interaction priority for that press.
1.0.23
- Prevented
Physics.ClosestPointwarning spam when movable pieces use non-convex mesh or other unsupported collider types. - Kept exact proximity checks for primitive and convex colliders, used collider bounds as a safe fallback for piece-distance checks, and ignored inactive or trigger-only piece colliders.
- Made custom player-base area checks fail closed for unsupported collider shapes instead of calling an invalid Unity physics API.
- Reused component buffers and calculated each object's link endpoint and ring radius from one bounds scan per frame; corrected rotated mesh-only fallback bounds.
1.0.22
- Read player-built identity from the authoritative ZDO creator field whenever Valheim's one-time local
Piece.m_creatorcache differs from the network data. - Split non-removable and missing-creator failures into separate messages and added network identity diagnostics for genuine creator mismatches.
1.0.21
- Fixed the dashed link endpoint jumping toward world origin by removing the premature placement-ghost bounds cache and calculating current object endpoints after vanilla updates the ghost.
- Ignored inactive and near-zero collider/renderer bounds so temporary Unity bounds cannot distort link anchors or floor rings.
- Changed the clean-config default to
Mixed, using its separate hotkey both inside and outside build mode. Existing saved configs remain unchanged.
1.0.20
- Added
Mixedmode and its own configurable hotkey, usable both inside and outside build mode. - Replaced the old move RPCs with versioned, peer-authenticated lock and transaction messages, a direct server capability challenge and authoritative commit check, exact-owner routing, cancellation tombstones, owner-change retry, and bounded timeouts.
- Made the server's enable/safety/knowledge/lease policy authoritative for every possible ZDO owner instead of depending on a random owner's local config.
- Added owner-side requester, distance, ward, base, station, connection, finite-transform, occupied-piece, nested-network-object, and unsafe-area validation.
- Revalidated the vanilla placement ghost immediately before commit and locked the active PieceTable/prefab so copy, removal, or selection changes cannot move the wrong object.
- Fixed duplicate World placement-ghost updates and restored vanilla-style mouse/gamepad rotation handling.
- Rebuilt WearNTear relocation refreshes, including support geometry, roof, biome, heightmap subscription, water, Ashlands, lava, rain, and shield state, without treating the object as newly placed.
- Refreshed sap collectors, shield visuals, fireplace/cinder biome caches, static rotation, and claimed-bed spawn points after a move.
- Optimized active visuals by caching object bounds, reusing renderers/materials, growing dense-base support buffers safely, and targeting support-cache RPCs only at their owners.
- Added complete disable, cancel, death, teleport, logout, Piece destruction, and late-response cleanup.
- Excluded the original object from move-only spacing, required-connection, overlap, and clipping checks while preserving it as a snap source, including rotation in place; prevented a second placement-ghost update in the commit frame.
- Added an expiring challenge-bound server-capability lease, target-bound commit replies, coalesced lock refreshes, exact-owner release during ownership gaps and graceful logout, fail-closed ward compatibility, and transactional owner rollback on exceptions.
1.0.19
- Refuse moves that would immediately violate
WearNTearstructural support, preventing unsupported pieces from breaking after relocation. - Revert owner-side transforms before syncing if the moved piece cannot survive at the target position.
1.0.18
- Prevented vanilla placement from running while move mode is active, even if the selected prefab changes.
- Made the post-move
WearNTearrefresh softer so moved pieces recalculate support bounds without being treated as newly placed objects.
1.0.17
- Clarified the Thunderstore description and README with the two move modes, current defaults, and existing-config behavior.
1.0.16
- Changed new config defaults to
Move mode = WorldandRequire known piece = false.
1.0.15
- Enforced
Require known piecebefore entering move mode, includingWorldmode moves that use the temporary one-piece build table.
1.0.14
- Wait for the ZDO owner to confirm multiplayer moves before completing local move mode.
- Avoid owner-side ward checks that used the ZDO owner's local player instead of the moving player.
- Reduced redundant support-cache broadcasts when clients receive visual move updates.
1.0.13
- Restored the equipped build tool's normal build table when a
Worldmode move is cancelled by equipping a hammer or another build tool. - Prevented
Worldmode moves from starting while a build tool is already equipped.
1.0.12
- Reset relocated
WearNTeargeometry, support, roof, and biome caches after a move so structural support is recalculated at the new position instead of using stale world-space data.
1.0.11
- Suppressed primary and secondary attack input while move mode is active, including the placement click when finishing a
Worldmode move.
1.0.10
- Fixed
Require known piece = falsefor pieces unavailable through the current build list by selecting the temporary move table without vanilla recipe filtering.
1.0.9
- Fixed
Require known piece = falseby preserving the one-piece temporary move table instead of letting vanilla filter it by known recipes.
1.0.8
- Added multiplayer move locks so only one player can move the same object at a time.
- Added lock timeout recovery for disconnects or crashes during move mode.
- Cancelled move mode on player death and when
Worldmode is replaced by normal build mode. - Allowed
Require known piece = falsewithout granting recipes or opening the full build list.
1.0.7
- Added door interaction while move mode is active.
- Added
Require known piececonfig to allow moving player-built pieces before learning their recipes. - Cancelled active move mode automatically when the player starts teleporting.
1.0.6
- Changed the default
BuildMenumove hotkey toU. - Prevented vanilla placement updates during active
Worldmode moves to avoid null-reference errors when no build tool is equipped. - Updated
Worldmode to refresh the placement ghost and finish moves directly while vanilla placement is skipped.
1.0.5
- Replaced separate mode toggles with a single
Move modedropdown. - Fixed
Worldmode piece detection outside build mode by using a direct build-piece raycast.
1.0.4
- Added separate build-mode and world-mode moving.
1.0.3
- Synchronized moved pieces to already connected multiplayer clients immediately after the ZDO owner applies the relocation.
1.0.2
- Moved multiplayer relocation to the ZDO owner instead of claiming ownership locally.
- Kept child rigidbodies in their own transforms while stopping leftover motion after a move.
1.0.1
- Scale the origin and ghost floor rings from the moved object's footprint size.
1.0.0
- Initial Thunderstore release.
- Added build-mode moving for known player-built pieces with a blue placement ghost, raised dashed link, station-range limits, and preserved network object state.