Не работает ивент на сервере

Версия Minecraft
1.7.10
API
Forge
37
1
0
Делаю броню, которая при фул сете уменьшает получаемый урон, делаю через LivingHurtEvent. В одиночке или в локальной сети все работает, но когда поставил мод на сборку на сервере Kcauldron, то ивент срабатывает (сделал вывод в консоль для тестов), но урон все равно проходит.
EventHandler:
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onLivingHurtEvent(LivingHurtEvent event) {
    System.out.println("On hurt HIGHEST");
    if (event.entity instanceof EntityPlayer) {
        System.out.println("entity is player");
        System.out.println("initial amount: " + event.ammount);
        EntityPlayer player = (EntityPlayer)event.entity;
        System.out.println("player health: " + player.getHealth() + "/" + player.getMaxHealth());   
        if (player.getCurrentArmor(0) != null && player.getCurrentArmor(1) != null && player.getCurrentArmor(2) != null && player.getCurrentArmor(3) != null
            && player.getCurrentArmor(3).getItem() == Init.EldHelmet && player.getCurrentArmor(2).getItem() == Init.EldChestplate
            && player.getCurrentArmor(1).getItem() == Init.EldLeggins && player.getCurrentArmor(0).getItem() == Init.EldBoots) {
            System.out.println("is wearing armor");
            event.ammount *= 0.2f;
            if (event.ammount < player.getMaxHealth()) {
                event.ammount /= 10;
            }
            else {
                event.ammount /= 100;
            }
            if (event.ammount < 1f) {
                event.ammount = 0;
                event.setCanceled(true);
            }
        }
    }
    System.out.println("result amount: " + event.ammount + "result cancelled: " + event.isCanceled());
}
Код для теста, отдельный хандлер:
@SubscribeEvent(priority = EventPriority.LOWEST, receiveCanceled = true)
public void onLivingHurtEventLowest(LivingHurtEvent event) {
    System.out.println("Lowest on hurt amount: " + event.ammount + " isCanceled: " + event.isCanceled());
    if (event.entityLiving instanceof EntityPlayer) {
        System.out.println("Entity is player");
        System.out.println("DamageSource: ");
        System.out.println(event.source.getClass().getName());
    }
}

Screenshot_1.png
Ивент вроде бы отменен, но все равно смерть...
 
Делай в LivingAttackEvent, или отменяй смерть в LivingDeathEvent. А еще, зачем ты ставишь урон = 0, если все равно отменяешь эвент?
 
Урон ставил 0 и отменял просто в попытках разобраться в чем проблема, изначально просто отменял. Отменять смерть не вариант, нужно просто урезать урон, а не бессмертие. Во-первых, если отменять LivingAttackEvent то не будет анимации урона и, например, на сервере будет выглядеть немного странно отсутствие именно удара даже если урон 0, я хотел бы сохранить анимацию, а во-вторых, все-таки хотелось бы разобраться, в чем тут проблема, мне кажется очень странным такое поведение, а костыль приделать всегда можно
 
Расширяй свою броню от ISpecialArmor и не делай велосипед.
+.
А вообще, похожая тема была (@CreoDen Незнаю, может ты не нашёл но вот):
Во первых, попробуй использовать проверку !world.isRemote
Во вторых, перенеси весь свой код в эвент с EventPriority.LOWEST

Если ничего не сработает - используй эвент EntityDamageByEntityEvent. (хотя это и костыль, но пусть)
 
Тема действительно похожая, но решения я там не увидел (если оно там есть, можете указать?). Проверка !world.isRemote не помогает, LOWEST ставить тоже пробовал - ничего не меняется. ISpecialArmor в теории можно использовать, но кроме этой брони у меня есть и подобие вампира из витчери через ExtendedEntityProperties и там уже этот способ не прокатит (наверно стоило изначально постить тему с этой проблемой, а не "от лица брони" ну да ладно)
 
Назад
Сверху