You are viewing a potentially older version of this package. View all versions.
DragonMotion-MoveBuildPieces-1.1.1 icon

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-5.4.2333 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.2333

README

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 Escape to cancel.
  • E still interacts with doors during an active move. E may 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 = Mixed
  • World mode move hotkey = U
  • Build mode move hotkey = U
  • Mixed mode move hotkey = U
  • Require known piece = false
  • Block terrain modifiers = true
  • Block dynamic objects = true
  • Move 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 met rejection for Magic Supremacy's MagicWeaverDO and every other piece in a custom build category. The isolated relocation table now uses its own vanilla Misc slot and never calls category/index lookup.
  • Removed build-menu visibility, category order, AAABuildMenu columns/search/filters, required materials, and Player.HaveRequirements from relocation authorization.
  • Made Require known piece use only the player's real known-recipe set through Player.IsRecipeKnown; when disabled, knowledge is bypassed unconditionally.
  • Restored the intended build-area boundary using the source position's existing EffectArea.Type.PlayerBase territory (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 piece as 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, and Mixed, 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 WearNTear reflection 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 ZNetView objects 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 E move hotkey while giving a successful door interaction priority for that press.

1.0.23

  • Prevented Physics.ClosestPoint warning 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_creator cache 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 Mixed mode 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 WearNTear structural 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 WearNTear refresh 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 = World and Require known piece = false.

1.0.15

  • Enforced Require known piece before entering move mode, including World mode 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 World mode move is cancelled by equipping a hammer or another build tool.
  • Prevented World mode moves from starting while a build tool is already equipped.

1.0.12

  • Reset relocated WearNTear geometry, 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 World mode move.

1.0.10

  • Fixed Require known piece = false for pieces unavailable through the current build list by selecting the temporary move table without vanilla recipe filtering.

1.0.9

  • Fixed Require known piece = false by 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 World mode is replaced by normal build mode.
  • Allowed Require known piece = false without granting recipes or opening the full build list.

1.0.7

  • Added door interaction while move mode is active.
  • Added Require known piece config 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 BuildMenu move hotkey to U.
  • Prevented vanilla placement updates during active World mode moves to avoid null-reference errors when no build tool is equipped.
  • Updated World mode 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 mode dropdown.
  • Fixed World mode 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.