tutorial:blockstate
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
tutorial:blockstate [2021/08/30 13:22] – [Adding models for your blockstates] solidblock | tutorial:blockstate [2025/04/01 09:21] (current) – [Adding models and blockstates definitions for your blockstates] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ~~REDIRECT> | ||
+ | |||
====== 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! | + | ===== Block state properties ===== |
- | But, what if you //do// want to give a singular block state, so it can change based on some condition? | + | |
- | This is what '' | + | Each block can have zero, one or multiple **block state properties**. Each block state property can have at lease two values. Vanilla properties, can be found in '' |
+ | |||
+ | Several examples: | ||
+ | * [[directionalblock|Directional block]], the block state property used is '' | ||
+ | * [[waterloggable|Waterloggable block]], the block state property used is '' | ||
+ | |||
+ | ===== Custom block state property: a chargeable block as an example ===== | ||
Say we wanted a block that can summon lightning, but only when charged up. | Say we wanted a block that can summon lightning, but only when charged up. | ||
| | ||
- | First we define the boolean property of the block - whether or not it is charged (careful not to import the wrong BooleanProperty!): | + | First we define the boolean property of the block - whether or not it is charged (careful not to import the wrong '' |
+ | |||
+ | If you intend to define other types of properties, you may use '' | ||
+ | |||
+ | Create the class first: | ||
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
public static final BooleanProperty CHARGED = BooleanProperty.of(" | public static final BooleanProperty CHARGED = BooleanProperty.of(" | ||
+ | | ||
+ | public ChargeableBlock(Settings settings) { | ||
+ | super(settings); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | We register the blocks in the form described in [[blocks]]. | ||
+ | <code java> | ||
+ | public final class TutorialBlocks { | ||
+ | // For versions below 1.21.2: | ||
+ | public static final ChargeableBlock CHARGEABLE_BLOCK = register(" | ||
+ | | ||
+ | // For versions since 1.21.2: | ||
+ | public static final Block CHARGEABLE_BLOCK = register(" | ||
+ | | ||
+ | // [...] | ||
} | } | ||
</ | </ | ||
Then we need to register the properties of the block by overriding '' | 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(StateManager.Builder< | + | protected void appendProperties(StateManager.Builder< |
- | | + | |
} | } | ||
| | ||
} | } | ||
</ | </ | ||
- | Then we need to set the default state of our property | + | |
+ | Then we need to set the default state of our property. Go to the constructor | ||
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
- | [...] | + | public |
- | public | + | |
super(settings); | super(settings); | ||
- | setDefaultState(getStateManager().getDefaultState().with(CHARGED, | + | setDefaultState(getDefaultState().with(CHARGED, |
} | } | ||
| | ||
} | } | ||
</ | </ | ||
- | Now, we need to be able to charge the block, through the '' | + | Now, we need to be able to charge the block, through the '' |
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
[...] | [...] | ||
@Override | @Override | ||
- | public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { | + | public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { |
player.playSound(SoundEvents.BLOCK_RESPAWN_ANCHOR_CHARGE, | player.playSound(SoundEvents.BLOCK_RESPAWN_ANCHOR_CHARGE, | ||
world.setBlockState(pos, | world.setBlockState(pos, | ||
Line 48: | Line 78: | ||
</ | </ | ||
- | And Finally, to use the '' | + | And finally, to use the '' |
<code java> | <code java> | ||
- | public class MyBlock | + | public class ChargeableBlock |
[...] | [...] | ||
@Override | @Override | ||
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) { | public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) { | ||
if (world.getBlockState(pos).get(CHARGED)){ | if (world.getBlockState(pos).get(CHARGED)){ | ||
- | //Summoning the Lighting Bolt at the block | + | // Summoning the Lighting Bolt at the block |
- | LightningEntity lightningEntity = (LightningEntity) | + | LightningEntity lightningEntity = EntityType.LIGHTNING_BOLT.create(world, SpawnReason.MOB_SUMMONED); |
lightningEntity.refreshPositionAfterTeleport(Vec3d.ofBottomCenter(pos)); | lightningEntity.refreshPositionAfterTeleport(Vec3d.ofBottomCenter(pos)); | ||
world.spawnEntity(lightningEntity); | world.spawnEntity(lightningEntity); | ||
Line 67: | Line 97: | ||
</ | </ | ||
- | ==== Adding models for your blockstates ==== | + | ==== Adding models |
- | 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. If you want to change the textures of your block based on the state, you //will// need multiple models. | + | 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 '' | + | Let's say you register an instance of '' |
- | <code JavaScript resources/ | + | <code JavaScript resources/ |
{ | { | ||
" | " | ||
- | "": | + | "": |
} | } | ||
} | } | ||
Line 83: | Line 113: | ||
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 ''""'' | + | * A variant named '' |
- | * The object assigned to the ''""'' | + | * The object assigned to the '' |
- | * The ''" | + | * The '' |
- | If you want to have different models for each blockstate, you should add multiple variants. For the same '' | + | If you want to have different models for each blockstate, you should add multiple variants. For the same '' |
- | <code JavaScript resources/ | + | <code JavaScript resources/ |
{ | { | ||
" | " | ||
- | " | + | " |
- | " | + | " |
} | } | ||
} | } | ||
</ | </ | ||
- | In this JSON, there are two variants, one for each possibility of the '' | + | In this blockstates definition, there are two variants, one for each possibility of the '' |
- | Variants are based on possible permutations of the properties added to your block. A property can be totally ignored in the blockstate JSON if you want, like in the first blockstate JSON where we ignored the '' | + | Variants are based on possible permutations of the properties added to your block. A property can be totally ignored in the blockstate JSON if you want, like in the first blockstate JSON where we ignored the '' |
+ | |||
+ | This is only a simple introduction to blockstates definitions. You can visit Minecraft Wiki for all of the tricks you can do with [[https:// | ||
- | 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.1630329738.txt.gz · Last modified: 2021/08/30 13:22 by solidblock