00
:
00
:
00
:
00
Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Block Entities

Cos’è una Block Entity?

Un blocco normale in Minecraft (come la pietra o il legno) è “stupido”: non sa chi l’ha piazzato, non contiene oggetti e non fa nulla di attivo. Una Block Entity (o Tile Entity) è ciò che rende un blocco “intelligente”. Esempi vanilla:

  • Chest (contiene inventario)
  • Furnace (ha stato di cottura)
  • Sign (contiene testo)

[!WARNING] Le Block Entities pesano sulla CPU. Non usarle se puoi ottenere lo stesso risultato con i BlockStates!

Creare una Block Entity in Fabric

Per aggiungere una Block Entity, hai bisogno di 3 cose:

  1. La classe della BlockEntity (MyBlockEntity)
  2. Il tipo di BlockEntity registrato (MY_BLOCK_ENTITY_TYPE)
  3. Il blocco che usa la BlockEntity (deve implementare BlockEntityProvider)

1. La Classe BlockEntity

```java public class DemoBlockEntity extends BlockEntity { private int number = 7;

public DemoBlockEntity(BlockPos pos, BlockState state) {
    super(ModBlockEntities.DEMO_BLOCK_ENTITY, pos, state);
}

// Per salvare i dati quando il mondo viene chiuso
@Override
public void writeNbt(NbtCompound nbt) {
    nbt.putInt("number", number);
    super.writeNbt(nbt);
}

// Per caricare i dati
@Override
public void readNbt(NbtCompound nbt) {
    super.readNbt(nbt);
    number = nbt.getInt("number");
}

} ```

2. Registrazione

In ModBlockEntities.java:

```java public class ModBlockEntities { public static BlockEntityType DEMO_BLOCK_ENTITY;

public static void registerBlockEntities() {
    DEMO_BLOCK_ENTITY = Registry.register(
        Registries.BLOCK_ENTITY_TYPE,
        new Identifier("tutorial", "demo_block_entity"),
        FabricBlockEntityTypeBuilder.create(DemoBlockEntity::new, ModBlocks.DEMO_BLOCK).build()
    );
}

} ```

3. Implementare nel Blocco

Nella classe del tuo blocco:

```java public class DemoBlock extends Block implements BlockEntityProvider { // … costruttore …

@Override
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
    return new DemoBlockEntity(pos, state);
}

} ```