/blockships highlightcolliders debug commandProtocolLib Vehicle Position Sync (1c57ae3, 113c3b3)
Ship display entities now receive vehicle position packets every tick via ProtocolLib, significantly reducing perceived display lag and rubber-banding for riders and nearby players.
Highlight Colliders Debug Command (1850bd1)
New /blockships highlightcolliders command toggles a glowing outline on all collision shulker entities belonging to a ship. Useful for debugging collision geometry and verifying collider placement.
Per-Tick Performance Improvements (7281ceb, 4d33f3d, 67e6d86, 659d90d)
Broad sweep of per-tick optimizations across the ship movement and collision pipeline.
Paper 26.1.2 Support (8ab89f8, a86f761, 9f0cd89)
Added Paper 26.1.2 to the CI test matrix. Bot-based integration tests are skipped on 26.x until minecraft-protocol adds support for the new protocol version.
Ship Movement Choppiness on Water Ships (e5a0f1a)
Water ships exhibited choppy movement and walking-on-deck bugs caused by stale position state being fed into the buoyancy and movement pipeline.
Root cause: Vehicle location was not refreshed between movement phases within the same tick, so buoyancy and player-walk corrections operated on outdated positions.
Player Clipping on Dismount, Assembly, and Disassembly (eebd894, e94f7a7)
Players dismounting a ship could be teleported inside nearby solid blocks. The previous fix used a blind Y-offset that was unreliable for multi-deck ships and ships near terrain.
Solution: Calculate a safe dismount position by scanning nearby colliders and finding an unobstructed location. Also fixed clipping on assembly and disassembly where players were not repositioned relative to the new block layout.
Player Launch on Ship Assembly (63c1941, bae9102)
Assembling a ship could launch nearby players into the air because collision carrier entities were spawned at the ship root and then teleported to their final positions. The moving shulkers pushed players as they traveled.
Solution: Spawn collision carriers directly at their final world positions instead of teleporting them from the ship root. Collider world-position math extracted into computeColliderWorldPos for reuse.
Deck Jitter on Moving Ships (c61fbb6, ce17c97, fbb6961, 0e3a942, 35fa46a)
Players standing on a moving ship's deck experienced rapid ~0.1 block Y oscillation, especially on ships with buoyancy.
Root cause: Minecraft's entity tracker sends relative-move packets at 1/4096 block resolution. Over time, carrier ArmorStand positions on the client accumulate precision drift, putting shulker collision boxes at Y values where the client's gravity-collision cycle doesn't converge. The jitter was purely client-side — it persisted even during /tick freeze and only cleared after ~10 seconds or a relog.
Solution: When the ship stops moving, call hideEntity + showEntity on each carrier for all tracked players. This forces the client to discard stale entity state and receive fresh SPAWN_ENTITY packets with exact server-side positions. For airships, the refresh also triggers when vertical velocity zeroes out.
Display Entity Teleport Smoothing (9ebe9a6)
Display entities lagged behind the ship during movement because teleport smoothing was not correctly applied to BlockDisplay entities. Additionally, the dismount height filter incorrectly rejected valid dismount positions above or below the ship center.
Solution: Apply proper interpolation to display entity teleports and widen the dismount height filter to accept positions across the full ship height.
Stale Vehicle Location in Terrain Collision (4d33f3d)
The terrain collision loop used a cached vehicle location that could become stale mid-tick after buoyancy or gravity adjustments moved the ship.
Solution: Refresh the cached location after each movement phase within the collision loop.
Sync/Async Save Race in Chunk Unload (9ce4177)
Ship data could be corrupted or lost when a chunk unload triggered a synchronous save while an async save from the wheel manager was already in flight.
Solution: Serialize save operations so only one write is active at a time, preventing partial overwrites.
Ship Floats Above Water With Trapdoor/Top-Slab Hull (76b3993)
Ships whose bottom row was made of top slabs or trapdoors appeared to float above the waterline because the buoyancy calculation used the full block Y as the ship's bottom edge.
Solution: Account for top-slab half-height when com✨g the ship's lowest extent, and exclude trapdoors from the bottom-edge calculation entirely since they do not displace water.
Seat Shulker Health Overflow (8b2b878)
Calling setHealth on seat shulkers could throw an IllegalArgument exception when the health value exceeded the entity's max health attribute.
Solution: Clamp health to the entity's max health before calling setHealth.

build ships or airships out of blocks and sail or fly them smoothly - without client side mods or resource packs!