1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем FortiStrike, 8 фев 2024.

  1. Автор темы
    FortiStrike

    FortiStrike Активный участник Пользователь

    Баллы:
    66
    Какой ивент в этом может помочь? Как проверять?

    Заверяю - перегуглил много, ничего не помогло и решения нет
     
  2. Fizer228

    Fizer228 Активный участник Пользователь

    Баллы:
    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'ы - проверка на тип урона, лаву и огонь соответственно.
    Код примерный, сам не тестировал.
     
  3. Автор темы
    FortiStrike

    FortiStrike Активный участник Пользователь

    Баллы:
    66
    Дело в том что мне нужно чтобы броня не ломалась, а игрок получал урон
     
  4. Fizer228

    Fizer228 Активный участник Пользователь

    Баллы:
    66
    Извиняюсь, написал про один ивент, а в примере кода другой указал!!!
    Изменил под 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);
        }
     
  5. Автор темы
    FortiStrike

    FortiStrike Активный участник Пользователь

    Баллы:
    66
    Это не то. Этот ивент отвечает за ломание вещей игроком, тоесть: лопата, кирка, топор, мотыга и тд.
     
  6. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А с чего ты взял, что он не вызовется на броню? У брони та же самая прочность, что и у лопат с кирками. Проверь для начала
     
  7. Автор темы
    FortiStrike

    FortiStrike Активный участник Пользователь

    Баллы:
    66
    C документации
    upload_2024-2-11_17-2-25.png
     
  8. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    И что тут не так? Броня - это не предмет? Или игрок не использует этот предмет?
    Я не вижу противоречий в твоей задаче и том, что указано в описании события.
    И в чём вообще проблема проверить?
    Ты просишь помощи, но упорно сопротивляется предложенному решению по непонятной мне причине
     
  9. Fizer228

    Fizer228 Активный участник Пользователь

    Баллы:
    66
    Если лень проверить, то могу предложить ещё вариант.
    В методе получения урона берёшь игрока, затем его броню, из брони достаёшь ItemMeta и устанавливаешь нерушимость ItemMeta.Spigot().setUnbreakable(true), возвращаешь мету обратно в предмет. И конечно, делать это всё с проверкой типа урона и прикрученным таймером, с обновлением, если игрок снова получает урон от лавы/огня. Для асинхронного таймера могу посоветовать вот эту статью: https://rubukkit.org/threads/bukkitscheduler-tajmery-kuldauny-potoki.184419/
     
  10. Автор темы
    FortiStrike

    FortiStrike Активный участник Пользователь

    Баллы:
    66
    проверил, не работает
     
  11. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Единственная проблема - сравниваемые предметы лучше поменять местами, чтобы не наткнуться на 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(). Очищать этот список каждый тик.
     
  12. Fizer228

    Fizer228 Активный участник Пользователь

    Баллы:
    66
    Благодарю, за правки, а то писал в попыхах и даже вместо равенства поставил знак больше...
     

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