Эффект от брони

Версия Minecraft
1.7.10
Здравствуйте
Как сделать так чтоб при одевании брони эффект давался только один раз а при снятии уберался
вот мой код но так получается что каждый тик игрок получает этот эффект заново и его начинает бить (у меня эффект на доп здоровье)
Код:
   @Override
 public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
     
     if (player.inventory.armorItemInSlot(3) != null && player.inventory.armorItemInSlot(3).getItem() == BaseMyBestMod.ironhelmeta
            && player.inventory.armorItemInSlot(2) != null && player.inventory.armorItemInSlot(2).getItem() == BaseMyBestMod.ironplate
            && player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == BaseMyBestMod.ironpants
            && player.inventory.armorItemInSlot(0) != null && player.inventory.armorItemInSlot(0).getItem() == BaseMyBestMod.ironboots) {
     player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 0));
     player.addPotionEffect(new PotionEffect(Potion.field_76434_w.id, 20, 10)); //вот этот эффект
     
     }   
     
       }
 
Решение
Честно, это немного озадачило меня. Я думал, что тут все просто, однако провозился довольно долго. В общем, пришлось использовать PlayerTickEvent. Для начала добавляем в onArmorTick проверку, не был ли уже наложен этот эффект, а только потом уже добавляем сам эффект:
Код:
if(!player.isPotionActive(21)) {
     player.addPotionEffect(new PotionEffect(Potion.field_76434_w.id, Integer.MAX_VALUE, 10));
}
Теперь эффект не будет накладываться заново и не будет пропадать, т.к. будет существовать примерно 3 года реального времени (в продолжительность отправляю максимальное значение Integer). Далее в твоем эвент хандлере нужно будет создать playerTickEvent и записать туда проверку, есть ли броня на игроке. Если же ее нет, то эффект снять...
Честно, это немного озадачило меня. Я думал, что тут все просто, однако провозился довольно долго. В общем, пришлось использовать PlayerTickEvent. Для начала добавляем в onArmorTick проверку, не был ли уже наложен этот эффект, а только потом уже добавляем сам эффект:
Код:
if(!player.isPotionActive(21)) {
     player.addPotionEffect(new PotionEffect(Potion.field_76434_w.id, Integer.MAX_VALUE, 10));
}
Теперь эффект не будет накладываться заново и не будет пропадать, т.к. будет существовать примерно 3 года реального времени (в продолжительность отправляю максимальное значение Integer). Далее в твоем эвент хандлере нужно будет создать playerTickEvent и записать туда проверку, есть ли броня на игроке. Если же ее нет, то эффект снять:
Код:
@SubscribeEvent
 public void checkArmor(TickEvent.PlayerTickEvent e) {
  InventoryPlayer inv = e.player.inventory;
 //В этот массив записываешь названия твоей брони с нижнего до верхнего слота
 Item armor[] = {Main.vasechkaBoots, Main.vasechkaPants, Main.vasechkaPlate, Main.vasechkaHelmet};
 boolean hasArmor = false;
 for(int i = 0; i < 4; i++) {
 ItemStack stack = inv.armorItemInSlot(i);
 if(stack != null && stack.getItem() == armor[i]) {
 hasArmor = true;
 break;
 }
 }
 if(!hasArmor) e.player.removePotionEffect(21);
 }
Этот код может выглядеть как угодно, но я сделал так, чтобы ты лучше понял. Сначала в массив мы записываем все наши айтемы брони (их названия изменишь на свои). Затем, в цикле, мы пробегаемся по всем слотам и сравниваем айтемы в этих слотах с айтемами в массиве, и если ни в одном из них твоей брони не будет - эффект снимается. Однако, если хоть в одном слоте броня есть, то мы выходим из цикла и эффект остается. Надеюсь, ты понял)
Единственная проблема - конфликты с другими модами. Из-за этого кода эффект пополнения здоровья будет сниматься всегда. И еще, ты не сможешь выдать себе его через /effect @p 21, т.к. он тут же будет пропадать. Это можно исправить либо добавлением своего эффекта, либо добавлением переменной, которая будет отвечать за то, как именно наложен эффект. Если он наложен самой броней - эффект снимается. Насчет этого я пока заморачиваться не стал, но, если нужно, могу помочь.
 
Сверху