Vamos a aprender a crear efectos de pociones en nuestro mod de fabric.
¿Cómo crear un efecto de poción?
Para crear un efecto de poción nuevo necesitaremos crear una clase que se encargue de ese efecto de poción y extender la clase StatusEffect.
Como ejemplo, crearé el efecto de poción radioactivo.
package dev.polv.cursofabric.statuseffects;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectCategory;
public class RadiationEffect extends StatusEffect {
protected RadiationEffect() {
super(StatusEffectCategory.HARMFUL, 0x00ff00);
}
}
Ahora, para realizar una acción mientras el efecto dure, tenemos dos métodos, el canApplyUpdateEffect
y el applyUpdateEffect
.
-
canApplyUpdateEffect
: Este método recibe dos argumentos, la duración y la potencia del efecto. Con este método podemos determinar si en ese tick la poción va a realizar una acción o no. -
applyUpdateEffect
: Si la funcióncanApplyUpdateEffect
devuelve cierto, este método correrá, lo que significa que se tendrá que aplicar el efecto.
@Override
public boolean canApplyUpdateEffect(int duration, int amplifier) {
int i = 50 >> amplifier;
if (i > 0) {
return duration % i == 0;
} else {
return true;
}
}
@Override
public boolean applyUpdateEffect(LivingEntity entity, int amplifier) {
entity.damage(ModDamageTypes.of(entity.getWorld(), ModDamageTypes.RADIATION_DAMAGE_TYPE), 0.3f);
return true;
}
Registrar nuestro efecto
Muy bien, ahora tenemos el efecto creado. Ahora toca registrarlo. Para ello, crearemos una clase llamada ModEffects en la cual registraremos nuestro efecto.
Y como siempre crearemos una función de utilidad que nos ayudará a registrar el efecto y una función para registrarlos desde el ModInitializer.
package dev.polv.cursofabric.effects;
import dev.polv.cursofabric.CursoFabric;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
public class ModEffects {
public static final RegistryEntry.Reference<StatusEffect> RADIATION_EFFECT = registerEffect("radiation", new RadiationEffect());
private static RegistryEntry.Reference<StatusEffect> registerEffect(String name, StatusEffect statusEffect) {
return Registry.registerReference(Registries.STATUS_EFFECT, new Identifier(CursoFabric.MODID, name), statusEffect);
}
public static void registerEffects() {
CursoFabric.LOGGER.info("Registrando efectos...");
}
}
Esta vez estamos usando el método de registry reference, el cual nos vuelve una referencia en vez del objeto en sí. nos será útil para crear los ítems de pociones.
ModEffects.registerEffects();
Y listo, ya tendríamos nuestro efecto registrado. Ahora solo quedaría añadir una textura y un nombre en las traducciones.
Textura y nombre
Para la textura he creado un pequeño icono 18x18 png el cual podemos usar. Este icono deberá ir dentro de nuestra carpeta assets/textures/mob_effect
y ahí al archivo con el id de nuestro nombre.
Luego, para la traducción nos iremos a nuestro archivo de lenguaje, en mi caso en_us.json y añadiremos la key como effect, id de nuestro mod, id del efecto.
{
// ...
"effect.cursofabric.radiation": "Radiation"
}
Y listo, ya tenemos nuestro efecto hecho en Minecraft.