/snippet
Java Minecraft 1.20+ Fabric API

Custom Block Snippet.

A complete custom block setup for Fabric mods. Includes the block class with on-use action, registration code, and language file entry. Replace yourmod with your mod ID.

// how to use

Create the block class, register in ModBlocks, call registerModBlocks() from your mod initializer, and add the lang key to en_us.json.

// requirements

Fabric API, Minecraft 1.20+, Java 17+. Works with both client and server.

package com.yourmod.block;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class ExampleBlock extends Block {

    public ExampleBlock(Settings settings) {
        super(settings);
    }

    // Right-click / use action on the block
    @Override
    public ActionResult onUse(
            BlockState state, World world,
            BlockPos pos, PlayerEntity player,
            BlockHitResult hit) {

        if (!world.isClient) {
            // Your custom logic here
            player.sendMessage(
                Text.literal("You clicked Example Block at " + pos.toShortString()), true
            );
        }

        return ActionResult.SUCCESS;
    }
}
package com.yourmod.block;

import com.yourmod.YourMod;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.MapColor;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;

public class ModBlocks {

    public static final Block EXAMPLE_BLOCK = register(
        "example_block",
        new ExampleBlock(
            AbstractBlock.Settings.create()
                .mapColor(MapColor.PURPLE)
                .strength(2.0f, 3.0f)
                .requiresTool()
        )
    );

    private static Block register(String name, Block block) {
        // Register the block
        Block registered = Registry.register(
            Registries.BLOCK,
            Identifier.of(YourMod.MOD_ID, name),
            block
        );
        // Register the block item so it appears in inventory
        Registry.register(
            Registries.ITEM,
            Identifier.of(YourMod.MOD_ID, name),
            new BlockItem(registered, new Item.Settings())
        );
        return registered;
    }

    // Call this from your mod initializer
    public static void registerModBlocks() {
        YourMod.LOGGER.info("Registering blocks for " + YourMod.MOD_ID);
    }
}
{
  "block.yourmod.example_block": "Example Block",
  "item.yourmod.example_block": "Example Block"
}
custom advancement custom item