🇮🇹 Italiano (Italian)
🇮🇹 Italiano (Italian)
Aspetto
🇮🇹 Italiano (Italian)
🇮🇹 Italiano (Italian)
Aspetto
Questa pagina si applica alla versione:
1.21.4
Questa pagina si applica alla versione:
1.21.4
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.
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.
public class ModBlocks {
public static Block register(Block block, RegistryKey<Block> blockKey, boolean shouldRegisterItem) {
// Sometimes, you may not want to register an item for the block.
// Eg: if it's a technical block like `minecraft:air` 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 = RegistryKey.of(RegistryKeys.ITEM, blockKey.getValue());
BlockItem blockItem = new BlockItem(block, new Item.Settings().registryKey(itemKey));
Registry.register(Registries.ITEM, itemKey, blockItem);
}
return Registry.register(Registries.BLOCK, blockKey, block);
}
}
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.
public class ModBlocks {
// ...
public static void initialize() {}
}
public class FabricDocsReferenceBlocks implements ModInitializer {
@Override
public void onInitialize() {
ModBlocks.initialize();
}
}
In maniera del tutto simile agli oggetti, i blocchi prendono la classe Blocks.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.
RegistryKey<Block>
da usare come identificatore unico del nostro blocco, che passeremo in Registry.register
nel metodo di utilità precedente.RegistryKey<Block>
è anche richiesta dal costruttore di AbstractBlock.Settings
.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.
public static final RegistryKey<Block> CONDENSED_DIRT_KEY = RegistryKey.of(
RegistryKeys.BLOCK,
Identifier.of(FabricDocsReference.MOD_ID, "condensed_dirt")
);
public static final Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().registryKey(CONDENSED_DIRT_KEY).sounds(BlockSoundGroup.GRASS)),
CONDENSED_DIRT_KEY,
true
);
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 creare l'oggetto del blocco in automatico, possiamo passare true
al parametro shouldRegisterItem
del metodo register
che abbiamo creato nel passaggio precedente.
Per questo esempio, useremo un gruppo di oggetti personalizzato, che abbiamo creato nella pagina Gruppi di Oggetti Personalizzati.
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
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.
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.
{
"block.mod_id.condensed_dirt": "Condensed Dirt"
}
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.
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
.
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "fabric-docs-reference:block/condensed_dirt"
}
}
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
.
{
"model": {
"type": "minecraft:model",
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
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.
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
.
{
"variants": {
"": {
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
}
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:
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.
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "fabric-docs-reference:condensed_dirt"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}
Questa loot table fornisce un solo drop come oggetto del blocco quando viene rotto, o distrutto da un'esplosione.
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.json
axe.json
pickaxe.json
shovel.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
.
{
"replace": false,
"values": ["fabric-docs-reference:condensed_dirt"]
}
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.
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 diamanteIl file ha lo stesso formato di quello per la raccolta - una lista di oggetti da aggiungere al tag.
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.