Wiki 9Minecraft Wiki 9Minecraft

Troubleshooting Custom Blocks

Diagnose missing textures, invisible blocks, X-ray bugs, and registration failures.

5Sections
3Code examples
4Known errors

Custom blocks in Bedrock Edition rely on behavior definitions, resource registries, geometry files, and texture mappings all lining up at once. When a single identifier or format version drifts out of sync, the game usually fails silently by rendering a magenta-and-black cube or refusing to register the block entirely. Use this reference to isolate which file in your pack is causing a broken block and how to read the engine's error output.

Enabling the Content Log

Guessing why a block failed to load wastes hours. Minecraft Bedrock includes a built-in diagnostic tool called the Content Log that tells you the exact file, line number, and JSON key that failed schema validation during world load.

Before testing any block changes, go to Settings > Creator and enable both Content Log File and Content Log GUI. When you load into a world, any parsing error or missing resource reference will flash on the top of your screen, and you can press the assigned shortcut key to view the full log history.

Block Does Not Appear in Game

If your block cannot be placed with the /setblock or /give commands and does not show up in the creative inventory, the behavior pack definition failed to register. The most common culprits are invalid JSON syntax (such as a trailing comma), an outdated format_version that does not support the components you wrote, or using the reserved minecraft: namespace in your identifier.

You should always validate your behavior file against a known working baseline. If this minimal block loads in your world, add your custom components back one by one until the Content Log flags the offending property.

BP/blocks/debug_block.json
{
  "format_version": "1.20.80",
  "minecraft:block": {
    "description": {
      "identifier": "custom:debug_block",
      "menu_category": {
        "category": "construction"
      }
    },
    "components": {
      "minecraft:destructible_by_mining": {
        "seconds_to_destroy": 1.0
      }
    }
  }
}

Fixing Checkerboard and Invisible Textures

When a block registers in the behavior pack but renders with a magenta-and-black checkerboard texture (or turns completely invisible), the resource pack chain is broken. In modern Bedrock, you can assign textures either inside RP/blocks.json for standard cubes or inside the behavior pack using the minecraft:material_instances component.

Regardless of which method you use, the texture shortname must exist in RP/textures/terrain_texture.json, and the file path pointed to by that shortname must match an actual PNG file on disk. A single typo anywhere in this chain breaks the material.

SymptomRoot CauseWhere to Check
Magenta and black cubeShortname not found in terrain atlas, or PNG file missing at pathRP/textures/terrain_texture.json
Dirt block with 'Update!' textBlock identifier is unknown to the client or behavior pack failed to loadBP/blocks/ file and world pack settings
Block is completely invisibleGeometry identifier does not exist, or bone visibility is disabledBP/blocks/ file and RP/models/blocks/
Texture is solid blackAmbient occlusion or light absorption conflict on custom geometryminecraft:material_instances and RP/blocks.json
RP/textures/terrain_texture.json
{
  "resource_pack_name": "custom_pack",
  "texture_name": "atlas.terrain",
  "padding": 8,
  "num_mip_levels": 4,
  "texture_data": {
    "debug_stone": {
      "textures": "textures/blocks/debug_stone"
    }
  }
}

Custom Geometry and the X-Ray Bug

When you apply the minecraft:geometry component to create a non-cube block like a chair, pillar, orbush, placing it next to standard blocks will often turn those adjacent block faces invisible, letting players see straight through the world. This happens because the engine assumes custom blocks are opaque 16x16x16 cubes and culls the touching faces of neighbor blocks to save rendering performance.

Furthermore, if your block uses transparent or semi-transparent pixels in its PNG file, those areas will render pitch black or white unless you change the render method. You must explicitly configure minecraft:material_instances to use a non-opaque render_method such as alpha_test or blend, which also instructs the engine to stop culling adjacent solid blocks.

BP/blocks/custom_statue.json
{
  "format_version": "1.20.80",
  "minecraft:block": {
    "description": {
      "identifier": "custom:statue"
    },
    "components": {
      "minecraft:geometry": "geometry.custom_statue",
      "minecraft:material_instances": {
        "*": {
          "texture": "statue_tex",
          "render_method": "alpha_test"
        }
      },
      "minecraft:light_dampening": 0
    }
  }
}

Block States and Permutation Limits

Blocks that change appearance or behavior based on states can fail to load if the state values are mismatched. Every state declared under description.states must be queried with the exact same data type inside your condition Molang strings. Mixing booleans (true/false) with integers (0/1) in a q.block_state() query will cause a Molang error.

Keep in mind that Bedrock enforces a strict limit on the total number of permutations a single block can have. Every additional state multiplies the total permutation count. If you combine too many states on one block, the Content Log will throw a registration error and drop the block entirely.

Which versions this applies to

Applies to Bedrock Edition 1.20.60 and newer. Core components like minecraft:geometry, minecraft:material_instances, and minecraft:destructible_by_mining are stable and require no experimental toggles.

When it does not work

What you seeWhyThe fix
[Blocks][error]-custom:my_block | minecraft:block | components | minecraft:destroy_time : child 'minecraft:destroy_time' is not valid hereYou are using a retired pre-1.19.40 component name inside a modern format_version file.Replace old component names with their modern stable equivalents, such as changing minecraft:destroy_time to minecraft:destructible_by_mining.
[Geometry][error]-Block 'custom:statue' references geometry 'geometry.statue' which was not foundThe geometry identifier in the behavior pack does not match the identifier inside the resource pack model file, or the model sits in the wrong folder.Ensure the model file is inside RP/models/blocks/ (or RP/models/entity/), uses format_version 1.12.0 or newer, and its description.identifier matches the behavior pack string character for character.
Block places in the world, but its name in the hotbar reads tile.custom:my_block.nameThe localization key for the block is missing from the resource pack language file.Open RP/texts/en_US.lang and add a line reading tile.custom:my_block.name=My Custom Block (without quotes).
Breaking the block in Survival mode takes zero seconds or never drops an itemBy default, custom blocks break instantly unless mining speed is defined, or your minecraft:loot path includes the 'BP/' prefix by mistake.Add minecraft:destructible_by_mining with a positive seconds_to_destroy value. If using minecraft:loot, make sure the path starts with "loot_tables/..." relative to the behavior pack root.

Reference, straight from the game files

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