I tipi di danno definiscono tipi di danno che le entità possono subire. A partire da Minecraft 1.19.4, la creazione di nuovi tipi di danno è basata sui dati, per cui essi sono creati tramite file JSON.
Creare un Tipo di Danno
Creiamo un tipo di danno personalizzato chiamato Tater. Inizieremo creando un file JSON per il tuo danno personalizzato. Il file sarà posizionato nella cartella data della tua mod, in una sottocartella chiamata damage_type.
resources/data/fabric-docs-reference/damage_type/tater.jsonHa la struttura seguente:
json
{
"exhaustion": 0.1,
"message_id": "tater",
"scaling": "when_caused_by_living_non_player"
}1
2
3
4
5
2
3
4
5
Questo tipo di danno personalizzato causa un aumento di 0.1 nel livello di esaurimento (exhaustion level) ogni volta che il giocatore prende danno, quando il danno è causato da una fonte vivente che non sia un giocatore (per esempio un blocco). Inoltre, la quantità di danno subita cambierà a seconda della difficoltà del mondo
INFO
Affidati alla Minecraft Wiki per tutte le possibili chiavi e valori.
Accedere ai Tipi di Danno Tramite Codice
Quando abbiamo bisogno di accedere al nostro tipo di danno personalizzato tramite codice, useremo la sua RegistryKey per costruire un'istanza di DamageSource.
La RegistryKey può essere ottenuta nel modo seguente:
java
public static final RegistryKey<DamageType> TATER_DAMAGE = RegistryKey.of(RegistryKeys.DAMAGE_TYPE, Identifier.of(FabricDocsReference.MOD_ID, "tater"));1
Usare i Tipi di Danno
Per mostrare l'uso dei tipi di danno personalizzati, useremo un blocco personalizzato chiamato Blocco di Tater. Facciamo in modo che quando un'entità calpesta un Blocco di Tater, esso causa danno Tater.
Puoi fare override di onSteppedOn per infliggere questo danno.
Cominciamo creando una DamageSource del nostro tipo di danno personalizzato.
java
DamageSource damageSource = new DamageSource(
world.getRegistryManager()
.getOrThrow(RegistryKeys.DAMAGE_TYPE)
.getEntry(FabricDocsReferenceDamageTypes.TATER_DAMAGE.getValue()).get()
);1
2
3
4
5
2
3
4
5
Poi, chiamiamo entity.damage() con la nostra DamageSource e con una quantità.
java
entity.damage(serverWorld, damageSource, 5.0f);1
L'intera implementazione del blocco:
java
public class TaterBlock extends Block {
public TaterBlock(Settings settings) {
super(settings);
}
@Override
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
if (entity instanceof LivingEntity && world instanceof ServerWorld serverWorld) {
DamageSource damageSource = new DamageSource(
world.getRegistryManager()
.getOrThrow(RegistryKeys.DAMAGE_TYPE)
.getEntry(FabricDocsReferenceDamageTypes.TATER_DAMAGE.getValue()).get()
);
entity.damage(serverWorld, damageSource, 5.0f);
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Ora quando un'entità vivente calpesta il nostro blocco personalizzato, subirà 5 di danno (2.5 cuori) usando il nostro tipo di danno personalizzato.
Messaggio di Morte Personalizzato
Puoi definire un messaggio di morte per il tipo di danno nel formato death.attack.message_id nel file en_us.json della nostra mod.
json
{
// ...
"death.attack.tater": "%1$s died from Tater damage!",
// ...
}1
2
3
4
5
2
3
4
5
Al momento della morte dal nostro tipo di danno personalizzato, vedrete il messaggio di morte seguente:

Tag dei Tipi di Danno
Alcuni tipi di danno possono bypassare armatura, bypassare effetti di stato, o simili. I tag sono usati per controllare questo genere di proprietà dei tipi di danno.
Puoi trovare tipi di danno già esistenti in data/minecraft/tags/damage_type.
INFO
Affidati alla Minecraft Wiki per una lista completa dei tag dei tipi di danno.
Aggiungiamo il nostro tipo di danno Tater al tag bypasses_armor dei tipi di danno.
Per aggiungere il nostro tipo di danno a uno di questi tag, creeremo un file JSON nel namespace minecraft.
data/minecraft/tags/damage_type/bypasses_armor.jsonCon il contenuto seguente:
json
{
"values": [
"fabric-docs-reference:tater"
]
}1
2
3
4
5
2
3
4
5
Assicurati che il tuo tag non sostituisca il tag esistente impostando la chiave replace a false.


