Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Нужно отключить ломание брони об лаву

FortiStrike

Активный участник
Пользователь
Баллы
66
Какой ивент в этом может помочь? Как проверять?

Заверяю - перегуглил много, ничего не помогло и решения нет
 
Здраствуй, существует PlayerItemDamageEvent, если правильно помню, он отвечает за уменьшение прочности на предмете.
Попробуй вот такой вариант:
Код:
public void onItemDamage(EntityDamageByEntityEvent e) {
        if (!e.getCause().equals(EntityDamageEvent.DamageCause.LAVA)){
            return;
        }
        if (!e.getCause().equals(EntityDamageEvent.DamageCause.FIRE)){
            return;
        }
        e.setCancelled(true);
    }
Первый и второй if'ы - проверка на тип урона, лаву и огонь соответственно.
Код примерный, сам не тестировал.
 
Здраствуй, существует PlayerItemDamageEvent, если правильно помню, он отвечает за уменьшение прочности на предмете.
Попробуй вот такой вариант:
Код:
public void onItemDamage(EntityDamageByEntityEvent e) {
        if (!e.getCause().equals(EntityDamageEvent.DamageCause.LAVA)){
            return;
        }
        if (!e.getCause().equals(EntityDamageEvent.DamageCause.FIRE)){
            return;
        }
        e.setCancelled(true);
    }
Первый и второй if'ы - проверка на тип урона, лаву и огонь соответственно.
Код примерный, сам не тестировал.
Дело в том что мне нужно чтобы броня не ломалась, а игрок получал урон
 
Дело в том что мне нужно чтобы броня не ломалась, а игрок получал урон
Извиняюсь, написал про один ивент, а в примере кода другой указал!!!
Изменил под PlayerItemDamageEvent
Код:
public void onItemDamage(PlayerItemDamageEvent e) {
        // Проверка на горение. если есть время горения, то игрок горит
        // Если грок не горит, возвращает метод
        if (!(e.getPlayer().getFireTicks() > 0)) {
            return;
        }
        // Проверка на предмет. броня игрока == прдемету ивента, то true
        // Если никакая броня не равна предмету ивента, возвращает метод
        if(!(e.getPlayer().getEquipment().getBoots().equals(e.getItem())
                || e.getPlayer().getEquipment().getChestplate().equals(e.getItem())
                || e.getPlayer().getEquipment().getLeggings().equals(e.getItem())
                || e.getPlayer().getEquipment().getHelmet().equals(e.getItem()))){
            return;
        }
        e.setCancelled(true);
    }
 
Извиняюсь, написал про один ивент, а в примере кода другой указал!!!
Изменил под PlayerItemDamageEvent
Код:
public void onItemDamage(PlayerItemDamageEvent e) {
        // Проверка на горение. если есть время горения, то игрок горит
        // Если грок не горит, возвращает метод
        if (!(e.getPlayer().getFireTicks() > 0)) {
            return;
        }
        // Проверка на предмет. броня игрока == прдемету ивента, то true
        // Если никакая броня не равна предмету ивента, возвращает метод
        if(!(e.getPlayer().getEquipment().getBoots().equals(e.getItem())
                || e.getPlayer().getEquipment().getChestplate().equals(e.getItem())
                || e.getPlayer().getEquipment().getLeggings().equals(e.getItem())
                || e.getPlayer().getEquipment().getHelmet().equals(e.getItem()))){
            return;
        }
        e.setCancelled(true);
    }
Это не то. Этот ивент отвечает за ломание вещей игроком, тоесть: лопата, кирка, топор, мотыга и тд.
 
Это не то. Этот ивент отвечает за ломание вещей игроком, тоесть: лопата, кирка, топор, мотыга и тд.
А с чего ты взял, что он не вызовется на броню? У брони та же самая прочность, что и у лопат с кирками. Проверь для начала
 
И что тут не так? Броня - это не предмет? Или игрок не использует этот предмет?
Я не вижу противоречий в твоей задаче и том, что указано в описании события.
И в чём вообще проблема проверить?
Ты просишь помощи, но упорно сопротивляется предложенному решению по непонятной мне причине
 
Если лень проверить, то могу предложить ещё вариант.
В методе получения урона берёшь игрока, затем его броню, из брони достаёшь ItemMeta и устанавливаешь нерушимость ItemMeta.Spigot().setUnbreakable(true), возвращаешь мету обратно в предмет. И конечно, делать это всё с проверкой типа урона и прикрученным таймером, с обновлением, если игрок снова получает урон от лавы/огня. Для асинхронного таймера могу посоветовать вот эту статью: https://rubukkit.org/threads/bukkitscheduler-tajmery-kuldauny-potoki.184419/
 
И что тут не так? Броня - это не предмет? Или игрок не использует этот предмет?
Я не вижу противоречий в твоей задаче и том, что указано в описании события.
И в чём вообще проблема проверить?
Ты просишь помощи, но упорно сопротивляется предложенному решению по непонятной мне причине
проверил, не работает
 
проверил, не работает
Единственная проблема - сравниваемые предметы лучше поменять местами, чтобы не наткнуться на NPE. А так - всё вроде работает, об огонь по крайней мере.
PHP:
@EventHandler
public void onItemDamage(PlayerItemDamageEvent e) {
    Player player = e.getPlayer();
    if (player.getFireTicks() == 0) {
        return;
    }
    EntityEquipment equipment = player.getEquipment();
    ItemStack item = e.getItem();
    if (item.equals(equipment.getBoots())
            || item.equals(equipment.getChestplate())
            || item.equals(equipment.getLeggings())
            || item.equals(equipment.getHelmet())) {
        e.setCancelled(true);
    }
}
Другое дело, что тебе это всё равно не очень подходит - если игрок в огне, и его будут бить, то урон по броне тоже будет отменяться. Проще всего будет хранить какой-нибудь Set<UUID>, куда записывать игроков, которые получили урон от лавы, и потом в PlayerItemDamageEvent проверять наличие игрока в сете вместо проверки значения getFireTicks(). Очищать этот список каждый тик.
 
Единственная проблема - сравниваемые предметы лучше поменять местами, чтобы не наткнуться на NPE. А так - всё вроде работает, об огонь по крайней мере.
PHP:
@EventHandler
public void onItemDamage(PlayerItemDamageEvent e) {
    Player player = e.getPlayer();
    if (player.getFireTicks() == 0) {
        return;
    }
    EntityEquipment equipment = player.getEquipment();
    ItemStack item = e.getItem();
    if (item.equals(equipment.getBoots())
            || item.equals(equipment.getChestplate())
            || item.equals(equipment.getLeggings())
            || item.equals(equipment.getHelmet())) {
        e.setCancelled(true);
    }
}
Другое дело, что тебе это всё равно не очень подходит - если игрок в огне, и его будут бить, то урон по броне тоже будет отменяться. Проще всего будет хранить какой-нибудь Set<UUID>, куда записывать игроков, которые получили урон от лавы, и потом в PlayerItemDamageEvent проверять наличие игрока в сете вместо проверки значения getFireTicks(). Очищать этот список каждый тик.
Благодарю, за правки, а то писал в попыхах и даже вместо равенства поставил знак больше...
 

Поделиться этой страницей

Назад
Верх