Minecraft 1.18.1、1.18.2模组开发 13.buff效果

1.18的buff效果制作和1.16.5的极为相似,只是一些函数的命名与1.16.5buff教程有所不同。

1.我们首先新建一个effects包,包内新建一个效果基类BaseEffect

BaseEffect.java

package com.joy187.re8joymod.effects;

import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.LivingEntity;

public class BaseEffect extends MobEffect{
	   private boolean instant;
	    private boolean isRegistered = false;
	    protected float resistancePerLevel = 0.5f;//for any buff

	    public BaseEffect(MobEffectCategory type, int color, boolean isInstant) {
	        super(type, color);
	        this.instant = isInstant;
	    }

	    public boolean isInstantenous() {
	        return false;
	    }

	    @Override
	    public boolean isDurationEffectTick(int remainingTicks, int level) {
	        if (isInstantenous()) {
	            return true;
	        }
	        return canApplyEffect(remainingTicks, level);
	    }

	    protected boolean canApplyEffect(int remainingTicks, int level) {
	        if (!isInstantenous()) {
	            //Log.w("Non instant effects should override canApplyEffect!");
	            Thread.dumpStack();
	        }
	        return false;
	    }

	    @Override
	    public void applyEffectTick(LivingEntity entity, int amplifier) {
	        if (isInstantenous()) {
	            applyInstantenousEffect(null, null, entity, amplifier, 1.0d);
	        }
	    }

	    public BaseEffect onRegister() {
	        isRegistered = true;
	        return this;
	    }

	    public boolean isRegistered() {
	        return isRegistered;
	    }
}

2.我们想要制作一个效果,让玩家移速降低的同时不断掉血,新建一个EffectBurn类继承我们的效果基类。

EffectBurn.java

package com.joy187.re8joymod.effects;

import java.util.Random;

import com.joy187.re8joymod.util.CommonFunctions;

import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;

public class EffectBurn extends BaseEffect{

    public EffectBurn(MobEffectCategory type, int color, boolean isInstant) {
        super(type, color, isInstant);
    }
    
    //buff隔多久生效一次
    @Override
    protected boolean canApplyEffect(int remainingTicks, int level) {
        return remainingTicks % 5 == 0;
    }
    
    //buff在生物身上的效果
    @Override
    public void applyEffectTick(LivingEntity living, int amplified) {
        amplified ++;
        Random ran = new Random();
        int co = ran.nextInt(5);
        //如果是玩家的话,就加快其饥饿速度
        if(living instanceof Player)
            ((Player)living).causeFoodExhaustion(2F*amplified);
        //生物每次受到0.5乘buff等级这么多的伤害
        living.hurt(DamageSource.WITHER, 0.5F*amplified);

        }
    }
    //是不是增益buff
    @Override
    public boolean isBeneficial() {
        return false;
    }
    
}

3.在init包中新建一个EffectInit类将我们所有的效果进行声明:

EffectInit.java

package com.joy187.re8joymod.init;

import com.joy187.re8joymod.effects.EffectBurn;
import com.joy187.re8joymod.effects.EffectDeadly;
import com.joy187.re8joymod.effects.EffectErosion;

import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

public class EffectInit {
    public static final DeferredRegister<MobEffect> EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS,"re8joymod");


    
//    public static RegistryObject<MobEffect> DEADLY = EFFECTS.register("deadly",()->
//    {
//        return new EffectDeadly(MobEffectCategory.HARMFUL, 0x333333, false);
//    });

    //我们的效果类
    public static RegistryObject<MobEffect>BURN = EFFECTS.register("burn",()->
    {
        //这个效果生效时,就将玩家的速度降低25%
        return new EffectBurn(MobEffectCategory.HARMFUL, 0x000033, false)
        		.addAttributeModifier(Attributes.MOVEMENT_SPEED, 
        		"7107DE5E-7CE8-4030-940E-514C1F160890", (double)-0.25F, AttributeModifier.Operation.MULTIPLY_TOTAL);
    });
    
}

找到我们项目的主类Main类,在Main函数中对EffectInit进行注册
	public Main() {
		IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();

		ItemInit.ITEMS.register(bus);
		BlockInit.BLOCKS.register(bus);
		EntityInit.ENTITY_TYPES.register(bus);
		
		//添加效果类的注册事件
		EffectInit.EFFECTS.register(bus);

        
		MinecraftForge.EVENT_BUS.register(this);
	}

4.代码部分结束,来到材质包,在resources\assets\你的modid的lang文件中添加英文名称:

en_us.json

  	"effect.re8joymod.burn": "Example Buff",
textures\mob_effect中添加我们buff的贴图:

cr1.png

5.保存所有文件 -> 进入游戏测试

我们可以用指令来给予自己的buff效果:/effect give @p modid:buff名称
/effect give @p re8joymod:burn为例:
cr2.png

Buff成功出现!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jay_fearless

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

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

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

打赏作者

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

抵扣说明:

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

余额充值