Difference between revisions of "Making Blocks"

From Forge Community Wiki
m (update blockstate link)
(Fix broken sound link)
 
(3 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
Blocks are, obviously, essential to the Minecraft world. They make up all of the terrain, structures, and machines. Chances are if you are interested in making a mod, then you will want to add some blocks. This page will guide you through the creation of blocks, and some of the things you can do with them.
 
Blocks are, obviously, essential to the Minecraft world. They make up all of the terrain, structures, and machines. Chances are if you are interested in making a mod, then you will want to add some blocks. This page will guide you through the creation of blocks, and some of the things you can do with them.
 
+
==Creating a Block==
== Creating a Block ==
+
===Basic Blocks===
 
+
For simple blocks, which need no special functionality (think cobblestone, wooden planks, etc.), a custom class is not necessary. You can create a block by instantiating the <code><nowiki>Block</nowiki></code> class with a <code><nowiki>BlockBehaviour$Properties</nowiki></code> object. This <code><nowiki>BlockBehaviour$Properties</nowiki></code> object can be made using <code><nowiki>BlockBehaviour$Properties::of</nowiki></code> and it can be customised by calling its methods. For instance:
=== Basic Blocks ===
+
* <code><nowiki>strength</nowiki></code> - The hardness controls the time it takes to break the block. It is an arbitrary value. For reference, stone has a hardness of 1.5, and dirt 0.5. If the block should be unbreakable a hardness of -1.0 should be used, see the definition of <code><nowiki>Blocks#BEDROCK</nowiki></code> as an example. The resistance controls the explosion resistance of the block. For reference, stone has a resistance of 6.0, and dirt 0.5.
 
+
* <code><nowiki>sound</nowiki></code> - Controls the sound the block makes when it is punched, broken, or placed. Requires a <code><nowiki>SoundType</nowiki></code> argument, see the [[Sounds|sounds]] page for more details.
For simple blocks, which need no special functionality (think cobblestone, wooden planks, etc.), a custom class is not necessary. You can create a block by instantiating the <code><nowiki>Block</nowiki></code> class with a <code><nowiki>AbstractBlock$Properties</nowiki></code> object. This <code><nowiki>AbstractBlock$Properties</nowiki></code> object can be made using <code><nowiki>AbstractBlock$Properties::create</nowiki></code> and it can be customised by calling its methods. For instance:
+
* <code><nowiki>lightLevel</nowiki></code> - Controls the light emission of the block. Takes a function with a ''BlockState'' parameter that returns an integer value from zero to fifteen.
 
+
* <code><nowiki>friction</nowiki></code> - Controls how slippery the block is. For reference, ice has a slipperiness of 0.98.
* <code><nowiki>hardnessAndResistance</nowiki></code> - The hardness controls the time it takes to break the block. It is an arbitrary value. For reference, stone has a hardness of 1.5, and dirt 0.5. If the block should be unbreakable a hardness of -1.0 should be used, see the definition of <code><nowiki>Blocks#BEDROCK</nowiki></code> as an example. The resistance controls the explosion resistance of the block. For reference, stone has a resistance of 6.0, and dirt 0.5.
 
* <code><nowiki>sound</nowiki></code> - Controls the sound the block makes when it is punched, broken, or placed. Requires a <code><nowiki>SoundType</nowiki></code> argument, see the [[latest:advanced:effects:sounds|sounds]] page for more details.
 
* <code><nowiki>setLightLevel</nowiki></code> - Controls the light emission of the block. Takes a function with a ''BlockState'' parameter that returns an integer value from zero to fifteen.
 
* <code><nowiki>slipperiness</nowiki></code> - Controls how slippery the block is. For reference, ice has a slipperiness of 0.98.
 
  
 
All these methods are ''chainable'' which means you can call them in series. See the <code><nowiki>Blocks</nowiki></code> class for examples of this.
 
All these methods are ''chainable'' which means you can call them in series. See the <code><nowiki>Blocks</nowiki></code> class for examples of this.
  
{{Colored box|title=Tip|content=Blocks have no setter for their <code><nowiki>ItemGroup</nowiki></code>. This has been moved to the <code><nowiki>BlockItem</nowiki></code> and is now its responsibility.}}
+
{{Colored box|title=Tip|content=Blocks have no setter for their <code><nowiki>CreativeModeTab</nowiki></code>. This has been moved to the <code><nowiki>BlockItem</nowiki></code> and is now its responsibility.}}
 
 
=== Advanced Blocks ===
 
  
 +
===Advanced Blocks===
 
Of course, the above only allows for extremely basic blocks. If you want to add functionality, like player interaction, a custom class is required. However, the <code><nowiki>Block</nowiki></code> class has many methods and unfortunately not every single one can be documented here. See the rest of the pages in this section for things you can do with blocks.
 
Of course, the above only allows for extremely basic blocks. If you want to add functionality, like player interaction, a custom class is required. However, the <code><nowiki>Block</nowiki></code> class has many methods and unfortunately not every single one can be documented here. See the rest of the pages in this section for things you can do with blocks.
 
+
==Registering a Block==
== Registering a Block ==
 
 
 
 
Blocks must be [[Registration|registered]] to function.
 
Blocks must be [[Registration|registered]] to function.
  
{{Colored box|title=Important|content=A block in the world and a "block" in an inventory are very different things. A block in the world is represented by an <code><nowiki>BlockState</nowiki></code>, and its behavior defined by an instance of <code><nowiki>Block</nowiki></code>. Meanwhile, an item in an inventory is an <code><nowiki>ItemStack</nowiki></code>, controlled by an <code><nowiki>Item</nowiki></code>. As a bridge between the different worlds of <code><nowiki>Block</nowiki></code> and <code><nowiki>Item</nowiki></code>, there exists the class <code><nowiki>BlockItem</nowiki></code>. <code><nowiki>BlockItem</nowiki></code> is a subclass of <code><nowiki>Item</nowiki></code> that has a field <code><nowiki>block</nowiki></code> that holds a reference to the <code><nowiki>Block</nowiki></code> it represents. <code><nowiki>BlockItem</nowiki></code> defines some of the behavior of a "block" as an item, like how a right click places the block. It's possible to have a <code><nowiki>Block</nowiki></code> without an <code><nowiki>BlockItem</nowiki></code>. (E.g. <code><nowiki>minecraft:water</nowiki></code> exists as a block, but not an item. It is therefore impossible to hold it in an inventory as one.)
+
{{Tip/Important|A block in the level and a "block" in an inventory are very different things. A block in the level is represented by a <code><nowiki>BlockState</nowiki></code>, and its behavior defined by an instance of <code><nowiki>Block</nowiki></code>. Meanwhile, an item in an inventory is an <code><nowiki>ItemStack</nowiki></code>, controlled by an <code><nowiki>Item</nowiki></code>. As a bridge between the different worlds of <code><nowiki>Block</nowiki></code> and <code><nowiki>Item</nowiki></code>, there exists the class <code><nowiki>BlockItem</nowiki></code>. <code><nowiki>BlockItem</nowiki></code> is a subclass of <code><nowiki>Item</nowiki></code> that has a field <code><nowiki>block</nowiki></code> that holds a reference to the <code><nowiki>Block</nowiki></code> it represents. <code><nowiki>BlockItem</nowiki></code> defines some of the behavior of a "block" as an item, like how a right click places the block. It's possible to have a <code><nowiki>Block</nowiki></code> without an <code><nowiki>BlockItem</nowiki></code>. (E.g. <code><nowiki>minecraft:water</nowiki></code> exists as a block, but not an item. It is therefore impossible to hold it in an inventory as one.)
 
<br><br>
 
<br><br>
When a block is registered, ''only'' a block is registered. The block does not automatically have an <code><nowiki>BlockItem</nowiki></code>. To create a basic <code><nowiki>BlockItem</nowiki></code> for a block, one should use <code><nowiki>new BlockItem(block)</nowiki></code> and match the registry name between the two objects. Custom subclasses of <code><nowiki>BlockItem</nowiki></code> may be used as well. Once a <code><nowiki>BlockItem</nowiki></code> has been registered for a block, <code><nowiki>Block#asItem</nowiki></code> can be used to retrieve it. <code><nowiki>Block#asItem</nowiki></code> will deafult to <code><nowiki>Items#AIR</nowiki></code> if there is no <code><nowiki>BlockItem</nowiki></code> for the <code><nowiki>Block</nowiki></code>, so if you are not certain that there is an <code><nowiki>BlockItem</nowiki></code> for the <code><nowiki>Block</nowiki></code> you are using, check for <code><nowiki>Items#AIR</nowiki></code>.}}
+
When a block is registered, ''only'' a block is registered. The block does not automatically have an <code><nowiki>BlockItem</nowiki></code>. To create a basic <code><nowiki>BlockItem</nowiki></code> for a block, one should use <code><nowiki>new BlockItem(block)</nowiki></code> and match the registry name between the two objects. Custom subclasses of <code><nowiki>BlockItem</nowiki></code> may be used as well. Once a <code><nowiki>BlockItem</nowiki></code> has been registered for a block, <code><nowiki>Block#asItem</nowiki></code> can be used to retrieve it. <code><nowiki>Block#asItem</nowiki></code> will default to <code><nowiki>Items#AIR</nowiki></code> if there is no <code><nowiki>BlockItem</nowiki></code> for the <code><nowiki>Block</nowiki></code>, so if you are not certain that there is a <code><nowiki>BlockItem</nowiki></code> for the <code><nowiki>Block</nowiki></code> you are using, check for <code><nowiki>Items#AIR</nowiki></code>.}}
  
  
==== Optionally Registering Blocks ====
+
====Optionally Registering Blocks====
 +
Since there is no limit on the amount of blocks that can be register, register all blocks in your mod! If you want a block to be disabled through a configuration file, you should disable the crafting recipe and/or remove the block from the creative menu (<code><nowiki>CreativeModeTab</nowiki></code>).
 +
==Further Reading==
 +
For information about block properties, such as those used for vanilla blocks like fences, walls, and many more, see the section on [[Understanding Blockstates|blockstates]].
  
Since there is no limit on the amount of blocks that can be register, register all blocks in your mod! If you want a block to be disabled through a configuration file, you should disable the crafting recipe and/or remove the block from the creative menu (<code><nowiki>ItemGroup</nowiki></code>).
 
  
== Further Reading ==
+
[[Category:Blocks]]
 
 
For information about block properties, such as those used for vanilla blocks like fences, walls, and many more, see the section on [[Understanding Blockstates|blockstates]].
 

Latest revision as of 22:02, 30 July 2021

Blocks are, obviously, essential to the Minecraft world. They make up all of the terrain, structures, and machines. Chances are if you are interested in making a mod, then you will want to add some blocks. This page will guide you through the creation of blocks, and some of the things you can do with them.

Creating a Block

Basic Blocks

For simple blocks, which need no special functionality (think cobblestone, wooden planks, etc.), a custom class is not necessary. You can create a block by instantiating the Block class with a BlockBehaviour$Properties object. This BlockBehaviour$Properties object can be made using BlockBehaviour$Properties::of and it can be customised by calling its methods. For instance:

  • strength - The hardness controls the time it takes to break the block. It is an arbitrary value. For reference, stone has a hardness of 1.5, and dirt 0.5. If the block should be unbreakable a hardness of -1.0 should be used, see the definition of Blocks#BEDROCK as an example. The resistance controls the explosion resistance of the block. For reference, stone has a resistance of 6.0, and dirt 0.5.
  • sound - Controls the sound the block makes when it is punched, broken, or placed. Requires a SoundType argument, see the sounds page for more details.
  • lightLevel - Controls the light emission of the block. Takes a function with a BlockState parameter that returns an integer value from zero to fifteen.
  • friction - Controls how slippery the block is. For reference, ice has a slipperiness of 0.98.

All these methods are chainable which means you can call them in series. See the Blocks class for examples of this.

Tip

Blocks have no setter for their CreativeModeTab. This has been moved to the BlockItem and is now its responsibility.

Advanced Blocks

Of course, the above only allows for extremely basic blocks. If you want to add functionality, like player interaction, a custom class is required. However, the Block class has many methods and unfortunately not every single one can be documented here. See the rest of the pages in this section for things you can do with blocks.

Registering a Block

Blocks must be registered to function.

Important

A block in the level and a "block" in an inventory are very different things. A block in the level is represented by a BlockState, and its behavior defined by an instance of Block. Meanwhile, an item in an inventory is an ItemStack, controlled by an Item. As a bridge between the different worlds of Block and Item, there exists the class BlockItem. BlockItem is a subclass of Item that has a field block that holds a reference to the Block it represents. BlockItem defines some of the behavior of a "block" as an item, like how a right click places the block. It's possible to have a Block without an BlockItem. (E.g. minecraft:water exists as a block, but not an item. It is therefore impossible to hold it in an inventory as one.)

When a block is registered, only a block is registered. The block does not automatically have an BlockItem. To create a basic BlockItem for a block, one should use new BlockItem(block) and match the registry name between the two objects. Custom subclasses of BlockItem may be used as well. Once a BlockItem has been registered for a block, Block#asItem can be used to retrieve it. Block#asItem will default to Items#AIR if there is no BlockItem for the Block, so if you are not certain that there is a BlockItem for the Block you are using, check for Items#AIR.


Optionally Registering Blocks

Since there is no limit on the amount of blocks that can be register, register all blocks in your mod! If you want a block to be disabled through a configuration file, you should disable the crafting recipe and/or remove the block from the creative menu (CreativeModeTab).

Further Reading

For information about block properties, such as those used for vanilla blocks like fences, walls, and many more, see the section on blockstates.