Защита от взрывов

Версия Minecraft
1.11.2
Всем привет.. Предупреждаю сразу (да и вы наверное сами догадались), моддер я начинающий, прошу, объясняйте как можно доступнее =)
 
Вопрос(старый как сам майнкрафт)  в заголовке, мне нужно получить защиту от взрыва если я ношу полный комплект тех или иных доспехов.  Снизу припишу код, дабы вы лучше понимали суть моего положения.

Это, собственно класс брони. Как связать всю броню вместе, я благо понял (спасибо ботании и гитхабу за это):

public class TestArmor extends ItemArmor {
   public TestArmor(ArmorMaterial materialIn, int renderIndexIn, EntityEquipmentSlot equipmentSlotIn, String unlocalizedName) {
       super(materialIn, renderIndexIn, equipmentSlotIn);
       this.setUnlocalizedName(unlocalizedName);
       this.setRegistryName(new ResourceLocation(Reference.MODID, unlocalizedName));
   }

   public boolean hasArmorSet(EntityPlayer player) {
       return hasArmorSetItem(player, 0) && hasArmorSetItem(player, 1) && hasArmorSetItem(player, 2) && hasArmorSetItem(player, 3);
   }

   public boolean hasArmorSetItem(EntityPlayer player, int i) {
       ItemStack stack=player.inventory.armorInventory.get(3 - i);
       if (stack.isEmpty())
           return false;

       switch (i) {
           case 0:
               return stack.getItem() == ModArmor.testHelm;
           case 1:
               return stack.getItem() == ModArmor.testChest;
           case 2:
               return stack.getItem() == ModArmor.testLegs;
           case 3:
               return stack.getItem() == ModArmor.testBoots;
       }

       return false;
   }
   
   @SubscribeEvent
   public void onPlayerDamage(LivingHurtEvent event, DamageSource source) {
       if (event.getEntityLiving() instanceof EntityPlayer) {
           EntityPlayer player=(EntityPlayer) event.getEntityLiving();
           if (hasArmorSet(player) && source.isExplosion) {
               event.setCanceled(true);
           }
       }
   }
}


Вот этот евент.. Всё дело в нём.. Я уже прошерстил всё что мог.. Этот код я взял из Divine RPG, (пусть он и на 1.7.10, но суть похожа) сверял его с Nevermine 2.. да и в Ботании есть предмет, позволяющий тебе блокировать тот или иной тип урона. (Кольцо Одина, если кто в теме)..  Код не вызывает ошибки, он просто не работает. Спустя пару дней я примерно понимаю, что дело в регистрации евента, но понятия не имею, что это и где это делается. Заранее благодарю всех, кто откликнется=)
 
Ух-ты.. Я увидел ответ, начал радоваться, пошёл проверять преисполненный решимости. Одел броню, обложился динамитом И-и-и... увидел взрыв.. яркая вспышка.. очнулся и всё что помню это "Player401 was blown up by Player401".. В общем, не сработало... Не знаю почему..

Вот код класса:

public class ArmorFullSet {
@SubscribeEvent
public void onPlayerDamage(LivingHurtEvent event, DamageSource source) {
if (event.getEntityLiving() instanceof EntityPlayer) {
EntityPlayer player=(EntityPlayer) event.getEntityLiving();
if (player.inventory.armorItemInSlot(3).getItem() == ModArmor.testHelm && player.inventory.armorItemInSlot(2).getItem() == ModArmor.testChest && player.inventory.armorItemInSlot(1).getItem() == ModArmor.testLegs && player.inventory.armorItemInSlot(0).getItem() == ModArmor.testBoots) {
if (event.getSource().isExplosion()) {
event.setCanceled(true);
}
}
}
}
}

Регистрация в CommonProxy:
public class CommonProxy {

public void preInit(FMLPreInitializationEvent event) {
GreenMod.logger = event.getModLog();
MinecraftForge.EVENT_BUS.register(new ArmorFullSet());
}

Возможно.. Класс нельзя называть не как иначе, кроме "EventHandlers".. но мне это кажется маловероятным. Хотя лучше проверить
 
Хм.. Изменил имя класса на EventHandlers и попробовал выяснить, в чём дело.. В методе, или в классе. И кажется дело не в методе. Я добавил с того сайта, который ты мне скинул событие, onJoin, и оно не сработало..


Thunder написал(а):
public void onPlayerDamage(LivingHurtEvent event, DamageSource source) {
напиши просто - public void onPlayerDamage(LivingHurtEvent event) а DamageSource доставай через event.getSourceOfDamage();

Ты имеешь ввиду event.getSource().? 
Или у меня проблемы с головой, или getSourceOfDamage не существует..

P.S: DamageSource я там и так не использую.. это добавлял когда тестил разные типы урона..
 

Eifel

Модератор
1,624
79
609
Вот работающий пример из моего мода:


Код:
@SubscribeEvent
public void onHurt(LivingHurtEvent event) {

DamageSource source = event.getSource();
Entity entity = event.getEntity();

if(entity instanceof EntityPlayer){


//тут всякие проверки
...
if(source.isExplosion) event.setCanceled(true);

}


Возможно не работает из-за того что в обработчике должен быть только один параметр - LivingHurtEvent event
 
Thunder написал(а):
Вот работающий пример из моего мода:


Код:
@SubscribeEvent
public void onHurt(LivingHurtEvent event) {

DamageSource source = event.getSource();
Entity entity = event.getEntity();

if(entity instanceof EntityPlayer){


//тут всякие проверки
...
if(source.isExplosion) event.setCanceled(true);

}


Возможно не работает из-за того что в обработчике должен быть только один параметр -  LivingHurtEvent event



Убирал параметр... Никаких результатов. А твой код вызывает ошибку
P.S : я там слишком высоко условие поставил... Но не суть
 

Вложения

  • qwe.png
    qwe.png
    147.4 KB · Просмотры: 15

Eifel

Модератор
1,624
79
609
И еще советую перед тем как доставать предмет, проверить не пустой ли там ItemStack. Иначе ты будешь получать краш если в каком-то слоте нету предмета


Я от руки писал, забыл добавить (), думаю это очевидно же) isExplosion()
 
Thunder написал(а):
И еще советую перед тем как доставать предмет, проверить не пустой ли там ItemStack. Иначе ты будешь получать краш если в каком-то слоте нету предмета


Я от руки писал, забыл добавить (), думаю это очевидно же) isExplosion()



И все же нет.. Запускал без проверок, не работает.

@SubscribeEvent
   public void onHurt(LivingHurtEvent event) {

       DamageSource source=event.getSource();
       Entity entity=event.getEntity();
       if (entity instanceof EntityPlayer) {
           if (source.isExplosion()) {
               event.setCanceled(true);
           }
       }
   }
}



Возвращаясь к вопросу о неисправности класса, может быть проблема в классе, а не в методе?.. Он зарегистрирован в СommonP, но, повторюсь, я попробовал event onJoin (приветствие при входе) с сайта указанного "выше".. Но это не возымело никаких эффектов. 
 


Thunder написал(а):
Значит у тебя проблема в прокси, не там регаешь или где-то накосячил. Зарегай в главном классе и все должно работать. Если будет работать, значит у тебя что-то в прокси.

Огромное тебе человеческое спасибо!) Всё заработало) проблема с прокси
 
Thunder написал(а):
Только на сервере краш получишь если тестить будешь.  Если мне не изменяет память getArmorInSlot сделали чисто клиентским методом. Поэтому я брал player.inventory.armorInventory.get(0) и т.д.

Принято. Учёл, исправил...
Ещё раз спасибо)
 
Сверху