Files
GeyserWebsite/_site/geyser/custom-blocks/index.html
T
2023-11-07 19:40:55 -06:00

1325 lines
93 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" data-bs-theme="dark">
<head>
<meta charset="utf-8">
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GeyserMC Wiki: Custom blocks with Geyser</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/darcula.css">
<meta name="author" content="GeyserMC">
<meta name="description" content="This is the wiki for all of GeyserMC's projects.">
<meta name="theme-color" content="#2b3035">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:4000">
<meta property="og:title" content="GeyserMC Wiki: Custom blocks with Geyser">
<meta property="og:description" content="This is the wiki for all of GeyserMC's projects.">
<meta property="og:image" content="/android-chrome-192x192.png">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#248f00">
</head>
<body>
<header>
<nav class="navbar navbar-expand-lg bg-body-tertiary fixed-top">
<div class="container-fluid">
<a class="navbar-brand" href="/"><img src="/android-chrome-512x512.png" alt="geyser logo" height="32"> GeyserMC Wiki</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarLinks" aria-controls="navbarLinks" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarLinks">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="https://geysermc.org/"><i class="bi bi-house pe-1"></i> Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://geysermc.org/download"><i class="bi bi-download pe-1"></i> Download</a>
</li>
</ul>
<form class="d-flex" role="search" action="/search/">
<div class="input-group">
<button class="btn btn-outline-secondary" type="submit" id="button-search"><i class="bi bi-search"></i></button>
<input type="text" name="q" class="form-control" placeholder="Search the site..." aria-label="Search the site..." aria-describedby="button-search">
</div>
</form>
</div>
</div>
</nav>
</header>
<div id="page-content" class="container-fluid">
<div class="row">
<div class="col-12 col-md-3 col-xl-2">
<div class="sticky-top">
<div class="sidebar py-2 text-break">
<nav class="navbar navbar-expand-md">
<div class="container-fluid">
<div class="d-block d-md-none">Wiki Navigation</div>
<button class="navbar-toggler mb-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarNav" aria-controls="sidebarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse flex-column align-items-start" id="sidebarNav">
<div class="nav-item dropdown">
<a class="nav-link dropdown-toggle fw-bold show" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="false" aria-expanded="false">Geyser Documentation</a>
<ul class="pe-3 pt-0 dropdown-menu position-relative border-0 list-disc show">
<li class="ms-4">
<a href="/geyser/setup/">Setting up Geyser</a>
<ul>
<li>
<a href="/geyser/supported-hosting-providers/">Supported Hosting Providers</a>
</li>
<li>
<a href="/geyser/using-geyser-with-consoles/">Using Geyser with Consoles</a>
</li>
<li>
<a href="/geyser/playit-gg/">Using playit.gg with Geyser</a>
</li>
<li>
<a href="/geyser/creating-a-startup-script/">Creating a Startup Script</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/common-issues/">Common Issues</a>
<ul>
<li>
<a href="/geyser/fixing-unable-to-connect-to-world/">Fixing 'Unable to Connect to World'</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/understanding-the-config/">Configuring Geyser</a>
<ul>
<li>
<a href="/geyser/commands/">Commands</a>
</li>
<li>
<a href="/geyser/geyser-command-line-arguments-and-system-properties/">Geyser Command Line Arguments and System Properties</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/faq/">FAQ</a>
<ul>
<li>
<a href="/geyser/anticheat-compatibility/">Anticheat Compatibility</a>
</li>
<li>
<a href="/geyser/current-limitations/">Current Limitations</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/custom-items/">Custom items with Geyser</a>
<ul>
<li>
<a href="/geyser/custom-items/#json-mappings">JSON mappings</a>
</li>
<li>
<a href="/geyser/custom-items/#geyser-extensions">Geyser extensions</a>
</li>
<li>
<a href="/geyser/custom-items/#resource-pack">Resource pack</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/custom-blocks/">Custom blocks with Geyser</a>
<ul>
<li>
<a href="/geyser/custom-blocks/#enabling-custom-blocks">Enabling custom blocks</a>
</li>
<li>
<a href="/geyser/custom-blocks/#json-mappings">JSON mappings</a>
</li>
<li>
<a href="/geyser/custom-blocks/#geyser-extensions">Geyser extensions</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/custom-skulls/">Custom skulls with Geyser</a>
<ul>
<li>
<a href="/geyser/custom-skulls/#enabling-custom-skulls">Enabling custom skulls</a>
</li>
<li>
<a href="/geyser/custom-skulls/#custom-skullsyml">custom-skulls.yml</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/api/">Geyser API</a>
<ul>
<li>
<a href="/geyser/getting-started-with-the-api/">Getting Started</a>
</li>
<li>
<a href="/geyser/api/#short-overview-of-the-geyser-api">Overview</a>
</li>
<li>
<a href="/geyser/events/">Events</a>
</li>
<li>
<a href="/geyser/forms/">Forms and Cumulus</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/extensions/">Geyser Extensions</a>
<ul>
<li>
<a href="/geyser/extensions/#creating-the-main-class">Main class</a>
</li>
<li>
<a href="/geyser/extensions/#creating-commands-with-geyser-extensions">Creating Commands</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/geyser/global-api/">Global API</a>
</li>
</ul>
</div>
<div class="nav-item dropdown">
<a class="nav-link dropdown-toggle fw-bold" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="false" aria-expanded="false">Floodgate Documentation</a>
<ul class="pe-3 pt-0 dropdown-menu position-relative border-0 list-disc">
<li class="ms-4">
<a href="/floodgate/setup/">Setup</a>
</li>
<li class="ms-4">
<a href="/floodgate/issues/">Issues</a>
</li>
<li class="ms-4">
<a href="/floodgate/faq/">FAQ</a>
</li>
<li class="ms-4">
<a href="/floodgate/features/">Features</a>
<ul>
<li>
<a href="/floodgate/features/#whitelist-command">Whitelist command</a>
</li>
<li>
<a href="/floodgate/commands/">Commands</a>
</li>
<li>
<a href="/floodgate/features/#what-is-skin-uploading">Skin Uploading</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/floodgate/api/">Floodgate API</a>
<ul>
<li>
<a href="/floodgate/player/">FloodgatePlayer</a>
</li>
<li>
<a href="/geyser/forms/">Forms and Cumulus</a>
</li>
</ul>
</li>
<li class="ms-4">
<a href="/floodgate/linking/">Linking</a>
<ul>
<li>
<a href="/floodgate/linking/#what-is-global-linking">Global Linking</a>
</li>
<li>
<a href="/floodgate/linking/#local-linking">Local Linking</a>
</li>
</ul>
</li>
</ul>
</div>
<div class="nav-item dropdown">
<a class="nav-link dropdown-toggle fw-bold" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="false" aria-expanded="false">Other</a>
<ul class="pe-3 pt-0 dropdown-menu position-relative border-0 list-disc">
<li class="ms-4">
<a href="/other/geyseroptionalpack/">GeyserOptionalPack</a>
</li>
<li class="ms-4">
<a href="/other/hurricane/">Hurricane</a>
</li>
<li class="ms-4">
<a href="/other/geyserconnect/">GeyserConnect</a>
</li>
<li class="ms-4">
<a href="/other/community-geyser-projects/">Community Geyser Projects</a>
</li>
<li class="ms-4">
<a href="/other/test-server/">Test Server</a>
</li>
<li class="ms-4">
<a href="/other/developer-guide/">Developer Guide</a>
</li>
<li class="ms-4">
<a href="/other/discord-bot-usage/">Geyser Discord Bot Usage</a>
</li>
</ul>
</div>
</div>
</div>
</nav>
</div>
</div>
</div>
<main class="col-12 col-md-9 col-xl-8" role="main">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="http://localhost:4000/geyser/">Geyser</a></li>
<li class="breadcrumb-item active" aria-current="page">Custom blocks with Geyser</li>
</ol>
</nav>
<h1 id="custom-blocks-with-geyser">Custom blocks with Geyser</h1>
<p>To setup custom blocks in geyser, you have to choose how you are going to register your blocks. The easiest is <a href="#json-mappings">using a json file</a> but you can also <a href="#geyser-extensions">use a Geyser extension</a>.</p>
<p>It should be noted that blocks and their associated components are not very stable. Mojang tends to make changes to these much more often than they do for items. This means that any components Geyser allows you to register are liable to break in future versions of Bedrock.</p>
<h2 id="enabling-custom-blocks">Enabling custom blocks</h2>
<p>Before beginning, ensure that <code class="language-plaintext highlighter-rouge">add-non-bedrock-items</code> is set to <code class="language-plaintext highlighter-rouge">true</code> in your <code class="language-plaintext highlighter-rouge">config.yml</code> file.</p>
<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Whether to add any items and blocks which normally does not exist in Bedrock Edition.</span>
<span class="c1"># This should only need to be disabled if using a proxy that does not use the "transfer packet" style of server switching.</span>
<span class="c1"># If this is disabled, furnace minecart items will be mapped to hopper minecart items.</span>
<span class="c1"># Geyser's block, item, and skull mappings systems will also be disabled.</span>
<span class="c1"># This option requires a restart of Geyser in order to change its setting.</span>
<span class="na">add-non-bedrock-items</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>
<h2 id="json-mappings">JSON mappings</h2>
<p>The JSON mappings use a similar structure to that of behavior packs registering blocks. The equivalent components are listed in the <a href="https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/blockcomponentslist">Minecraft: Bedrock Edition Creator Documentation</a>.</p>
<p>Custom mappings files that register blocks or items should be placed in the <code class="language-plaintext highlighter-rouge">custom_mappings</code> folder. This folder is created when you start your server. It is located in the same folder as the <code class="language-plaintext highlighter-rouge">Geyser-Standalone.jar</code> file for standalone and inside your Geyser data folder for a plugin. If you do not have this folder, ensure you are on the latest version of Geyser.</p>
<h3 id="example-mappings-file">Example mappings file</h3>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"format_version"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
</span><span class="nl">"blocks"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"minecraft:granite_wall"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my_block"</span><span class="p">,</span><span class="w">
</span><span class="nl">"display_name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Custom Granite Wall"</span><span class="p">,</span><span class="w">
</span><span class="nl">"geometry"</span><span class="p">:</span><span class="w"> </span><span class="s2">"geometry.blocks.my_block_geo"</span><span class="p">,</span><span class="w">
</span><span class="nl">"material_instances"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"*"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"texture"</span><span class="p">:</span><span class="w"> </span><span class="s2">"some_texture"</span><span class="p">,</span><span class="w">
</span><span class="nl">"render_method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"alpha_test"</span><span class="p">,</span><span class="w">
</span><span class="nl">"face_dimming"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="nl">"ambient_occlusion"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"tags"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"stone"</span><span class="p">,</span><span class="w"> </span><span class="s2">"wall"</span><span class="p">],</span><span class="w">
</span><span class="nl">"state_overrides"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"east=none,north=none,south=none,up=true,waterlogged=true,west=none"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"geometry"</span><span class="p">:</span><span class="w"> </span><span class="s2">"geometry.blocks.my_other_block_geo"</span><span class="p">,</span><span class="w">
</span><span class="nl">"destructible_by_mining"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w">
</span><span class="nl">"place_air"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"east=none,north=none,south=none,up=false,waterlogged=true,west=tall"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"friction"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.6</span><span class="p">,</span><span class="w">
</span><span class="nl">"light_emission"</span><span class="p">:</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w">
</span><span class="nl">"light_dampening"</span><span class="p">:</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w">
</span><span class="nl">"transformation"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scale"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">0.5</span><span class="p">,</span><span class="w"> </span><span class="mf">0.5</span><span class="p">,</span><span class="w"> </span><span class="mf">0.5</span><span class="p">],</span><span class="w">
</span><span class="nl">"translation"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">],</span><span class="w">
</span><span class="nl">"rotation"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">90</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"east=none,north=none,south=low,up=true,waterlogged=true,west=tall"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"placement_filter"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"conditions"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span><span class="w">
</span><span class="nl">"allowed_faces"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"up"</span><span class="p">,</span><span class="w"> </span><span class="s2">"down"</span><span class="p">],</span><span class="w">
</span><span class="nl">"block_filter"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span><span class="w">
</span><span class="nl">"tags"</span><span class="p">:</span><span class="w"> </span><span class="s2">"!query.any_tag('stone')"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="s2">"minecraft:dirt"</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h3 id="schema">Schema</h3>
<p>The following details the schema for the mappings file. Only the <code class="language-plaintext highlighter-rouge">name</code> field is strictly required. All other fields are optional.</p>
<div class="long-list">
<ul>
<li><code class="language-plaintext highlighter-rouge">format_version</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">integer</code>
<ul>
<li>Description: The version of the format of the mappings file.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">blocks</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: An object containing a list of block definitions.
<ul>
<li><code class="language-plaintext highlighter-rouge">minecraft:some_block</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: A block definition to be used to override the specified java block.
<ul>
<li><code class="language-plaintext highlighter-rouge">name</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: none</li>
<li>Description: The name of the custom block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">collision_box</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">origin</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An array of x, y, and z origin values</li>
<li>Range: Must be in range <code class="language-plaintext highlighter-rouge">[-8, 0, -8]</code> to <code class="language-plaintext highlighter-rouge">[8, 16, 8]</code>, inclusive
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An origin value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">size</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An array of x, y, and z size values
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An size value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Range: Addittion of <code class="language-plaintext highlighter-rouge">origin</code> and <code class="language-plaintext highlighter-rouge">size</code> must be in range <code class="language-plaintext highlighter-rouge">[-8, 0, -8]</code> to <code class="language-plaintext highlighter-rouge">[8, 16, 8]</code>, inclusive.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">destructible_by_mining</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">integer</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: The time in seconds to mine the block with base tools.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">display_name</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: the name of the custom block</li>
<li>Description: The display name of the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">extended_collision_box</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">origin</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An array of x, y, and z origin values</li>
<li>Range: Must be in range <code class="language-plaintext highlighter-rouge">[-8, 0, -8]</code> to <code class="language-plaintext highlighter-rouge">[8, 16, 8]</code>, inclusive
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An origin value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">size</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An array of x, y, and z size values
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An size value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Range: Addittion of <code class="language-plaintext highlighter-rouge">origin</code> and <code class="language-plaintext highlighter-rouge">size</code> must be in range <code class="language-plaintext highlighter-rouge">[-8, 0, -8]</code> to <code class="language-plaintext highlighter-rouge">[8, 16, 8]</code>, inclusive.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">friction</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Range: <code class="language-plaintext highlighter-rouge">0.0</code> to <code class="language-plaintext highlighter-rouge">1.0</code></li>
<li>Default: <code class="language-plaintext highlighter-rouge">0.4</code></li>
<li>Description: The friction value for entities traversing the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">geometry</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: none</li>
<li>Description: The geometry identifier of the block.</li>
</ul>
</li>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: The geometry of the block with bone visbility filters
<ul>
<li><code class="language-plaintext highlighter-rouge">identifier</code>
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: none</li>
<li>Description: The geometry identifier of the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">bone_visibility</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: An object containing the bone visibility filters for the block.
<ul>
<li><code class="language-plaintext highlighter-rouge">bone_name</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: none</li>
<li>Description: A molang string dictating whether the bone is visible.</li>
</ul>
</li>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: none</li>
<li>Description: Whether the bone is visible.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">light_emission</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">integer</code>
<ul>
<li>Range: <code class="language-plaintext highlighter-rouge">0</code> to <code class="language-plaintext highlighter-rouge">15</code></li>
<li>Default: <code class="language-plaintext highlighter-rouge">0</code></li>
<li>Description: The amount of light emitted by the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">light_dampening</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">integer</code>
<ul>
<li>Range: <code class="language-plaintext highlighter-rouge">0</code> to <code class="language-plaintext highlighter-rouge">15</code></li>
<li>Default: <code class="language-plaintext highlighter-rouge">15</code></li>
<li>Description: The amount of light dampened by the block as it passes through.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">material_instances</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: An object containing the material instances for the block.
<ul>
<li><code class="language-plaintext highlighter-rouge">key</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: The default material instance for the block. Other globs or specific instances can be used.
<ul>
<li><code class="language-plaintext highlighter-rouge">texture</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: the name of the custom block</li>
<li>Description: The texture resource path of the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">render_method</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">alpha_test</code></li>
<li>Description: The render method used for the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">face_dimming</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">false</code></li>
<li>Description: Whether face dimming is enabled for the block.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">ambient_occlusion</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">false</code></li>
<li>Description: Whether ambient occlusion is enabled for the block.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">place_air</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">true</code></li>
<li>Description: Whether the block should place air to prevent double placement.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">placement_filter</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: An object containing the placement filter for the block.
<ul>
<li><code class="language-plaintext highlighter-rouge">conditions</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Description: An array of conditions that must be met for the block to be placed.
<ul>
<li><code class="language-plaintext highlighter-rouge">allowed_faces</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Description: An array of faces that the block can be placed on.
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Range: <code class="language-plaintext highlighter-rouge">up</code>, <code class="language-plaintext highlighter-rouge">down</code>, <code class="language-plaintext highlighter-rouge">north</code>, <code class="language-plaintext highlighter-rouge">south</code>, <code class="language-plaintext highlighter-rouge">east</code>, <code class="language-plaintext highlighter-rouge">west</code></li>
<li>Description: A face that the block can be placed on.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">block_filter</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Description: An array of blocks or true molang queries that the block can be placed on.
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Description: A block that the block can be placed on.
<ul>
<li>Type <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: Holds a true molang query that the block can be placed on.
<ul>
<li><code class="language-plaintext highlighter-rouge">tags</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Description: A true molang query that the block can be placed on.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">selection_box</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">origin</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An array of x, y, and z origin values</li>
<li>Range: Must be in range <code class="language-plaintext highlighter-rouge">[-8, 0, -8]</code> to <code class="language-plaintext highlighter-rouge">[8, 16, 8]</code>, inclusive
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An origin value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">size</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An array of x, y, and z size values
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: Inferred from overridden block</li>
<li>Description: An size value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Range: Addittion of <code class="language-plaintext highlighter-rouge">origin</code> and <code class="language-plaintext highlighter-rouge">size</code> must be in range <code class="language-plaintext highlighter-rouge">[-8, 0, -8]</code> to <code class="language-plaintext highlighter-rouge">[8, 16, 8]</code>, inclusive.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">tags</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Description: An array of tags associated with the block.
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">transformation</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: Translation, scale, and rotation values to apply to the block.
<ul>
<li><code class="language-plaintext highlighter-rouge">scale</code>
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">[1, 1, 1]</code></li>
<li>Description: An array of x, y, and z scale values
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">1</code></li>
<li>Description: A scale value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">translation</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">[0, 0, 0]</code></li>
<li>Description: An array of x, y, and z translation values
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">float</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">0</code></li>
<li>Description: A translation value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">rotation</code>
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">array</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">[0, 0, 0]</code></li>
<li>Description: An array of x, y, and z rotation values in increments of 90 degrees (e.g. <code class="language-plaintext highlighter-rouge">[90, -180, 0]</code>)
<ul>
<li><code class="language-plaintext highlighter-rouge">items</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">integer</code>
<ul>
<li>Range: <code class="language-plaintext highlighter-rouge">0</code>, <code class="language-plaintext highlighter-rouge">90</code>, <code class="language-plaintext highlighter-rouge">180</code>, &amp; <code class="language-plaintext highlighter-rouge">270</code></li>
<li>Default: <code class="language-plaintext highlighter-rouge">0</code></li>
<li>Description: A rotation value for a single axis</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">unit_cube</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">false</code></li>
<li>Description: Whether a unit cube is to be used with tessellation.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">creative_category</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">building_blocks</code></li>
<li>Description: The creative category to place the block in.</li>
<li>Range: See <a href="https://wiki.bedrock.dev/documentation/creative-categories.html#list-of-creative-categories">Creative Categories</a> on the Bedrock Wiki.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">creative_group</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">string</code>
<ul>
<li>Default: none</li>
<li>Description: The creative group to place the block in.</li>
<li>Range: See <a href="https://wiki.bedrock.dev/documentation/creative-categories.html#list-of-creative-tabs">Creative Tabs</a> on the Bedrock Wiki.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">included_in_creative_inventory</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">true</code></li>
<li>Description: Whether the block is included in the creative inventory.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">only_override_states</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">boolean</code>
<ul>
<li>Default: <code class="language-plaintext highlighter-rouge">false</code></li>
<li>Description: Whether the block should only override the states specified in <code class="language-plaintext highlighter-rouge">state_overrides</code>.</li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">state_overrides</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: An object containing state overrides for the block.
<ul>
<li><code class="language-plaintext highlighter-rouge">property1=value1,property2=value2,...</code>:
<ul>
<li>Type: <code class="language-plaintext highlighter-rouge">object</code>
<ul>
<li>Description: An override for a specific block state. Possible states are listed in Geyser’s <a href="https://raw.githubusercontent.com/GeyserMC/mappings/master/blocks.json">Block Mappings</a></li>
<li>Accepts all of the same properties as a block definition except <code class="language-plaintext highlighter-rouge">creative_category</code>, <code class="language-plaintext highlighter-rouge">creative_group</code>, <code class="language-plaintext highlighter-rouge">included_in_creative_inventory</code>, <code class="language-plaintext highlighter-rouge">only_override_states</code>, and <code class="language-plaintext highlighter-rouge">state_overrides</code>.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<h2 id="geyser-extensions">Geyser extensions</h2>
<p>In this example, we will create a custom block that overrides the vanilla redstone dot. This block will be placed on top of a block and will emit a visible redstone signal when powered.</p>
<p>First, create a class that implements Geyser’s Extension class:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">RedstoneDot</span> <span class="kd">implements</span> <span class="nc">Extension</span> <span class="o">{</span>
<span class="c1">//...</span>
<span class="o">}</span>
</code></pre></div></div>
<p>Next, create a method to register your blocks in the <code class="language-plaintext highlighter-rouge">GeyserDefineCustomBlocksEvent</code>:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">RedstoneDot</span> <span class="kd">implements</span> <span class="nc">Extension</span> <span class="o">{</span>
<span class="nd">@Subscribe</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onDefineCustomBlocks</span><span class="o">(</span><span class="nc">GeyserDefineCustomBlocksEvent</span> <span class="n">event</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//...</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>Build the <code class="language-plaintext highlighter-rouge">CustomBlockComponents</code>, <code class="language-plaintext highlighter-rouge">CustomBlockData</code>, and list of <code class="language-plaintext highlighter-rouge">CustomBlockPermutation</code> (if needed) for the block:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">RedstoneDot</span> <span class="kd">implements</span> <span class="nc">Extension</span> <span class="o">{</span>
<span class="nd">@Subscribe</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onDefineCustomBlocks</span><span class="o">(</span><span class="nc">GeyserDefineCustomBlocksEvent</span> <span class="n">event</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">BoxComponent</span> <span class="n">selectionBox</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BoxComponent</span><span class="o">(-</span><span class="mi">5</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="o">-</span><span class="mi">5</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="mi">1</span><span class="n">f</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span>
<span class="nc">CustomBlockComponents</span> <span class="n">components</span> <span class="o">=</span> <span class="nc">CustomBlockComponents</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">collisionBox</span><span class="o">(</span><span class="nc">BoxComponent</span><span class="o">.</span><span class="na">EMPTY_BOX</span><span class="o">)</span>
<span class="o">.</span><span class="na">selectionBox</span><span class="o">(</span><span class="n">selectionBox</span><span class="o">)</span>
<span class="o">.</span><span class="na">geometry</span><span class="o">(</span><span class="k">new</span> <span class="nc">GeometryComponentBuilder</span><span class="o">()</span>
<span class="o">.</span><span class="na">identifier</span><span class="o">(</span><span class="s">"geometry.amberichu.redstone_dot"</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">())</span>
<span class="o">.</span><span class="na">destroyTime</span><span class="o">(</span><span class="mi">0</span><span class="n">f</span><span class="o">)</span>
<span class="o">.</span><span class="na">lightEmission</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span>
<span class="o">.</span><span class="na">lightDampening</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span>
<span class="o">.</span><span class="na">friction</span><span class="o">(</span><span class="mi">1</span><span class="n">f</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="nc">CustomBlockData</span> <span class="n">redstoneDot</span> <span class="o">=</span> <span class="nc">CustomBlockData</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">name</span><span class="o">(</span><span class="s">"redstone_dot"</span><span class="o">)</span>
<span class="o">.</span><span class="na">intProperty</span><span class="o">(</span><span class="no">POWER_PROPERTY</span><span class="o">,</span> <span class="nc">IntStream</span><span class="o">.</span><span class="na">range</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">16</span><span class="o">).</span><span class="na">boxed</span><span class="o">().</span><span class="na">toList</span><span class="o">())</span>
<span class="o">.</span><span class="na">components</span><span class="o">(</span><span class="n">components</span><span class="o">)</span>
<span class="o">.</span><span class="na">permutations</span><span class="o">(</span><span class="n">createRedstoneDotPermutations</span><span class="o">())</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="c1">// ...</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="nc">List</span><span class="o">&lt;</span><span class="nc">CustomBlockPermutation</span><span class="o">&gt;</span> <span class="nf">createRedstoneDotPermutations</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">List</span><span class="o">&lt;</span><span class="nc">CustomBlockPermutation</span><span class="o">&gt;</span> <span class="n">permutations</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">&lt;&gt;();</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">power</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">power</span> <span class="o">&lt;</span> <span class="mi">16</span><span class="o">;</span> <span class="n">power</span><span class="o">++)</span> <span class="o">{</span>
<span class="nc">String</span> <span class="n">texture</span> <span class="o">=</span> <span class="s">"amberichu.redstone_dot"</span> <span class="o">+</span> <span class="n">power</span><span class="o">;</span>
<span class="nc">MaterialInstance</span> <span class="n">invisMaterialInstance</span> <span class="o">=</span> <span class="nc">MaterialInstance</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">texture</span><span class="o">(</span><span class="s">"amberichu.invisible"</span><span class="o">)</span>
<span class="o">.</span><span class="na">renderMethod</span><span class="o">(</span><span class="s">"alpha_test"</span><span class="o">)</span>
<span class="o">.</span><span class="na">faceDimming</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">ambientOcclusion</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="nc">CustomBlockComponents</span> <span class="n">components</span> <span class="o">=</span> <span class="nc">CustomBlockComponents</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"up"</span><span class="o">,</span> <span class="nc">MaterialInstance</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">texture</span><span class="o">(</span><span class="n">texture</span><span class="o">)</span>
<span class="o">.</span><span class="na">renderMethod</span><span class="o">(</span><span class="s">"alpha_test"</span><span class="o">)</span>
<span class="o">.</span><span class="na">faceDimming</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">ambientOcclusion</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">())</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"down"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"north"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"south"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"east"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"west"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="nc">String</span> <span class="n">condition</span> <span class="o">=</span> <span class="nc">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"query.block_property('%s') == %d"</span><span class="o">,</span> <span class="no">POWER_PROPERTY</span><span class="o">,</span> <span class="n">power</span><span class="o">);</span>
<span class="n">permutations</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">CustomBlockPermutation</span><span class="o">(</span><span class="n">components</span><span class="o">,</span> <span class="n">condition</span><span class="o">));</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">permutations</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>Finally, register the custom block, block state overrides, and block item overrides:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">RedstoneDot</span> <span class="kd">implements</span> <span class="nc">Extension</span> <span class="o">{</span>
<span class="nd">@Subscribe</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onDefineCustomBlocks</span><span class="o">(</span><span class="nc">GeyserDefineCustomBlocksEvent</span> <span class="n">event</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">BoxComponent</span> <span class="n">selectionBox</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BoxComponent</span><span class="o">(-</span><span class="mi">5</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="o">-</span><span class="mi">5</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="mi">1</span><span class="n">f</span><span class="o">,</span> <span class="mi">10</span><span class="o">);</span>
<span class="nc">CustomBlockComponents</span> <span class="n">components</span> <span class="o">=</span> <span class="nc">CustomBlockComponents</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">collisionBox</span><span class="o">(</span><span class="nc">BoxComponent</span><span class="o">.</span><span class="na">EMPTY_BOX</span><span class="o">)</span>
<span class="o">.</span><span class="na">selectionBox</span><span class="o">(</span><span class="n">selectionBox</span><span class="o">)</span>
<span class="o">.</span><span class="na">geometry</span><span class="o">(</span><span class="k">new</span> <span class="nc">GeometryComponentBuilder</span><span class="o">()</span>
<span class="o">.</span><span class="na">identifier</span><span class="o">(</span><span class="s">"geometry.amberichu.redstone_dot"</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">())</span>
<span class="o">.</span><span class="na">destroyTime</span><span class="o">(</span><span class="mi">0</span><span class="n">f</span><span class="o">)</span>
<span class="o">.</span><span class="na">lightEmission</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span>
<span class="o">.</span><span class="na">lightDampening</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span>
<span class="o">.</span><span class="na">friction</span><span class="o">(</span><span class="mi">1</span><span class="n">f</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="nc">CustomBlockData</span> <span class="n">redstoneDot</span> <span class="o">=</span> <span class="nc">CustomBlockData</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">name</span><span class="o">(</span><span class="s">"redstone_dot"</span><span class="o">)</span>
<span class="o">.</span><span class="na">intProperty</span><span class="o">(</span><span class="no">POWER_PROPERTY</span><span class="o">,</span> <span class="nc">IntStream</span><span class="o">.</span><span class="na">range</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">16</span><span class="o">).</span><span class="na">boxed</span><span class="o">().</span><span class="na">toList</span><span class="o">())</span>
<span class="o">.</span><span class="na">components</span><span class="o">(</span><span class="n">components</span><span class="o">)</span>
<span class="o">.</span><span class="na">permutations</span><span class="o">(</span><span class="n">createRedstoneDotPermutations</span><span class="o">())</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="n">event</span><span class="o">.</span><span class="na">registerCustomBlock</span><span class="o">(</span><span class="n">redstoneDot</span><span class="o">);</span>
<span class="n">event</span><span class="o">.</span><span class="na">registerBlockItemOverride</span><span class="o">(</span><span class="s">"minecraft:redstone_wire"</span><span class="o">,</span> <span class="n">redstoneDot</span><span class="o">);</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">power</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">power</span> <span class="o">&lt;</span> <span class="mi">16</span><span class="o">;</span> <span class="n">power</span><span class="o">++)</span> <span class="o">{</span>
<span class="nc">String</span> <span class="n">javaIdentifier</span> <span class="o">=</span> <span class="nc">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"minecraft:redstone_wire[east=none,north=none,power=%d,south=none,west=none]"</span><span class="o">,</span> <span class="n">power</span><span class="o">);</span>
<span class="n">event</span><span class="o">.</span><span class="na">registerBlockStateOverride</span><span class="o">(</span><span class="n">javaIdentifier</span><span class="o">,</span> <span class="n">redstoneDot</span><span class="o">.</span><span class="na">blockStateBuilder</span><span class="o">()</span>
<span class="o">.</span><span class="na">intProperty</span><span class="o">(</span><span class="no">POWER_PROPERTY</span><span class="o">,</span> <span class="n">power</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">());</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="nc">List</span><span class="o">&lt;</span><span class="nc">CustomBlockPermutation</span><span class="o">&gt;</span> <span class="nf">createRedstoneDotPermutations</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">List</span><span class="o">&lt;</span><span class="nc">CustomBlockPermutation</span><span class="o">&gt;</span> <span class="n">permutations</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">&lt;&gt;();</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">power</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">power</span> <span class="o">&lt;</span> <span class="mi">16</span><span class="o">;</span> <span class="n">power</span><span class="o">++)</span> <span class="o">{</span>
<span class="nc">String</span> <span class="n">texture</span> <span class="o">=</span> <span class="s">"amberichu.redstone_dot"</span> <span class="o">+</span> <span class="n">power</span><span class="o">;</span>
<span class="nc">MaterialInstance</span> <span class="n">invisMaterialInstance</span> <span class="o">=</span> <span class="nc">MaterialInstance</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">texture</span><span class="o">(</span><span class="s">"amberichu.invisible"</span><span class="o">)</span>
<span class="o">.</span><span class="na">renderMethod</span><span class="o">(</span><span class="s">"alpha_test"</span><span class="o">)</span>
<span class="o">.</span><span class="na">faceDimming</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">ambientOcclusion</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="nc">CustomBlockComponents</span> <span class="n">components</span> <span class="o">=</span> <span class="nc">CustomBlockComponents</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"up"</span><span class="o">,</span> <span class="nc">MaterialInstance</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">texture</span><span class="o">(</span><span class="n">texture</span><span class="o">)</span>
<span class="o">.</span><span class="na">renderMethod</span><span class="o">(</span><span class="s">"alpha_test"</span><span class="o">)</span>
<span class="o">.</span><span class="na">faceDimming</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">ambientOcclusion</span><span class="o">(</span><span class="kc">false</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">())</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"down"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"north"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"south"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"east"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">materialInstance</span><span class="o">(</span><span class="s">"west"</span><span class="o">,</span> <span class="n">invisMaterialInstance</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="nc">String</span> <span class="n">condition</span> <span class="o">=</span> <span class="nc">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"query.block_property('%s') == %d"</span><span class="o">,</span> <span class="no">POWER_PROPERTY</span><span class="o">,</span> <span class="n">power</span><span class="o">);</span>
<span class="n">permutations</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">CustomBlockPermutation</span><span class="o">(</span><span class="n">components</span><span class="o">,</span> <span class="n">condition</span><span class="o">));</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">permutations</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
</main>
<div class="col-2 d-none d-xl-block">
<div class="sticky-top">
<div class="sidebar py-2">
<a class="d-block text-decoration-none" href="https://github.com/GeyserMC/GeyserWiki/edit/master/_docs/geyser/custom-blocks.md" target="_blank"><i class="bi bi-pencil"></i> Edit this page</a>
<a class="d-block text-decoration-none" href="https://github.com/GeyserMC/GeyserWiki/issues/new?labels=question&title=Question:&body=Question on: _docs/geyser/custom-blocks.md" target="_blank"><i class="bi bi-github"></i> Create Wiki issue/bug report</a>
<a class="d-block text-decoration-none" href="/issues/new" target="_blank"><i class="bi bi-list-check"></i> Create Geyser issue/bug report</a>
<div id="page-nav" class="py-3 "></div>
</div>
</div>
</div>
</div>
</div>
<!-- <footer class="p-4 text-center bg-body-tertiary">
&copy; 2023 GeyserMC
</footer> -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script>
<script src="/js/page-nav.js"></script>
</body>
</html>