+0

Crea ENCANTAMIENTOS en Minecraft



Vamos a ver cómo añadir encantamientos a Minecraft desde nuestro mod de Fabric.

¿Cómo añadir encantamientos?

Crear un encantamiento es muy sencillo, solo necesitaremos crear una clase, implementar la función de nuestro encantamiento y registrarlo.

Crear encantamiento

Para crear el encantamiento, crearemos una clase dentro de un nuevo package, el cual llamaré enchantments y la clase RadioactiveEnchantment. Esta clase deberá extender la clase Enchantment.

package dev.polv.cursofabric.emchantments;  
  
import net.minecraft.enchantment.Enchantment;  
  
public class RadioactiveEnchantment extends Enchantment {  
  
    public RadioactiveEnchantment(Properties properties) {  
        super(properties);  
    }  
      
}

Ahora lo que haremos será cambiar el constructor para poner nosotros las propiedades.

Si nos fijamos en el constructor veremos que nos pide un tag, con lo cual necesitaremos crear un tag al cual el cual dirá si le podemos aplicar esto o no. Seguramente podríamos reutilizar alguna que ya existe de Minecraft, pero nada más por aprender, crearemos nosotros una.

public static final TagKey<Item> RADIOACTIVE_ENCHANTABLE_ITEM = createTag("radioactive_enchantable");
getOrCreateTagBuilder(ModTags.Items.RADIOACTIVE_ENCHANTABLE_ITEM)  
        .add(ModItems.URANIUM_SWORD)  
        .add(ModItems.URANIUM_PICKAXE)  
        .add(ModItems.URANIUM_AXE)  
        .add(ModItems.URANIUM_SHOVEL)  
        .add(ModItems.URANIUM_HELMET)  
        .add(ModItems.URANIUM_HELMET)  
        .add(ModItems.URANIUM_CHESTPLATE)  
        .add(ModItems.URANIUM_LEGGINGS)  
        .add(ModItems.URANIUM_BOOTS);
super(  
		new Properties(  
				ModTags.Items.RADIOACTIVE_ENCHANTABLE_ITEM,   
				Optional.empty(),   
				5,  
				1,  
				new Enchantment.Cost(1, 2),  
				new Enchantment.Cost(3, 3),  
				1,  
				FeatureSet.empty(),  
				new EquipmentSlot[]{  
						EquipmentSlot.HEAD,  
						EquipmentSlot.CHEST,  
						EquipmentSlot.LEGS,  
						EquipmentSlot.FEET,  
						EquipmentSlot.MAINHAND,  
				}  
		)  
);  

Ahora podemos ver otros encantamientos que tiene Minecraft o podemos ver los métodos que se pueden sobrescribir de Enchantment para implementar nuestra funcionalidad.

En este caso lo que yo quiero hacer es que cuando un jugador te ataque o recibas un golpe a una armadura con este encantamiento, te de el efecto de radioactividad.

Para ello, necesitaré sustituir el método onTargetDamage y onUserDamaged.

@Override  
public void onTargetDamaged(LivingEntity user, Entity target, int level) {  
    if (target instanceof LivingEntity livingEntity) {  
        livingEntity.addStatusEffect(new StatusEffectInstance(  
                ModStatusEffects.RADIATION_STATUS_EFFECT,  
                20*10,  
                level  
        ));  
    }  
}  
  
@Override  
public void onUserDamaged(LivingEntity user, Entity attacker, int level) {  
    if (attacker instanceof LivingEntity livingEntity) {  
        livingEntity.addStatusEffect(new StatusEffectInstance(  
                ModStatusEffects.RADIATION_STATUS_EFFECT,  
                20*10,  
                level  
        ));  
    }  
}

Y listo, ya tendríamos nuestro encantamiento implementado.

Registrar encantamiento

Ahora solo queda registrar el encantamiento. Para ello, crearemos una clase ModEnchantments en el mismo package. Dentro de esta clase pondremos los típicos métodos para registrar nuestro encantamiento en el registry y registrarlo cuando se inicie nuestro mod.

package dev.polv.cursofabric.emchantments;  
  
import dev.polv.cursofabric.CursoFabric;  
import net.minecraft.enchantment.Enchantment;  
import net.minecraft.registry.Registries;  
import net.minecraft.registry.Registry;  
import net.minecraft.util.Identifier;  
  
public class ModEnchantments {  
      
    private static Enchantment registerEnchantment(String enchantmentId, Enchantment enchantment) {  
        return Registry.register(Registries.ENCHANTMENT, new Identifier(CursoFabric.MODID, enchantmentId), enchantment);  
    }  
      
    public static void registerEnchantments() {  
        CursoFabric.LOGGER.info("Registrando encantamientos...");  
    }  
      
}
ModEnchantments.registerEnchantments();

Y ahora solo queda registrar nuestro encantamiento para poder usarlo.

public static final Enchantment RADIOACTIVE_ENCHANTMENT = registerEnchantment("radioactive", new RadioactiveEnchantment());