Vamos a ver como añadir fuentes de daño personalizadas a nuestro mod de Fabric.
Fuentes de daño
Una fuente de daño es básicamente un motivo por el cual el jugador muere. Esta puede especificar también situaciones externas, como por ejemplo, si ha sido un jugador el que ha hecho que muera.
¿Cómo añadir una fuente de daño?
Hasta ahora hemos estado usando providers junto al Datagen de Fabric para generar los archivos json, pero justamente para los DamageType
s no existe un provider, así que habrá que hacerlo mano.
Hemos de empezar por crear un archivo json que defina nuestro DamageSource. Este lo crearemos dentro de resources/data/<modid>/damage_type
. Yo creare el DamageSource de radiación, así que crearé el archivo radiation.json
.
{
"exhaustion": 0.1,
"scaling": "never",
"message_id": "radiation"
}
Dentro de la wiki de Minecraft puedes encontrar todos los valores que se pueden ajustar
¿Cómo acceder desde nuestro Mod de Fabric?
Primero de todo necesitaremos conseguir el RegistryKey
el cual apunta a nuestro nuevo tipo de daño.
Cada mundo guarda un Registry propio para ciertas cosas, y justamente los DamageType
es uno de ellos.
Podemos guardar el RegistryKey, y añadir una función que se encargue de conseguir el DamageSource dentro de un nuevo archivo, al que llamaré ModDamageTypes
package dev.polv.cursofabric.custom;
import dev.polv.cursofabric.CursoFabric;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.damage.DamageType;
import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
public class ModDamageTypes {
public static final RegistryKey<DamageType> RADIATION_DAMAGE_TYPE = RegistryKey.of(RegistryKeys.DAMAGE_TYPE, new Identifier(CursoFabric.MODID, "radiation"));
public static DamageSource of(World world, RegistryKey<DamageType> key) {
return new DamageSource(world.getRegistryManager().get(RegistryKeys.DAMAGE_TYPE).entryOf(key));
}
}
Añadir mensaje personalizado de muerte
Una de las features más interesantes de añadir un tipo de daño personalizado es la posibilidad de crear un mensaje específico para este.
Esto lo podemos hacer en nuestro en_us.json
, siguiendo el esquema de siempre.
{
// ...
"death.attack.radiation": "%1 died from radiation!"
}
Tags para los Damage Types
Si queremos que nuestro DamageType pueda saltarse armaduras o efectos de poción podemos crear un DamageTypeTag que se encargará de realizar justamente esto.
Tienes una lista en la wiki de Minecraft
Para poner un ejemplo, yo haré que el escudo no te proteja de este daño. Para ello crearemos una carpeta de data de Minecraft, tal que quede data/minecraft/tags/damage_type
, un JSON con el tag. El tag que he de usar es bypasses_shield
, con lo cual el archivo será bypasses_shield.json
.
{
"replace": false,
"values": [
"cursofabric:radiation"
]
}
Y ya estaría, ahora solo quedaría matar a un jugador con este tipo de daño.
Usando el DamageSource
Ahora es que cuando toques el bloque por encima te haga daño este tipo de daño. Para ello, haré un override del método onSteppedOn en nuestro bloque UraniumBlock y le aplicaré el daño a la llave que está encima.
@Override
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
if (entity instanceof LivingEntity) {
entity.damage(ModDamageTypes.of(world, ModDamageTypes.RADIATION_DAMAGE_TYPE), 0.5f);
}
}