Bedrock Wiki
  • Discord
  • Contribute
  • bedrock.dev
  • MS Learn
Beginner's Guide
  • Guide
    • 1. Introduction
      guide
    • 2. Add-Ons Explained
    • 3. Software & Preparation
    • 4. Project Setup
    • 5. Create a Custom Item
    • 6. Create a Custom Entity
    • 7. Blockbench: Modeling, Texturing & Animating
    • 8. Adding a Loot Table, Spawn Rule & Crafting Recipe
  • Extra
    • a. Understanding JSON
    • b. Download Example Packs
    • c. Troubleshooting
      help
    • d. Advanced Manifest
    • e. Format Versions
    • f. Project Setup Android
Animation Controllers
  • Intro to Animation Controllers
    guide
  • Entity Commands
  • AFK Detector
  • Death Commands
  • Molang into Scoreboard
  • Respawn Commands
Blocks
  • General
    • Intro to Blocks
      guide
    • Block Components
    • Block Tags
    • Block States
    • Block Traits
    • Block Permutations
    • Block Events
      Scripts
    • Block Event Migration
      help
    • Blocks as Items
    • Multi-Blocks
    • Troubleshooting Blocks
      help
  • Sound & Visuals
    • Intro to Block Visuals
      guide
    • Block Culling
    • Block Models
      guide
    • Block Sounds
    • Block Texture Animation
    • Block Texture Variation
    • Block Tinting
  • Tutorials
    • Applying Effects
      Scripts
    • Avoiding State Limit
    • Block Orientation
    • Fake Blocks
      Scripts
    • Intercardinal Orientation
      Scripts
    • Ore Loot Tables
      Scripts
    • Tool-Based Destruction
  • Vanilla Re-Creations
    • Custom Crops
      Scripts
    • Custom Glass
    • Custom Glazed Terracotta
    • Custom Heads
      Scripts
    • Custom Trapdoors
      Scripts
  • Documentation
    • Block Format History
    • Block Shapes
    • Redstone Components
    • Vanilla Block Models
    • Vanilla Block Sounds
    • Vanilla Block Tags
    • Vanilla Voxel Shapes
Commands
  • General
    • Intro to Command Blocks
    • Understanding Selectors
    • Functions
      guide
    • Block States
    • Coordinate System
    • Giving NBT Items
    • Scoreboard Operations
  • Commands
    • Damage
    • Execute
    • Playanimation
    • Playsound
  • On Event Systems
    • On First World Load
      function
    • On Player First Join
    • On Player Join
    • On Player Leave
    • On Player Death
    • On Player Respawn
  • Scoreboard Systems
    • Entity Counter
    • Scoreboard Timers
    • Comparing And Retrieving Scores
  • Detection Systems
    • Look Detection
    • Item Drop Detection
    • Movement Detections
    • Rain Detection
  • Techniques
    • Execute Logic Gates
      concept
    • Execute at Block Variant
    • Execution Forking
      concept
    • Binary in Commands
      concept
    • MBE - Max's Block Entity
    • FMBE - A New Way to Create Display Entities
    • Dynamic Displays
    • Orbital Camera
  • Useful Creations
    • Sphere Command
    • Compass Display
    • Custom Crafting
    • Multiplayer Position Rearrangement
      function
Concepts
  • contents.json
  • Molang
  • Namespaces
  • Overwriting Assets
  • Shaders
  • Sounds
  • Subpacks
  • Texture Atlases
  • textures_list.json
Documentation
  • Advanced Molang
  • File Types
  • Fog IDs
  • Material Configuration Description
  • Molang Queries
  • Pack Folder Structure
  • Shared Constructs
  • Sound Definitions
  • Vanilla Materials
Entities
  • General
    • Intro to Entities BP
      guide
    • Intro to Entities RP
      guide
    • Troubleshooting Entities
      help
    • Entity Events
    • Entity Properties
    • NPC Dialogue
    • Render Controllers
    • Spawn Rules
  • Tutorials
    • Area Effect Clouds
    • Coordinate Space Conversion
    • Creating Boats
    • Detecting Other Entities
    • Disabling Team Damage
    • Dummy Entities
    • Entity Attacks
    • Entity Movement
    • Entity Timers
    • Holding Items
    • Invulnerable Entities
    • Look at Entity
    • Riding Flying Entities
    • Sleeping Entities
    • Solid Entities
    • Spawning Tamed Entities
      Scripts
    • Village Mechanic
  • Documentation
    • Dummy Components
    • Non-Mob Runtime Identifiers
    • Projectiles
    • Runtime Identifiers
    • Vanilla Usage Components
    • Vanilla Usage Spawn Rules
Items
  • General
    • Intro to Items
      guide
    • Item Components
    • Item Tags
    • Item Events
      Scripts
    • Item Event Migration
      help
    • Item Catalog
    • Troubleshooting Items
      help
  • Tutorials
    • Equipment-Based Commands
    • Spawning Items
    • Throwable Items
  • Vanilla Re-Creations
    • Custom Armor
    • Custom Food
      Scripts
    • Custom Pottery Sherds
    • Custom Weapons
  • Documentation
    • Enchantments
    • Attachables
    • Item Format History
    • Numerical Item IDs
    • Vanilla Item Groups
    • Vanilla Item Tags
    • Vanilla Usage Components
JSON UI
  • General
    • Intro to JSON UI
      guide
    • Best Practices
      guide
  • Tutorials
    • Adding HUD Elements
    • Aseprite Animations
    • Buttons and Toggles
    • Modifying Server Forms
    • Preserve Title Texts
    • String to Number
  • Documentation
    • JSON UI Documentation
Loot, Recipes & Trading
  • General
    • Trading Behavior
  • Documentation
    • Loot Tables
    • Trade Tables
    • Recipes
    • Item Functions
  • Tutorials
    • Randomized Structure Loot
Meta
  • Add-On Performance
  • Style Guide
  • Useful Links
  • Using Schemas
  • Version Control
  • Q&A
    • Blocks and Items Q&A 2024/08/30
    • Deferred Technical Preview Q&A 2024/02/23
    • GameTest Q&A 2021/08/06
    • Scripting and Editor Q&A 2023/09/22
    • World Generation Q&A 2024/11/15
NBT
  • General
    • .mcstructure
  • Tutorials
    • Enabling Experiments by Editing NBT
    • Extending Structure Limits
  • NBT in Depth
    • About NBT (Named Binary Tag)
    • NBT Libraries
    • Reading NBT Example
Particles
  • General
    • Intro to Particles
      guide
  • Tutorials
    • Disabling Particles
  • Documentation
    • Vanilla Particles
Scripting
  • General
    • Intro to Scripting
    • What is Script API?
    • API Modules
  • Tutorials
    • Block Placement Prevention
    • Custom Commands
    • GameTests
    • Script Core Features
    • Script Privileges
    • Script Requests API
    • Server Forms
  • Documentation
    • Engine Environment
    • Script Resources
    • Script Watchdog
    • Troubleshooting JavaScript
    • TypeScript
Servers
  • Software
    • Bedrock Server Software
  • Protocols
    • Bedrock Protocol
    • NetherNet Protocol
    • RakNet Protocol
Text & Localization
  • General
    • Intro to Text & Localization
    • Raw Text
    • Splashes
  • Emojis & Symbols
    • Fonts
    • Intro to Emojis
    • Custom Emojis
    • Input Keys
Visuals
  • General
    • Introduction to Entity Visuals
      guide
    • Bedrock Modeling
    • Custom Death Animations
    • Effects in Animations
    • Material Creations
    • Materials
    • Math-Based Animations
    • Skin Packs
  • Tutorials
    • Entity Texture Animation
    • Glowing Entity Texture
    • Hurt Animations
    • Leash Position
    • Player Geometry
    • Remove Entity Shadows
    • Retexturing Spawn Eggs
  • Ideas
    • Structure Presentation
World Generation
  • General
    • Intro to World Generation
      guide
    • Biomes
      guide
    • Feature Types
    • Jigsaw Structures
  • Tutorials
    • Block Conditions for Features
    • Generating Custom Ores
    • Generating Custom Structures
    • Generating Patches
    • Heightmap Noise
  • Documentation
    • Biome Tags

Multi-Blocks

experimental
intermediate
Multi-Blocks
  • What Are Multi-Blocks?
    • Part Indices
    • Selection
    • Destruction
  • Creating Multi-Blocks
    • Multi-Block Trait
    • Part Visuals
    • Block Item
  • Multi-Block Limitations
    • Component Application
    • Movability
    • Snowlogging
    • State Equality
  • Event Triggering
    • Custom Component Hooks
    • World Event Signals

EXPERIMENTAL 1.26.20

Multi-blocks are experimental and require the "Upcoming Creator Features" toggle to be enabled in order to function.

What Are Multi-Blocks? ​

A diagram of an oak door that has been separated into its two vertical halves.

A multi-block is a type of block that is able to occupy the space of more than a single block unit (16×16×16 pixel cube) in a given direction. This is because multi-blocks are actually comprised of smaller individual blocks known as parts.

An example of an existing vanilla multi-block is the door, which has two parts: a top and a bottom.

Part Indices ​

Each part of a multi-block is assigned an index, starting from 0 at the position where the block was originally placed. This index is stored in the minecraft:multi_block_part state of each part of a multi-block.

Doors are a type of multi-block that extend upwards from the position where the player attempted to place the block. Therefore, the bottom part of the door is assigned an index of 0 and the top of the door is assigned the next index of 1.

Selection ​

A diagram of an oak door that has been separated into its two vertical halves.

Parts of a multi-block are technically separate blocks, meaning that only one part of a multi-block can be selected at once. However, Minecraft performs some visual trickery which makes it look like the player is selecting the entire multi-block:

  • When "outline selection" is enabled in video settings, the selection outline will appear as a single large box that encompasses the selection boxes of all parts. Note that this larger selection outline is purely visual so, in reality, the selection boxes of each part are still treated individually.

  • When "outline selection" is disabled in video settings, all parts of the multi-block will be highlighted when any part is selected.

Destruction ​

When part of a multi-block is broken, all other parts of the multi-block are also broken as a result. However, only the part that was originally broken drops its loot.

When part of multi-block is being mined, destruction cracks are displayed on all parts of the multi-block simultaneously. However, given that mining progress is stored for each part individually, progress will be reset if the player changes the part that is being targeted in the middle of mining.

Creating Multi-Blocks ​

Multi-Block Trait ​

To register a block type as a multi-block, it must have the minecraft:multi_block trait. This block trait allows you to define how many parts your multi-block has and the direction in which it extends.

Custom multi-blocks can have 2-4 parts and are currently only able to extend upwards or downwards, not horizontally.

BP/blocks/multi_block_example.json
json
{
    "format_version": "1.26.20",
    "minecraft:block": {
        "description": {
            "identifier": "wiki:multi_block_example",
            "traits": {
                // This trait causes the block to be treated as a multi-block
                "minecraft:multi_block": {
                    "enabled_states": ["minecraft:multi_block_part"], // This state stores the index of each part
                    "direction": "up", // May also be "down"
                    "parts": 2 // Must be in the range 2-4
                }
            }
        },
        "components": {
            // Multi-blocks cannot be pushed by pistons
            "minecraft:movable": {
                "movement_type": "popped"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Part Visuals ​

Let's give each part of this multi-block its own appearance, similar to how the lower and upper parts of a door have different textures.

We can do this using the permutations array, with conditions querying q.block_state('minecraft:multi_block_part').

BP/blocks/multi_block_example.json
json
{
    "format_version": "1.26.20",
    "minecraft:block": {
        "description": {
            "identifier": "wiki:multi_block_example",
            "traits": {
                // This trait causes the block to be treated as a multi-block
                "minecraft:multi_block": {
                    "enabled_states": ["minecraft:multi_block_part"], // This state stores the index of each part
                    "direction": "up", // May also be "down"
                    "parts": 2 // Must be in the range 2-4
                }
            }
        },
        "components": {
            // Multi-blocks cannot be pushed by pistons
            "minecraft:movable": {
                "movement_type": "popped"
            },
            // Visuals for part 0
            "minecraft:geometry": "geometry.example_bottom",
            "minecraft:material_instances": {
                "*": {
                    "texture": "wiki:example_bottom"
                }
            }
        },
        "permutations": {
            "condition": "q.block_state('minecraft:multi_block_part') == 1", // Checks for part 1
            "components": {
                // Visuals for part 1
                "minecraft:geometry": "geometry.example_top",
                "minecraft:material_instances": {
                    "*": {
                        "texture": "wiki:example_top"
                    }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

Block Item ​

By default, the block will only display its first part (with index 0) when represented as an item, leading to the block looking cut-off in the inventory. This issue can be overcome in two ways:

  • By giving the block a 2D item icon by replacing its block item with an item that has the minecraft:icon component. This is the approach taken by vanilla multi-blocks such as beds, doors and tall grass.

  • By giving the item representation of the block dedicated geometry and material instances using the minecraft:item_visual component.

Multi-Block Limitations ​

Component Application ​

The following components may not be specified in the permutations array of a multi-block definition so can only be applied in the base components object.

  • minecraft:movable
  • minecraft:placement_filter
  • minecraft:precipitation_interactions
  • minecraft:random_offset
  • minecraft:replaceable

Movability ​

Multi-blocks cannot be pushed by pistons as this would allow parts to become disconnected when moved. Therefore, a minecraft:movable component must be defined with a movement_type of either "immovable" or "popped". Omitting this component will prevent the block from being registered as well as displaying an error in the content log.

Most vanilla multi-blocks are popped off as items when a piston attempts to push them, excluding extended pistons which are immovable.

minecraft:block > components
json
"minecraft:movable": {
    "movement_type": "popped"
}
1
2
3

Snowlogging ​

REQUIRES 1.26.30

Prior to version 1.26.30, snowlogging is not supported by multi-blocks. Attempting to submerge part of a multi-block in snow instead results in the multi-block being destroyed.

Attempting to place snow in part of a snowloggable multi-block will result in the multi-block being submerged in snow from its bottom part upwards, rather than the snow always being placed in the part that was selected.

Targeting part of a multi-block that contains snow will select the snow layer rather than the multi-block. This means that attempting to break a snowlogged part will break the snow layer, leaving the multi-block. However, attempting to break a part that is not snowlogged will break the multi-block, leaving any snow layers.

State Equality ​

Excluding the minecraft:multi_block_part state, the states of every part of a multi-block must have equal values. For example, doors have a minecraft:cardinal_direction state that determines which direction the door should face. By requiring this state to be equal across parts, the top and bottom of the door will never be facing different directions.

To change the value of a multi-block state, the state must be updated on every part simultaneously.

Using scripts, this can be achieved by getting all parts associated with a given block using the getParts() method. This method returns an array of the individual blocks that make up the multi-block in part index order. We can then set the permutation of every part at the same time, preventing the multi-block from breaking due to unequal states across parts.

Script
js
// Assume we have ensured that "block" is a part of the multi-block
for (const part of block.getParts()) {
    part.setPermutation(part.permutation.withState("wiki:color", "red"));
}
1
2
3
4

Event Triggering ​

Custom Component Hooks ​

  • The beforeOnPlayerPlace() hook is only called for the first part of a multi-block.

    • Modifying the permutationToPlace event property will change the states of all parts that are subsequently placed.
    • Modifying the minecraft:multi_block_part state will prevent the multi-block from being placed.
  • The onPlace() hook is called for every part of a multi-block in part index order.

  • The onBreak() hook is only called for the part of a multi-block that was originally broken, not for the other parts that are broken as a result.

  • The onPlayerBreak() hook is not supported by multi-blocks so will never be called. Consider using the onBreak() hook instead:

    Custom Component
    js
    onBreak(event) {
        // Whether the block was broken by a player
        const wasBrokenByPlayer = event.entitySource instanceof Player;
    
        // Exit the hook if the block was not broken by a player
        if (!wasBrokenByPlayer) return;
    
        console.log("A player broke the multi-block!");
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9

World Event Signals ​

  • Subscriptions to the following event signals are only called for the first part of a multi-block:

    • world.beforeEvents.playerBreakBlock
    • world.beforeEvents.playerPlaceBlock
  • Subscriptions to the following event signals are only called for the part of a multi-block that was targeted:

    • world.afterEvents.playerBreakBlock
    • world.afterEvents.playerPlaceBlock

Contributors

Edit Multi-Blocks on GitHub

Text and image content on this page is licensed under the Creative Commons Attribution 4.0 International License

Code samples on this page are licensed under the MIT License

Bedrock Wiki by Bedrock OSS

"Minecraft" is a trademark of Mojang AB.

Bedrock OSS, Bedrock Wiki and bedrock.dev are not affiliated in any way with Microsoft or Mojang AB.

  • Privacy Policy
  • Join our Discord
  • Learn how to Contribute
  • Visit our Repository