I blocchi sono i blocchi di costruzione di Minecraft (perdona il gioco di parole) - proprio come tutto il resto di Minecraft, sono memorizzati in dei registri.
Preparare la Tua Classe dei Blocchi
Se hai già completato la pagina Creare il Tuo Primo Oggetto, questo processo ti sembrerà molto familiare - dovrai creare un metodo che registri il tuo blocco, e l'oggetto a esso associato.
Dovresti mettere questo metodo in una classe chiamata ModBlocks (o qualsiasi altro nome).
Mojang fa qualcosa di simile con i suoi blocchi vanilla; informati riguardo alla classe Blocks per sapere come fanno loro.
java
public class ModBlocks {
private static Block register(String name, Function<BlockBehaviour.Properties, Block> blockFactory, BlockBehaviour.Properties settings, boolean shouldRegisterItem) {
// Create a registry key for the block
ResourceKey<Block> blockKey = keyOfBlock(name);
// Create the block instance
Block block = blockFactory.apply(settings.setId(blockKey));
// Sometimes, you may not want to register an item for the block.
// Eg: if it's a technical block like `minecraft:moving_piston` or `minecraft:end_gateway`
if (shouldRegisterItem) {
// Items need to be registered with a different type of registry key, but the ID
// can be the same.
ResourceKey<Item> itemKey = keyOfItem(name);
BlockItem blockItem = new BlockItem(block, new Item.Properties().setId(itemKey).useBlockDescriptionPrefix());
Registry.register(BuiltInRegistries.ITEM, itemKey, blockItem);
}
return Registry.register(BuiltInRegistries.BLOCK, blockKey, block);
}
private static ResourceKey<Block> keyOfBlock(String name) {
return ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
}
private static ResourceKey<Item> keyOfItem(String name) {
return ResourceKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Proprio come per gli oggetti, dovrai assicurarti che la classe sia caricata, in modo che tutti gli attributi statici contenenti le istanze dei tuoi blocchi siano inizializzati.
Puoi farlo creando un metodo fantoccio initialize che può essere chiamato nel tuo inizializzatore della mod per far partire l'inizializzazione statica.
INFO
Se non sai cos'è l'inizializzazione statica, essa è il processo d'inizializzazione degli attributi statici in una classe. Questo viene fatto quando la classe viene caricata dalla JVM, ed è fatto prima che qualsiasi istanza della classe venga creata.
java
public class ModBlocks {
// ...
public static void initialize() {}
}1
2
3
4
5
2
3
4
5
java
public class ExampleModBlocks implements ModInitializer {
@Override
public void onInitialize() {
ModBlocks.initialize();
}
}1
2
3
4
5
6
2
3
4
5
6
Creare e Registrare il Tuo Blocco
In maniera del tutto simile agli oggetti, i blocchi prendono la classe BlockBehavior.Properties nel costruttore. La classe indica proprietà specifiche del blocco, come i suoi effetti sonori e il livello di estrazione.
Non tratteremo tutte le opzioni qui—puoi vedere la classe da solo per capirne le varie opzioni, che dovrebbero essere chiaramente comprensibili.
Per questo esempio, creeremo un blocco semplice, con le proprietà della terra ma con un materiale diverso.
- Creiamo le nostre impostazioni del blocco in maniera simile a come abbiamo creato le impostazioni degli oggetti nel loro tutorial.
- Diciamo al metodo
registerdi creare un'istanza diBlockdalle impostazioni del blocco chiamando il costruttore diBlock.
TIP
Puoi anche usare BlockBehavior.Properties.ofFullCopy(BlockBehavior block) per copiare le impostazioni di un blocco esistente, in questo caso avremmo potuto usare Blocks.DIRT per copiare le impostazioni della terra, ma per questo esempio useremo il costruttore.
java
public static final Block CONDENSED_DIRT = register(
"condensed_dirt",
Block::new,
BlockBehaviour.Properties.of().sound(SoundType.GRASS),
true
);1
2
3
4
5
6
7
2
3
4
5
6
7
Per creare l'oggetto del blocco in automatico, possiamo passare true al parametro shouldRegisterItem del metodo register che abbiamo creato nel passaggio precedente.
Aggiungere l'Oggetto del Tuo Blocco a una Scheda d'inventario
Poiché il BlockItem viene creato e registrato in automatico, per aggiungerlo a una scheda d'inventario devi usare il metodo Block.asItem() per ottenere l'istanza BlockItem.
Per questo esempio, aggiungeremo il blocco alla scheda BUILDING_BLOCKS. Per aggiungerlo invece a una scheda personalizzata, consulta Schede d'inventario personalizzate.
java
ItemGroupEvents.modifyEntriesEvent(CreativeModeTabs.BUILDING_BLOCKS).register((itemGroup) -> {
itemGroup.accept(ModBlocks.CONDENSED_DIRT.asItem());
});1
2
3
2
3
Dovresti mettere questo nella funzione initialize() della tua classe.
Dovresti ora notare che il tuo blocco è nell'inventario, e può essere posizionato nel mondo!

Ci sono alcuni problemi tuttavia - il blocco non ha nome, non ha texture e non ha modello né per il blocco né per l'oggetto.
Aggiungere Traduzioni del Blocco
Per aggiungere una tradizione, devi creare una chiave di traduzione nel tuo file di traduzione - assets/example-mod/lang/en_us.json.
Minecraft userà questa traduzione nell'inventario e in altri posti in cui il nome del blocco viene mostrato, come nel feedback dei comandi.
json
{
"block.example-mod.condensed_dirt": "Condensed Dirt"
}1
2
3
2
3
Per applicare le modifiche, puoi riavviare il gioco o costruire la tua mod e premere F3+T - e dovresti vedere che il blocco ha un nome nell'inventario e in altri posti come nella schermata delle statistiche.
Modelli e Texture
Tutte le texture dei blocchi si trovano nella cartella assets/example-mod/textures/block - una texture d'esempio per il blocco di "Terra Condensata" è utilizzabile gratuitamente.
Per far apparire la texture nel gioco, devi creare il modello del blocco, che si trova nel file assets/example-mod/models/block/condensed_dirt.json per il blocco di "Terra Condensata". Per questo blocco useremo il tipo di modello block/cube_all.
json
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "example-mod:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
Perché il blocco sia mostrato nell'inventario, dovrai creare un Oggetto per il Client che punti al modello del tuo blocco. Per questo esempio, l'oggetto per il client del blocco "Terra Condensata" si trova in assets/example-mod/items/condensed_dirt.json.
json
{
"model": {
"type": "minecraft:model",
"model": "example-mod:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
TIP
Dovrai creare un oggetto del client solo se hai registrato un BlockItem assieme al tuo blocco!
Quando carichi il gioco, potresti notare che la texture è ancora mancante. Questo perché devi aggiungere la definizione degli stati del blocco.
Creare la Definizione degli Stati del Blocco
La definizione degli stati del blocco è usata dal gioco per capire quale modello renderizzare in base allo stato corrente del blocco.
Per il blocco di esempio, che non ha stati complessi, basta una sola voce nella definizione.
Questo file si dovrebbe trovare nella cartella assets/example-mod/blockstates, e il suo nome dovrebbe combaciare con l'ID del blocco usato quando hai registrato il blocck nella classe ModBlocks. Per esempio, se l'ID è condensed_dirt, il file dovrebbe chiamarsi condensed_dirt.json.
json
{
"variants": {
"": {
"model": "example-mod:block/condensed_dirt"
}
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
TIP
Gli stati dei blocchi sono davvero complessi, ed è per questo che gli tratteremo successivamente in una loro pagina a parte.
Riavviando il gioco o ricaricando con F3+T per applicare le modifiche - dovresti poter vedere la texture del blocco nell'inventario e fisicamente nel mondo:

Aggiungere Drop al Blocco
Quando rompi il blocco in sopravvivenza, potresti notare che il blocco non ti viene rilasciato - potresti volere questa funzionalità, ma per far si che il tuo blocco venga rilasciato come oggetto nel momento in cui lo rompi devi implementare una loot table - il file della loot table va poisizionata nella cartella data/example-mod/loot_table/blocks/.
INFO
Per comprendere le loot table nel profondo, fai riferimento alla pagina Minecraft Wiki - Loot Tables.
json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "example-mod:condensed_dirt"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Questa loot table fornisce un solo drop come oggetto del blocco quando viene rotto, o distrutto da un'esplosione.
Consigliare un'Utensile per la Raccolta
Potresti anche volere che il tuo blocco sia ottenibile solo con un'utensile specifico - per esempio, più veloce da ottenere con una pala.
Tutti i tag degli utensili dovrebbero essere nella cartella data/minecraft/tags/block/mineable/ - e il nome del file dipende dal tipo di utensile usato, uno tra i seguenti:
hoe.jsonaxe.jsonpickaxe.jsonshovel.json
I contenuti del file sono piuttosto semplici - è una lista di oggetti da aggiungere al tag.
Questo esempio aggiunge il blocco "Terra Condensata" al tag shovel.
json
{
"replace": false,
"values": ["example-mod:condensed_dirt"]
}1
2
3
4
2
3
4
Se desideri che un'utensile sia necessario per minare il blocco, dovrai aggiungere .requiresCorrectToolForDrops() alle impostazioni del tuo blocco, oltre che aggiungere il tag del livello di scavo appropriato.
Livelli di Scavo
Similmente, il tag del livello di scavo si trova nella cartella data/minecraft/tags/block/, e segue il seguente formato:
needs_stone_tool.json- Almeno utensili di pietraneeds_iron_tool.json- Almeno utensili di ferroneeds_diamond_tool.json- Almeno utensili di diamante
Il file ha lo stesso formato di quello per la raccolta - una lista di oggetti da aggiungere al tag.
Note Aggiuntive
Se stai aggiungendo più blocchi alla tua mod, potresti voler usare la Generazione di Dati per automatizzare il processo di creazione dei modelli di blocchi e oggetti, delle definizioni degli stati del blocco, e delle loot table.






