I blocchi sono i blocchi di costruzione di Minecraft (perdona il gioco di parole) - proprio come tutto il resto di Minecraft, sono memorizzati in registry.
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 ad 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<AbstractBlock.Settings, Block> blockFactory, AbstractBlock.Settings settings, boolean shouldRegisterItem) {
// Create a registry key for the block
RegistryKey<Block> blockKey = keyOfBlock(name);
// Create the block instance
Block block = blockFactory.apply(settings.registryKey(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.
RegistryKey<Item> itemKey = keyOfItem(name);
BlockItem blockItem = new BlockItem(block, new Item.Settings().registryKey(itemKey));
Registry.register(Registries.ITEM, itemKey, blockItem);
}
return Registry.register(Registries.BLOCK, blockKey, block);
}
private static RegistryKey<Block> keyOfBlock(String name) {
return RegistryKey.of(RegistryKeys.BLOCK, Identifier.of(FabricDocsReference.MOD_ID, name));
}
private static RegistryKey<Item> keyOfItem(String name) {
return RegistryKey.of(RegistryKeys.ITEM, Identifier.of(FabricDocsReference.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 fare questo creando un metodo fittizio initialize, che potrà essere richiamato nell'initializer della tua mod per avviare l'inizializzazione statica.
INFO
Se non sai cos'è l'inizializzazione statica, essa è il processo di 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 FabricDocsReferenceBlocks 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 accettano delle AbstractBlock.Settings 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 AbstractBlock.Settings.copy(AbstractBlock 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,
AbstractBlock.Settings.create().sounds(BlockSoundGroup.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 un Gruppo di Oggetti
Poiché il BlockItem viene creato e registrato in automatico, per aggiungerlo a un gruppo di oggetti devi usare il metodo Block.asItem() per ottenere l'istanza BlockItem.
Per questo esempio, useremo un gruppo di oggetti personalizzato, che abbiamo creato nella pagina Gruppi di Oggetti Personalizzati.
java
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(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 in creativa, 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 traduzione, devi creare una chiave di traduzione nel tuo file di traduzioni - assets/mod-id/lang/en_us.json.
Minecraft userà questa traduzione nell'inventario in creativa e in altri posti in cui il nome del blocco viene mostrato, come nel feedback dei comandi.
json
{
"block.mod_id.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 in creative e in altri posti come nella schermata delle statistiche.
Modelli e Texture
Tutte le texture dei blocchi si trovano nella cartella assets/mod-id/textures/block - ti forniamo una texture di esempio del blocco di "Terra Condensata", che sei libero di usare.
Per fare in modo che la texture sia visibile nel gioco, devi creare un modello del blocco, presenti nel file assets/mod-id/models/block/condensed_dirt.json per quanto riguarda il blocco di "Terra Condensata". Per questo blocco useremo il tipo di modello block/cube_all.
json
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "fabric-docs-reference:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
Perché il blocco sia mostrato nell'inventario, dovrai creare una Descrizione del Modello dell'Oggetto che punti al modello del tuo blocco. Per questo esempio la descrizione del modello dell'oggetto per il blocco "Terra Condensata" si può trovare in assets/mod-id/items/condensed_dirt.json.
json
{
"model": {
"type": "minecraft:model",
"model": "fabric-docs-reference:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
TIP
Dovrai creare una descrizione del modello d'oggetto 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/mod-id/blockstates, e il suo nome dovrebbe corrispondere all'ID del blocco che hai usato quando l'hai registrato nella classe ModBlocks. Per esempio, se l'ID è condensed_dirt, il file dovrebbe chiamarsi condensed_dirt.json.
json
{
"variants": {
"": {
"model": "fabric-docs-reference: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 si rompe il blocco in sopravvivenza, potresti notare che il blocco non droppa - potresti volere questa funzionalità, ma per fare in modo che il blocco droppi come oggetto quando viene rotto devi implementarne la loot table - il file della loot table dovrebbe essere nella cartella data/mod-id/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": "fabric-docs-reference: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": ["fabric-docs-reference:condensed_dirt"]
}1
2
3
4
2
3
4
Se desideri che un'utensile sia necessario per minare il blocco, dovrai aggiungere .requiresTool() 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.





