Stati dei Blocchi
Uno stato di un blocco è un dato relativo a un singolo blocco nel mondo di Minecraft che contiene informazioni riguardanti il blocco sotto forma di proprietà - ecco alcuni esempi di proprietà che in vanilla sono memorizzate come stati:
- Rotazione: Usato principalmente per i tronchi e per altri blocchi naturali.
- Attivo: Fondamentale nei componenti della redstone, e blocchi come la fornace e l'affumicatore.
- Età: Usato per colture, piante, arboscelli, alghe...
Probabilmente hai capito perché sono così utili - per evitare di immagazzinare dati NBT in un blocco-entità, riducendo dunque le dimensioni del mondo e migliorando i TPS!
Le definizioni degli stati di blocchi si trovano nella cartella assets/example-mod/blockstates
Esempio: Pilastro
Minecraft ha già delle classi che permettono di creare velocemente alcuni tipi di blocco - questo esempio mostra la creazione di un blocco con la proprietà asse, con un blocco "Tronco di Quercia Condensato".
La classe vanilla RotatedPillarBlock permette di piazzare il blocco lungo gli assi X, Y o Z.
java
No lines matched.1
I pilastri hanno due texture diverse, superiore e laterale - e usano il modello block/cube_column.
Come sempre, con tutte le texture dei blocchi, i file di texture si trovano in assets/example-mod/textures/block
Dato che un pilastro ha due posizioni, orizzontale e verticale, dobbiamo creare due file di modelli separati:
condensed_oak_log_horizontal.jsonche estende il modelloblock/cube_column_horizontal.condensed_oak_log.jsonche estende il modelloblock/cube_column.
Un esempio di come deve essere il file 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
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 blocco nella classe ModBlocks. Per esempio, se l'ID è condensed_oak_log, il file dovrebbe chiamarsi condensed_oak_log.json.
Se vuoi vedere tutti i modificatori disponibili nel file degli stati, leggi la pagina Minecraft Wiki - Models (Block States).
Ora dobbiamo creare un file per lo stato. Il file dello stato è dove avviene la magia—i pilastri hanno tre assi e quindi useremo modelli specifici per i seguenti casi:
axis=x- Quando il blocco è piazzato sull'asse X, ne ruoteremo il modello in modo che guardi verso la parte positiva delle X.axis=y- Quando il blocco è piazzato sull'asse Y, useremo il modello verticale normale.axis=z- Quando il blocco è piazzato sull'asse Z, ne ruoteremo il modello in modo che guardi verso la parte positiva delle Z.
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
Come sempre, dovrai creare una traduzione per il tuo blocco, oltre ad un modello dell'oggetto il quale deve essere figlio di uno dei due modelli.

Stati del Blocco Personalizzati
Gli stati del blocco personalizazti sono ottimi se il tuo blocco ha proprietà uniche - a volte è anche possibile che il tuo blocco riusi proprietà vanilla.
Questo esempio creerà una proprietà booleana chiamata activated - quando un giocatore clicca con il tasto destro il blocco, il blocco passerà dall'essere activated=false ad activated=true - cambiando la texture in maniera appropriata.
Creare la Proprietà
Anzitutto, dovrai creare la proprietà in sé - poiché questo è un booleano, useremo il metodo BooleanProperty.create.
java
No lines matched.1
Dopo di che, dovremo aggiungere la proprietà al gestore degli stati del blocco nel metodo createBlockStateDefinition. Dovrai fare override del metodo per accedere al costruttore:
java
No lines matched.1
Dovrai anche impostare un valore predefinito per la proprietà activated nel costruttore del tuo blocco personalizzato.
java
No lines matched.1
Usare la Proprietà
Questo esempio invertirà la proprietà booleana activated quando il giocatore interagisce con il blocco. Possiamo fare override del metodo useWithoutItem per questo:
java
No lines matched.1
Visualizzare la Proprietà
Prima di creare il file degli stati del blocco, dovrai fornire texture per entrambi gli stati del blocco, sia attivo sia inattivo, e con quelle anche il modello del blocco.
Sfrutta la tua conoscenza dei modelli dei blocchi per creare due modelli per il blocco: uno per lo stato attivo ed uno per quello inattivo. Quando avrai fatto ciò, puoi iniziare la creazione del file degli stati del blocco.
Poiché hai aggiunto una nuova proprietà, dovrai aggiornare il file degli stati di quel blocco per tenere quella proprietà in considerazione.
Se hai proprietà multiple su un blocco, dovrai tenere in conto tutte le possibili combinazioni. Per esempio, activated e axis porterebbero a 6 combinazioni (due valori possibili per activated e tre valori possibili per axis).
Poiché questo blocco ha solo due possibili varianti, dato che ha solo una proprietà (activated), il file JSON degli stati del blocco avrà il seguente aspetto:
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
Non dimenticare di aggiungere un oggetto per il client per il blocco così che appaia nell'inventario!
Poiché il blocco nell'esempio è una lampada, dovremo anche fargli emettere luce quando la proprietà activated è true. Questo si può ottenere tramite le impostazioni del blocco, passate al costruttore durante la registrazione del blocco.
Puoi usare il metodo lightLevel per impostare il livello di luce emessa dal blocco, possiamo creare un metodo statico nella classe PrismarineLampBlock per restituire il livello di luce in base alla proprietà activated, e passarlo come riferimento a un metodo nel metodo lightLevel:
java
No lines matched.1
java
No lines matched.1
Quando avrai completato tutto, il risultato finale dovrebbe avere il seguente aspetto:



