tutorial:blockstate
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
tutorial:blockstate [2019/08/28 21:29] – [Giving a block state] Added description of blockstate json b0undarybreaker | tutorial:blockstate [2023/11/18 08:13] (current) – [Adding models for your blockstates] update Minecraft Wiki link solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Giving a block state ====== | ====== Giving a block state ====== | ||
- | Every type of block in Minecraft is represented by a singular '' | + | Every type of block in Minecraft is represented by a singular '' |
- | This makes it impossible to change a specific block' | + | |
- | as every other block of that type will be affected! | + | This is what '' |
- | But, what if you //do// want to give a singular block state, so it can change based on some condition? | + | |
- | This is what '' | + | |
- | Say we wanted a block to have a hardness of '' | + | |
- | it would become harder and gain a hardness of '' | + | |
| | ||
- | First we define the boolean property of the block - whether or not it is hard: | + | First we define the boolean property of the block - whether or not it is charged (careful not to import the wrong '' |
+ | |||
+ | In fact, you can also use existing properties defined in vanilla, which can be found in '' | ||
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
- | public static final BooleanProperty | + | public static final BooleanProperty |
+ | |||
+ | // The block instance. You can place it anywhere. Make the class is initialized. | ||
+ | public static final ChargeableBlock CHARGEABLE_BLOCK = new ChargeableBlock(FabricBlockSettings.copyOf(Blocks.STONE)); | ||
+ | } | ||
+ | </ | ||
+ | <code java> | ||
+ | public class ExampleMod implements ModInitializer { | ||
+ | @Override | ||
+ | public void onInitialize() { | ||
+ | Registry.register(Registries.BLOCK, | ||
+ | Registry.register(Registries.ITEM, | ||
+ | } | ||
} | } | ||
</ | </ | ||
- | Then we need to register the property | + | Then we need to register the properties of the block by overriding '' |
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
[...] | [...] | ||
@Override | @Override | ||
- | protected void appendProperties(StateFactory.Builder< | + | protected void appendProperties(StateManager.Builder< |
- | | + | |
} | } | ||
| | ||
} | } | ||
</ | </ | ||
- | Then we need to set the default state of our property in the block constructor: | + | Then we need to set the default state of our property in the block constructor |
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
[...] | [...] | ||
- | public | + | public |
super(settings); | super(settings); | ||
- | setDefaultState(getStateFactory().getDefaultState().with(HARDENED, false)); | + | setDefaultState(getDefaultState().with(CHARGED, false)); |
} | } | ||
| | ||
} | } | ||
</ | </ | ||
- | + | Now, we need to be able to charge the block, through the '' | |
- | Now, to set the property | + | |
- | + | ||
- | '' | + | |
- | + | ||
- | (Replace | + | |
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
[...] | [...] | ||
@Override | @Override | ||
- | public | + | public |
- | world.setBlockState(pos, | + | player.playSound(SoundEvents.BLOCK_RESPAWN_ANCHOR_CHARGE, |
- | return | + | world.setBlockState(pos, |
+ | return | ||
} | } | ||
} | } | ||
</ | </ | ||
- | And to use the property we call '' | + | |
+ | And finally, | ||
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
[...] | [...] | ||
@Override | @Override | ||
- | public | + | public |
- | | + | |
- | if(hardened) return 2.0f; | + | // Summoning the Lighting Bolt at the block |
- | | + | LightningEntity lightningEntity = (LightningEntity) EntityType.LIGHTNING_BOLT.create(world); |
+ | | ||
+ | world.spawnEntity(lightningEntity); | ||
+ | | ||
+ | |||
+ | world.setBlockState(pos, | ||
+ | super.onSteppedOn(world, | ||
} | } | ||
} | } | ||
</ | </ | ||
- | You can also make the texture and model of your block change based on the state. This is done through a JSON file called a Blockstate JSON. All blocks need a blockstate JSON, whether they have multiple states or not, but the contents of the JSON can be as simple or complex as you like. Let's say you register an instance of '' | + | ==== Adding models for your blockstates |
- | <code json> | + | You can also make the texture and model of your block change based on the state. This is done through a JSON file called a " |
+ | |||
+ | Let's say you register an instance of '' | ||
+ | |||
+ | < | ||
{ | { | ||
" | " | ||
- | "": | + | "": |
} | } | ||
} | } | ||
Line 77: | Line 94: | ||
Let's break this simple example down. There are a couple important parts to this JSON: | Let's break this simple example down. There are a couple important parts to this JSON: | ||
- | - The ''" | + | * The '' |
- | - A variant named ''""'' | + | |
- | - The object assigned to the ''""'' | + | |
+ | * The '' | ||
+ | |||
+ | If you want to have different models for each blockstate, you should add multiple variants. For the same '' | ||
+ | |||
+ | <code JavaScript resources/ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | In this JSON, there are two variants, one for each possibility of the '' | ||
+ | |||
+ | Variants are based on possible permutations of the properties | ||
+ | |||
+ | This is only a simple introduction to blockstate JSONs. All of the tricks you can do with blockstate and model JSONs are documented on the [[https:// | ||
==== A note about performance ==== | ==== A note about performance ==== | ||
- | Every possible | + | Every possible |
+ | |||
+ | As all possible states have been built, an equal state for a block is a same object, and the '' |
tutorial/blockstate.1567027763.txt.gz · Last modified: 2019/08/28 21:29 by b0undarybreaker