Estados do Bloco 26.2
Saiba o porque os estados dos blocos são uma boa maneira de adicionar funcionalidade visual para seus blocos.
Um estado do bloco é um pedaço de dado anexado a um bloco singular no mundo do Minecraft contendo a informação na forma de propriedades — alguns exemplos de propriedades vanilla guardado nos estados:
- Rotação: Usado principalmente em troncos ou outros blocos naturais.
- Ativado: Fortemente usado em componentes de redstone, e em blocos como a fornalha ou o defumador.
- Idade (Age): usado em plantações, plantas, mudas, algas etc.
Você provavelmente pode ver porque eles são úteis — eles evitam que você armazene dados NBT em um bloco-entidade — reduzindo o tamanho do mundo e prevenindo problemas de TPS!
As definições do estado do bloco são encontrados na pasta assets/example-mod/blockstates.
Exemplo: Pilar
Minecraft já tem algumas classes personalizadas que permitem você criar certos tipos de blocos — este exemplo vai pela criação do bloco com a propriedade axis por criar um bloco como o "Tronco de carvalho condensado".
A classe vanilla RotatedPillarBlock permite que o bloco seja colocado no eixo X, Y ou Z.
java
public static final Block CONDENSED_OAK_LOG = register(
ModBlockItemIds.CONDENSED_OAK_LOG,
RotatedPillarBlock::new,
BlockBehaviour.Properties.of().sound(SoundType.WOOD)
);1
2
3
4
5
2
3
4
5
Blocos de pilar tem duas texturas, topo e lado — eles usam o modelo block/cube_column.
Como sempre, com toda textura de bloco, o arquivo da textura pode ser encontrado em assets/example-mod/textures/block
Como o bloco de pilar tem duas posições, horizontal e vertical, devemos fazer dois arquivos de modelos separados:
condensed_oak_log_horizontal.jsonque estende o modeloblock/cube_column_horizontal.condensed_oak_log.jsonque estende o modeloblock/cube_column.
Um exemplo do arquivo condensed_oak_log_horizontal.json:
json
{
"parent": "minecraft:block/cube_column_horizontal",
"textures": {
"end": "example-mod:block/condensed_oak_log_top",
"side": "example-mod:block/condensed_oak_log"
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
INFO
Lembre-se, os arquivos do estado do bloco podem ser encontrados na pasta assets/example-mod/blockstates, o nome do arquivo deve corresponder com o ID do bloco usado ao registrar o seu bloco na classe ModBlocks. Por exemplo, se o ID do bloco é condensed_oak_log, o arquivo deve ser nomeado condensed_oak_log.json.
Para uma busca mais profunda nos modificadores disponíveis nos arquivos de estados do bloco, veja a página Minecraft Wiki - Modelos (Estado do Bloco).
A seguir, precisamos criar um Estado de Bloco, aonde a mágica acontece. Pilares tem três eixos, então nós utilizamos modelos específicos para as seguintes situações:
axis=x- quando o bloco é colocado junto ao axis X, vamos rotacionar o modelo para virar a direção X positiva.axis=y- Quando o bloco é colocado junto ao axis Y, usaremos o modelo vertical normal.axis=z- Quando o bloco é colocado junto ao eixo Z, nós vamos rotacionar o modelo na direção Z positiva.
json
{
"variants": {
"axis=x": {
"model": "example-mod:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "example-mod:block/condensed_oak_log"
},
"axis=z": {
"model": "example-mod:block/condensed_oak_log_horizontal",
"x": 90
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Como sempre, você deverá criar uma tradução para seu bloco, o modelo de um item que os parentes são qualquer um dos dois modelos.

Estados do bloco personalizado
Customizar Estado de Bloco é bom se seu bloco tem propriedades únicas — às vezes você pode encontrar um modo do bloco reutilizar propriedades do vanilla.
Esse exemplo criará uma única propriedade booliana chamada activated quando um jogador clica com o botão direito no bloco, ele irá de activated=false para activated=ture — mudando sua estrutura de acordo.
Criando a Propriedade
Primeiramente, você precisará criar a propriedade em si - já que isso é um valor booliano, nós usaremos o método BooleanProperty.create.
java
public class PrismarineLampBlock extends Block {
public static final BooleanProperty ACTIVATED = BooleanProperty.create("activated");
}1
2
3
2
3
Em seguida, nós precisamos acrescentar a propriedade ao gerenciador do estado do bloco no método createBlockStateDefinition. Você precisará substituir o método para acessar a construção:
java
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(ACTIVATED);
}1
2
3
4
2
3
4
Você também terá que escolher um estado padrão para a propriedade activated na construção do seu bloco personalizado.
java
public PrismarineLampBlock(Properties settings) {
super(settings);
// Set the default state of the block to be deactivated.
registerDefaultState(defaultBlockState().setValue(ACTIVATED, false));
}1
2
3
4
5
6
2
3
4
5
6
Usando a Propriedade
Esse exemplo inverte a propriedade booliana activated quando o jogador interage com o bloco. Nós não podemos sobrescrever o método useWithoutItem para isso:
java
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hit) {
if (!player.getAbilities().mayBuild) {
// Skip if the player isn't allowed to modify the level.
return InteractionResult.PASS;
} else {
// Get the current value of the "activated" property
boolean activated = state.getValue(ACTIVATED);
// Flip the value of activated and save the new blockstate.
level.setBlockAndUpdate(pos, state.setValue(ACTIVATED, !activated));
// Play a click sound to emphasise the interaction.
level.playSound(player, pos, SoundEvents.COMPARATOR_CLICK, SoundSource.BLOCKS, 1.0F, 1.0F);
return InteractionResult.SUCCESS;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Visualizando a Propriedade
Antes de criar o arquivo de Estado de Bloco, você precisará prover textura para ambos estados do bloco ativo e desativo, também como o modelo do bloco.
Usando seu conhecimento de modelos de blocos para criar dois modelos para o bloco: um quando estiver estado ativado e outro para o estado desativado. Uma vez feito, você pode começar criando o arquivo de Estado de Bloco.
Desde que você criou uma propriedade, você irá precisar atualizar o arquivo de Estado de Bloco para o bloco contar com aquela propriedade.
Se você tem múltiplas propriedades no bloco, você precisará contar com todas as possíveis combinações. Por exemplo, activated e axis levaria a 6 possíveis combinações (dois possíveis valores para activated e três possíveis valores para axis).
Desde que esse bloco tenha duas diferentes variantes, só é possível uma propriedade (activated), o Estado de Bloco JSON irá parecer algo como:
json
{
"variants": {
"activated=false": {
"model": "example-mod:block/prismarine_lamp"
},
"activated=true": {
"model": "example-mod:block/prismarine_lamp_on"
}
}
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
TIP
Não esqueça de adicionar o Item do Cliente ao bloco para ele ser mostrado no inventário!
Desde que o bloco de exemplo é uma lâmpada, nós também precisamos fazer que ele emita luz quando a propriedade activated é verdadeira. Isso pode ser feito através das configurações de bloco passadas a construção quando registramos o bloco.
Você pode usar o método lightLevel para definir o nível de luz emitido pelo bloco, nós podemos criar um método estático na classe PrismarineLampBlock para retornar o nível de luz baseado na propriedade activated, e passar ele como uma referência para o método lightLevel:
java
public static int getLuminance(BlockState currentBlockState) {
// Get the value of the "activated" property.
boolean activated = currentBlockState.getValue(PrismarineLampBlock.ACTIVATED);
// Return a light level if activated = true
return activated ? 15 : 0;
}1
2
3
4
5
6
7
2
3
4
5
6
7
java
public static final BlockItemId PRISMARINE_LAMP = create(
"prismarine_lamp"
);1
2
3
2
3
java
public static final Block PRISMARINE_LAMP = register(
ModBlockItemIds.PRISMARINE_LAMP,
PrismarineLampBlock::new,
BlockBehaviour.Properties.of()
.sound(SoundType.LANTERN)
.lightLevel(PrismarineLampBlock::getLuminance)
);1
2
3
4
5
6
7
2
3
4
5
6
7
Assim que você completou tudo, o resultado final deve se parecer algo como:



