Minecraft 1.19.2 Fabric模组开发 06.自定义效果(Effect)

本次我们在模组中添加一个自定义药水效果

在这里插入图片描述

演示效果 演示效果 演示效果

1.在Java包中新建一个effect包 -> 包中新建一个效果类EffectMimic

EffectMimic.java

package net.joy187.joyggd.effect;

import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectCategory;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.player.PlayerEntity;

public class EffectMimic extends StatusEffect {
    public EffectMimic(StatusEffectCategory statusEffectCategory, int color) {
        super(statusEffectCategory, color);
    }
    
    //实际药水效果
    @Override
    public void applyUpdateEffect(LivingEntity living, int pAmplifier) {
        //我们需要这个效果可以让生物对玩家失去敌意,当判断到生物要攻击玩家时,把该生物的目标设置为空
        if(living instanceof MobEntity)
        {
            if(((MobEntity) living).getTarget() instanceof PlayerEntity)
            {
                ((MobEntity) living).setTarget(null);
            }
        }
        
    }

    //每隔多久药水生效一次   
    @Override
    public boolean canApplyUpdateEffect(int pDuration, int pAmplifier) {
        return pDuration % 2 == 0;
    }
    
}

2.在init包中新建一个效果注册类EffectInit

EffectInit.java

package net.joy187.joyggd.init;

import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.effect.EffectMimic;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectCategory;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;

public class EffectInit {
    public static StatusEffect MIMIC;

    //注册我们上一步中的效果
    public static StatusEffect registerStatusEffects(String name) {
        return Registry.register(Registry.STATUS_EFFECT, new Identifier(ModMain.MOD_ID, name),
                new EffectMimic(StatusEffectCategory.BENEFICIAL, 16777215));
        
    }

    public static void registerEffects() {
    	MIMIC = registerStatusEffects("mimic");
    }
}
在项目主类中将该效果注册类进行注册:

ModMain.java

public class ModMain implements ModInitializer {
	
	public static final String MOD_ID = "joyggd";
	public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

    public static final ItemGroup ITEMTAB = FabricItemGroupBuilder.build(
            new Identifier(MOD_ID, "itemtab"), () -> new ItemStack(ItemInit.SHERIFF));
	
	@Override
	public void onInitialize() {

		//添加该注册类
		EffectInit.registerEffects();

	}
}

3.在resources\assets\你的moid\textures\mob_effect中放入我们的效果贴图:

360j.jpg

4.进入游戏调试

我们本次的物品逻辑为使用该物品后,判定在一定范围内的敌人丧失敌意,该物品代码如下:

ItemU.java

package net.joy187.joyggd.items;

import net.joy187.joyggd.config.ModConfigs;
import net.joy187.joyggd.init.EffectInit;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.world.World;

import java.util.List;
import java.util.function.Predicate;

public class ItemU extends Item {

    private static final Predicate<Entity> MIMIC_AREA = (entity) -> {
        return entity.isAlive() && !(entity instanceof PlayerEntity);
    };
    
    public ItemU(Settings settings) {
        super(settings.maxDamage(50));
    }

    @Override
    public TypedActionResult<ItemStack> use(World level, PlayerEntity playerIn, Hand hand) {
        ItemStack itemstack = playerIn.getMainHandStack();
        //当物品不在cd时,可使用该物品
        if(!playerIn.getItemCooldownManager().isCoolingDown(itemstack.getItem()))
        {
            for (LivingEntity livingentity : playerIn.world.getEntitiesByClass(LivingEntity.class, playerIn.getBoundingBox().expand(10), MIMIC_AREA)) {
                if(livingentity instanceof MobEntity)
                {
                    if(((MobEntity) livingentity).getTarget()==playerIn)
                    {   
                        //给范围内的生物赋予一个效果,使其丧失敌意
                        livingentity.addStatusEffect(new StatusEffectInstance(EffectInit.MIMIC, 10 * 20, 0, true, true));
                    }
                }

            }
            
            //使用过后给物品一个cd
            playerIn.getItemCooldownManager().set(this,17*20);
//            playerIn.getMainHandStack().damage(1, playerIn, (p_40665_) -> {
//                p_40665_. .broadcastBreakEvent(playerIn.getMainHandStack());
//            });
            
            playerIn.getMainHandStack().damage(1, playerIn,
                    (p_40665_) -> p_40665_.sendToolBreakStatus(playerIn.getActiveHand()));
        }

        return TypedActionResult.success(itemstack);
    }

    //给物品加上物品信息
    @Override
    public void appendTooltip(ItemStack stack, World worldIn, List<Text> tooltip, TooltipContext flagIn) {
        if(Screen.hasShiftDown()) {
            tooltip.add(Text.translatable("tooltip.mimic"));
        }  
        else tooltip.add(Text.translatable("tooltip.shift"));

    }

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jay_fearless

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

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

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

打赏作者

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

抵扣说明:

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

余额充值