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的贴图:
5.保存所有文件 -> 进入游戏测试
我们可以用指令来给予自己的buff效果:/effect give @p modid:buff名称
以/effect give @p re8joymod:burn
为例: