iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

手杖的特殊效果

我們除了3D模型以外,還可以給這個手杖一個藥水效果,我們可以設定成當玩家以副手持有這個手杖,會提供一個加速效果給玩家,這樣這個手杖協助移動的功能就體現出來了。

我們在Initialize上新建一個PlayeroffHandChecker,我們使用這個class來檢查目前玩家的副手是不是手杖

public class PlayeroffHandChecker {
    private static ItemStack lastOffHandItem = ItemStack.EMPTY;
    private static final int EFFECT_DURATION = 300;

    public static void checkOffHandItem(PlayerEntity player) {
        ItemStack currentOffHandItem = player.getOffHandStack();
        ItemStack staffOfNatureStack = new ItemStack(Moditems.StaffofNature);

        if (!ItemStack.areEqual(currentOffHandItem, lastOffHandItem)) {
            if (ItemStack.areEqual(currentOffHandItem, staffOfNatureStack)) {
                giveCustomEffect(player);
            }else {
                removeCustomEffect(player);
            }
            lastOffHandItem = currentOffHandItem.copy();
        }
    }

    private static void giveCustomEffect(PlayerEntity player) {
        StatusEffectInstance currentEffect = player.getStatusEffect(StatusEffects.SPEED);
        if(currentEffect == null || currentEffect.getDuration() <= EFFECT_DURATION / 2 ){
            player.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, EFFECT_DURATION,5,true,false, false));
        }


    }

    private static void  removeCustomEffect(PlayerEntity player){
        StatusEffectInstance currentEffect = player.getStatusEffect(StatusEffects.SPEED);
        if (currentEffect != null && currentEffect.isAmbient() && !currentEffect.shouldShowParticles()){
            player.removeStatusEffect(StatusEffects.SPEED);
        }

    }
}

首先我們使用private static ItemStack lastOffHandItem = ItemStack.EMPTY來保存玩家上一次檢查副手時的物品,用來和玩家現在持有的物品做比較。
private static final int EFFECT_DURATION = 300設置了一個300Tick的時間,相當於15秒。

if (ItemStack.areEqual(currentOffHandItem, staffOfNatureStack)) {
                giveCustomEffect(player);
            }else {
                removeCustomEffect(player);
            }

checkOffHandItem(PlayerEntity player)方法會檢查玩家目前手上的物品是不是手杖,如果是的話,會呼叫giveCustomEffect來給予玩家效果,反之則移除效果

giveCustomEffect(PlayerEntity player) 方法
這個方法負責給玩家添加速度效果。如果玩家當前沒有速度效果或效果的剩餘時間不足,則添加新的速度效果。
StatusEffectInstance currentEffect = player.getStatusEffect(StatusEffects.SPEED);
這個部份用來檢查玩家當前是否已經擁有速度效果。
player.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, EFFECT_DURATION, 5, true, false, false));:
如果玩家沒有速度效果,或效果剩餘時間低於 EFFECT_DURATION 的一半,則添加新的速度效果。持續300Tick,等級為 5(相當於速度提升 VI),且效果是隱形的(無粒子效果和圖標顯示)。

removeCustomEffect(PlayerEntity player) 方法:
這個方法我用來移除效果,他首先檢查玩家有沒有速度效果,並且該效果是隱形效果,且沒有顯示粒子效果。如果滿足條件,則移除效果。
if (currentEffect != null && currentEffect.isAmbient() && !currentEffect.shouldShowParticles()):
這裡檢查玩家是否有速度效果,並且該效果是隱形的,且不顯示粒子效果。

成果

Yes


上一篇
Minecraft Fabric Mod 模組製作 DAY11
下一篇
Minecraft Fabric Mod 模組製作 DAY13 Data Generation
系列文
Minecraft JAVA Fabric 模組製作 : 成為真正的創世神30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言