Wiki 9Minecraft Wiki 9Minecraft

Creating Custom Boat Entities

How to build rideable surface watercraft using entity buoyancy and input ground control.

6Sections
3Code examples
4Known errors

Unlike normal mobs, the vanilla boat in Minecraft Bedrock uses hardcoded C++ movement physics and oar animations that are not exposed as a single component. To create a custom boat, raft, or ship in an add-on, you assemble a normal rideable entity that combines liquid buoyancy, player movement control, and water speed multipliers. You reach for this setup whenever you need a multi-seat water vehicle, a motorized boat, or a custom raft with its own inventory.

How Bedrock Handles Custom Watercraft

If you open the vanilla behavior pack file for the oak boat, you will notice it is missing movement and AI goals. The game engine intercepts the "minecraft:boat" identifier and applies rowboat physics directly in native code. Because custom entity identifiers do not receive that special treatment, copying the vanilla boat JSON will leave you with an immobile block of wood.

Instead, custom boats are built the same way as custom horses or cars, with two important additions: "minecraft:buoyant" to keep the hull on the water surface, and "minecraft:underwater_movement" paired with "minecraft:water_movement" so the entity does not slow to a crawl when it touches a river.

Behavior Pack Entity Definition

The server-side definition needs five core components working together: "minecraft:rideable" to place players in seats, "minecraft:input_ground_controlled" so the driver's WASD or thumbstick input steers the craft, "minecraft:movement.generic" to process velocity, "minecraft:buoyant" to float, and collision/physics components.

Notice that "minecraft:input_ground_controlled" works on water surfaces as long as the entity is kept afloat by "minecraft:buoyant". The "base_buoyancy" value determines how high the entity sits in the water, while "liquid_blocks" defines which block identifiers provide lift.

BP/entities/custom_skiff.json
{
  "format_version": "1.20.80",
  "minecraft:entity": {
    "description": {
      "identifier": "my_pack:custom_skiff",
      "is_spawnable": true,
      "is_summonable": true,
      "is_experimental": false
    },
    "components": {
      "minecraft:type_family": {
        "family": ["boat", "inanimate"]
      },
      "minecraft:collision_box": {
        "width": 1.4,
        "height": 0.6
      },
      "minecraft:health": {
        "value": 40,
        "max": 40
      },
      "minecraft:physics": {
        "has_gravity": true,
        "has_collision": true
      },
      "minecraft:pushable": {
        "is_pushable": true,
        "is_pushable_by_piston": true
      },
      "minecraft:movement": {
        "value": 0.25
      },
      "minecraft:underwater_movement": {
        "value": 0.25
      },
      "minecraft:water_movement": {
        "drag_factor": 0.98
      },
      "minecraft:movement.generic": {},
      "minecraft:input_ground_controlled": {},
      "minecraft:buoyant": {
        "base_buoyancy": 1.0,
        "apply_gravity": true,
        "simulate_waves": true,
        "big_wave_probability": 0.03,
        "big_wave_speed": 10.0,
        "liquid_blocks": [
          "minecraft:water",
          "minecraft:flowing_water"
        ]
      },
      "minecraft:rideable": {
        "seat_count": 2,
        "crouching_skip_interact": true,
        "family_types": ["player", "mob"],
        "interact_text": "action.interact.ride.boat",
        "controlling_seat": 0,
        "seats": [
          {
            "position": [0.0, 0.2, 0.2],
            "min_rider_count": 0,
            "max_rider_count": 2,
            "lock_rider_rotation": 90
          },
          {
            "position": [0.0, 0.2, -0.6],
            "min_rider_count": 2,
            "max_rider_count": 2,
            "lock_rider_rotation": 90
          }
        ]
      }
    }
  }
}

Key Watercraft Components

Getting the feel of a boat right requires tuning the interaction between drag, buoyancy, and seat locks. The table below outlines the fields that matter most for surface vessels.

Component / FieldWhat it doesNotes
minecraft:buoyant -> base_buoyancyControls upward force in liquids1.0 is standard floating. Higher values push the hull further out of the water, which can cause bobbing.
minecraft:buoyant -> simulate_wavesAdds gentle vertical rocking motionPurely physical vertical offset; pair with a roll animation in the resource pack if you want visual tilting.
minecraft:water_movement -> drag_factorMultiplier applied to velocity in waterRanges from 0.0 to 1.0. Higher values like 0.98 let the boat glide farther after the player releases the forward key.
minecraft:rideable -> controlling_seatZero-based index of the driver seatMust match the seat used by the player who steers with "minecraft:input_ground_controlled".
seats -> lock_rider_rotationClamps how far the rider can turn their bodySet to 90 or 120 so the seated player faces mostly forward like in a vanilla boat.

Placing the Boat from an Item

Vanilla boats are placed using an item that raycasts onto water, not a standard spawn egg. To replicate this cleanly without complex scripting, use "minecraft:entity_placer" on a custom item and enable "dispense_on" and "use_on" restrictions, or allow placement on water blocks.

Note that "minecraft:entity_placer" places the entity on the solid block under the water unless you include "minecraft:liquid_clipped": true inside the item's components. With liquid clipping enabled, right-clicking the surface of a river spawns the boat directly on top of the water block.

BP/items/custom_skiff_item.json
{
  "format_version": "1.20.80",
  "minecraft:item": {
    "description": {
      "identifier": "my_pack:custom_skiff_item",
      "menu_category": {
        "category": "items",
        "group": "itemGroup.name.boat"
      }
    },
    "components": {
      "minecraft:max_stack_size": 1,
      "minecraft:liquid_clipped": true,
      "minecraft:icon": "custom_skiff",
      "minecraft:entity_placer": {
        "entity": "my_pack:custom_skiff"
      }
    }
  }
}

Dropping the Item When Broken

Because your custom boat is a health-based entity rather than a hardcoded vehicle, punching it deals normal entity damage. To make it drop its item form quickly when a player hits it, keep its health low or attach "minecraft:loot" pointing to a loot table that drops "my_pack:custom_skiff_item".

If you want to prevent the boat from showing the red hurt flash and playing flesh hit sounds, configure the client entity definition and sound definitions in your resource pack, and add "minecraft:damage_sensor" in the behavior pack to filter out fall damage or cactus damage if desired.

Resource Pack Setup and Rider Posture

On the client side, a custom boat needs a geometry model, texture, and render controller just like any other mob. If your boat has oars or a propeller, animate them in a standard animation file by querying "q.modified_move_speed" in Molang so they only move when the boat is traveling.

By default, players riding any entity automatically enter the vanilla sitting pose because the player's own client entity file checks "q.is_riding". You only need to adjust the Y value in the "position" array of "minecraft:rideable" so the player's hips rest on the bench of your model rather than floating above the deck.

RP/entity/custom_skiff.entity.json
{
  "format_version": "1.10.0",
  "minecraft:client_entity": {
    "description": {
      "identifier": "my_pack:custom_skiff",
      "materials": {
        "default": "entity_alphatest"
      },
      "textures": {
        "default": "textures/entity/custom_skiff"
      },
      "geometry": {
        "default": "geometry.custom_skiff"
      },
      "animations": {
        "move": "animation.custom_skiff.move"
      },
      "scripts": {
        "animate": [
          "move"
        ]
      },
      "render_controllers": [
        "controller.render.default"
      ]
    }
  }
}

Which versions this applies to

Applies to Bedrock Edition 1.20.80 and newer without any experimental toggles. All entity and item components used here are part of the stable schema.

When it does not work

What you seeWhyThe fix
The boat spawns at the bottom of the river or ocean when placed with the item, then slowly floats up.By default, item raycasting passes right through water and targets the dirt or sand block on the riverbed.Add "minecraft:liquid_clipped": true to the placing item's "components" block so the player's click hits the top face of the water block.
The player can mount the boat and turn it left and right, but pressing forward does not move the boat in water (or it moves at a crawl).You either omitted "minecraft:movement.generic" or forgot "minecraft:underwater_movement". Even when floating on the surface, the entity's bounding box intersects water blocks, so the engine uses its underwater speed stat.Ensure both "minecraft:movement.generic": {} and "minecraft:underwater_movement" (with a "value" around 0.2 to 0.3) are present alongside "minecraft:movement".
Content Log error: "[Json][error] minecraft:buoyant: 'liquid_blocks' contains unknown block"A block name in the "liquid_blocks" array is misspelled or missing the "minecraft:" namespace, or uses an outdated block identifier.Use exact block identifiers: "minecraft:water" and "minecraft:flowing_water".
The boat violently bounces up and down on the water surface."base_buoyancy" in "minecraft:buoyant" is set too high for the entity's collision box height, causing it to launch out of the water, fall back down with gravity, and repeat.Lower "base_buoyancy" to 1.0 (or slightly below, such as 0.9) and make sure the collision box "height" is at least 0.5.

Reference, straight from the game files

Read out of the game itself, so the ids match the version you are building for.