1.15.2药水效果制作教程

dasffafa


这个教程是为了填补neutrino在药水方面的空缺写的。

为了感谢v2mcdev对我的帮助,本教程所有权完全属于v2mcdev站长。其可以任意引用、修改并且无须注明作者。我保留修改权限。
我没有用ObsidianEffect这个名字您可别骂我呀
骂我代码写得烂倒是可以

我将会在这篇教程中讲述两种最常见的药水,“隔一段时间就做某件事情”型(原版中毒效果之类的)和“属性增加”(力量,虚弱之类的)型。

首先是我异想天开的效果,“嗝儿”效果
这个效果将会每过一段时间让玩家发出打嗝的声音,
并且获得一个随机方向的随机速度,
而且还有几率扔掉手上的物品
或者受到伤害。


……不许笑!
再笑你也会在笑的时候呛死!

进入正题,首先创建common/effect包,在这个包里新建EffectHipCup.java类:

public class EffectHipCup extends Effect {
    public static final DamageSource hipCup = new DamageSource(YourMod.MOD_ID+".hip_cup");
    public EffectHipCup() {
        /*第一个参数代表药水的类别,一共有HARMFUL,NEUTRAL,BENEFICIAL 三种
        * BENEFICIAL药水将会在HUD上优先显示
        * 第二个参数是十六进制药水颜色,你可以把你PS上的颜色代码直接弄过来*/
        super(EffectType.HARMFUL, 0X123456);
       
    }
    @Override
    public void performEffect(@NotNull LivingEntity entityLivingBaseIn, int amplifier) {
        //参照neutrino去添加声音吧,把你自己的打嗝声录下来效果更佳
        amplifier ++;//游戏中1级的药水在代码中是0级,所以要+1
        entityLivingBaseIn.playSound(ModSoundTypes.hipCup, 2.0F,1.0F);
        Random random = new Random();
        //希望这一行能帮助到可能不会为实体赋予速度的你
        entityLivingBaseIn.setMotion(
                entityLivingBaseIn.getMotion().add(
                0.3*amplifier*random.nextFloat()-0.15 ,0.25*amplifier,0.3*amplifier*random.nextFloat()-0.15));
        switch (random.nextInt(5)){
            case 1:
                //只有玩家才能扔东西
                if (entityLivingBaseIn instanceof PlayerEntity){
                    PlayerEntity player = (PlayerEntity) entityLivingBaseIn;
                    player.dropItem(player.getHeldItemMainhand(),true,false);
                    //不加这一行的话会导致扔出物品还在的效果
                    player.setHeldItem(Hand.MAIN_HAND,new ItemStack(Items.AIR));
                }
            case 2:
                //当你打嗝姿势不对的时候
                entityLivingBaseIn.attackEntityFrom(hipCup, random.nextInt(3*amplifier));
        }

        super.performEffect(entityLivingBaseIn, amplifier);
    }

    @Override
	public boolean isReady(int duration, int amplifier) {
        /*有药水效果的生物每时每刻都会检测isReady,如果返回true就会执行performEffect
        * 很明显这里的意思是每隔40ticks执行一次的意思
        * 利用好了也可以成为黑科技
        * Rustic模组(虽然还没更新到1.15.2,不过思想都是相同的嘛)的炽烈足迹效果就在这里检测了玩家脚底下的方块是不是空气
        * 如果是的话就放置一个火方块*/
		return duration % 40 == 0;
    }
}

创建下一个类EffectTurtle.java
千年王八万年龟,当回王八不吃亏。

public class EffectTurtle extends Effect {
    protected EffectTurtle() {
        super(EffectType.BENEFICIAL, 654321);
        /*AttributeModifier随着药水等级的变化是依靠getAttributeModifierAmount方法实现的,默认为你设置的数乘以(药水等级+1)。
        * 如果喜欢的话可以复写这个方法,我这里感觉没啥必要就没用
        * 值得一提的是,不要直接复制别人的UUID,你得花钱买,100块钱一个
        * 逗你玩呢,你想要多少就有多少。这里有一个网站给你
        * https://1024tools.com/uuid
        * 当然在这里你还可以添加更多AttributesModifier
        */

        this.addAttributesModifier(SharedMonsterAttributes.ARMOR, "d41f581c-f53b-440e-ba68-c8ec88ed5337", 10D, AttributeModifier.Operation.ADDITION);
    }
}

某些效果用这些常规方法没法制作的,可以订阅事件。这里不举例子了,因为我认为你已经在neutrino学会这个了。
记得检测生物是否具有药水效果。

好了效果有了,接下来,在effect包再建一个ModPotions.java用来注册

public class ModPotions {
    public static final DeferredRegister<Effect> EFFECTS = new DeferredRegister<>(ForgeRegistries.POTIONS,YourMod.MOD_ID);
    public static final Effect HIP_CUP = register("hip_cup",new EffectHipCup());
    public static final Effect TURTLE = register("turtle",new EffectTurtle());

    private static Effect register(String name, Effect effect) {
        EFFECTS.register(name, () -> effect);
        return effect;
    }
}

之后别忘了在你的mod主类加上这行

public class YourMod{
    ......
    public YourMod(){
        ......
        ModPotions.EFFECTS.register(FMLJavaModLoadingContext.get().getModEventBus());
        ......
    }
}```

材质文件是resources/assets/textures/mob_effects文件夹里的 *你的药水注册名* .png文件。
不需要为此专门写注册材质的代码。

语言文件中的键是effect.*你的modid*.*你的药水注册名*
去试试吧。    
我自己试了是正常的。

FledgeXu


挺好的。
我一直没写药水效果是因为感觉实体缺了attribute部分没有介绍(


dasffafa


(帖子被作者删除,如无标记将在 24 小时后自动删除)


dasffafa


因为这个我读了好几个mod的源码……
话说,投掷实体的章节什么时候会加入啊