Minecraft 1.12.2模组开发(十八) 自定义附魔

我们本次对于模组中自定义附魔进行讲解

1. init 包中新建 ModEnchantment 类

cr1.jpg

在 ModEnchantment.java 中编写:
package com.Joy187.newmod.init;

import java.util.ArrayList;
import java.util.List;

import com.Joy187.newmod.enchantments.EnchantmentYourEnchantment;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import com.Joy187.newmod.util.Reference;

@Mod.EventBusSubscriber(modid=Reference.Mod_ID)
public class ModEnchantment {
	
	public static final List<Enchantment> ENCHANTNENTS = new ArrayList<Enchantment>();
	public static final Enchantment MY_ENCHANTMENT = new EnchantmentYourEnchantment();
	
	@SubscribeEvent
	public static void yourEnchantmentsFunction(LivingUpdateEvent event)
	{
		EntityLivingBase living = event.getEntityLiving();
		int level = EnchantmentHelper.getMaxEnchantmentLevel(MY_ENCHANTMENT, living);
		BlockPos pos = living.getPosition();
		World world = event.getEntity().world;
	}
}

2. 新建 enchantment 包

cr3.jpg

enchantment 包中新建EnchantmentYourEnchantment 类:

cr4.jpg

在EnchantmentYourEnchantment.java 中编写:

package com.Joy187.newmod.enchantments;

import java.util.Random;

import com.Joy187.newmod.init.ModEnchantment;
import com.Joy187.newmod.util.Reference;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.EnumEnchantmentType;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Enchantments;
import net.minecraft.init.MobEffects;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.ResourceLocation;

public class EnchantmentYourEnchantment extends Enchantment{
	
	public EnchantmentYourEnchantment()
	{
		//设定穿戴的位置(头盔、胸甲、护腿、鞋子)
		super(Rarity.RARE, EnumEnchantmentType.ARMOR_CHEST, new EntityEquipmentSlot[] {EntityEquipmentSlot.CHEST});
		this.setName("my_enchantment");
		this.setRegistryName(new ResourceLocation(Reference.Mod_ID + ":my_enchantment"));
		ModEnchantment.ENCHANTNENTS.add(this);		
	}
	
	@Override
	public int getMinEnchantability(int enchantmentLevel)
	{
		return 20 * enchantmentLevel;
	}
	
	@Override
	public int getMaxEnchantability(int enchantmentLevel) {
		return this.getMinEnchantability(enchantmentLevel) + 10;
	}
	
	@Override
	public int getMaxLevel() {
		//你想拥有的最大等级	
		return 5;
	}
	
	protected boolean canApplyTogether(Enchantment ench) {
		//不能和哪个魔法同时附魔
		return super.canApplyTogether(ench) && ench != Enchantments.THORNS;
	}
	
	//设置一个与荆棘效果类似的附魔效果
    public static boolean shouldHit(int level, Random rnd)
    {
        if (level <= 0)
        {
            return false;
        }
        else
        {
            return rnd.nextFloat() < 0.15F * (float)level;
        }
    }	
    
    //设置一个与荆棘效果类似的附魔效果,同时附带生命回复效果
    public void onUserHurt(EntityLivingBase user, Entity attacker, int level)
    {
        Random random = user.getRNG();
        ItemStack itemstack = EnchantmentHelper.getEnchantedItem(ModEnchantment.MY_ENCHANTMENT, user);

        if (shouldHit(level, random))
        {
        	//如果被攻击了,就反弹伤害
            if (attacker != null)
            {
                attacker.attackEntityFrom(DamageSource.causeThornsDamage(user), (float)getDamage(level, random)*5);
            }

            if (!itemstack.isEmpty())
            {
                damageArmor(itemstack, 2, user);
            }
//            user.removeActivePotionEffect(MobEffects.WITHER);
            user.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 20 * 10, 3, true, true));            
        }
        else if (!itemstack.isEmpty())
        {
        	//如果是用武器攻击的,给自己增加一个生命恢复的效果,持续5s
            damageArmor(itemstack, 1, user);
            user.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 20 * 5, 2, true, true));
        }
        else{
        	user.removeActivePotionEffect(MobEffects.WITHER);
        	user.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 20 * 5, 2, true, true));
        }

    }	
    
    public static int getDamage(int level, Random rnd)
    {
        return level > 10 ? level - 10 : 1 + rnd.nextInt(2);
    }
    
    //装备遭到攻击时的伤害与耐久损耗设置
    private void damageArmor(ItemStack stack, int amount, EntityLivingBase entity)
    {
        int slot = -1;
        int x = 0;
        for (ItemStack i : entity.getArmorInventoryList())
        {
            if (i == stack){
                slot = x;
                break;
            }
            x++;
        }
        if (slot == -1 || !(stack.getItem() instanceof net.minecraftforge.common.ISpecialArmor))
        {
            stack.damageItem(1, entity);
            return;
        }
        net.minecraftforge.common.ISpecialArmor armor = (net.minecraftforge.common.ISpecialArmor)stack.getItem();
        armor.damageArmor(entity, stack, DamageSource.causeThornsDamage(entity), amount, slot);
    }
}

3.在util.handlers 中添加附魔的注册信息:

	@SubscribeEvent
	public static void onEnchantmentRegister(RegistryEvent.Register<Enchantment> event)
	{
		event.getRegistry().registerAll(ModEnchantment.ENCHANTNENTS.toArray(new Enchantment[0]));
	}

cr5.jpg

4.在resources的语言表(en_us.lang)中添加你的附魔书的游戏名称

//enchantment
enchantment.my_enchantment=My Enchantment

5.保存操作 -> 运行游戏

cr2.jpg

在游戏中成功找到我们的附魔书!

攻击回血效果函数(可附魔在武器上面)
    public void onEntityDamaged(EntityLivingBase user, Entity target, int level)
    {
        if (target instanceof EntityLivingBase)
        {
            EntityLivingBase entitylivingbase = (EntityLivingBase)target;


            int i = 20 + user.getRNG().nextInt(10 * level);
            //被攻击的减速3效果
            entitylivingbase.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, i, 3));
            //给自己生命恢复5效果
            user.addPotionEffect(new PotionEffect(MobEffects.HEALTH_BOOST, i, 5));
        }
    }
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值