我們除了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()):
這裡檢查玩家是否有速度效果,並且該效果是隱形的,且不顯示粒子效果。