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

Помогите PlayerInteractEvent 1.16. Что они с ним сделали?!?!

Тема в разделе "Разработка плагинов для новичков", создана пользователем pro100koder, 24 июл 2020.

Статус темы:
Закрыта.
  1. Автор темы
    pro100koder

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

    Баллы:
    76
    Во-первых, я не могу найти аналог устаревшему e.setCancelled(); есть только Result отдельно по предмету и блоку, но что с ним делать - не нашёл (МБ плохо гуглил)
    Во-вторых, LEFT_CLICK_... вызывается при правом клике бронёй.

    Нафига оно мне надо: использую ArmorEquipEvent (стороннюю либу), которая уже пишет сообщение о том, что броню с надписью "ЗАГОТОВКА." одеть нельзя, и отменяет ивент. Но PlayerInteractEvent этого не понимает и пишет свои сообщения, в итоге в чате спам, который очень бросается в глаза. Предметов с надписью "ЗАГОТОВКА.", кроме брони, много, и мне нужно запретить их использовать по ПКМ и ЛКМ.
    Код для вас, перфекционисты любых тем...
    Код:
    @EventHandler
        public void interact(PlayerInteractEvent e){
    if (e.getHand()!=null&&!e.getHand().equals(EquipmentSlot.HAND)){return;}//Шаманство от двойных срабатываний
    .......
    p.sendMessage(e.getAction()+"");
            if(e.getAction().equals(Action.LEFT_CLICK_AIR)||e.getAction().equals(Action.LEFT_CLICK_BLOCK)){
                ItemStack hitem=p.getInventory().getItemInMainHand();
                if(GepUtil.loreContains(hitem, ChatColor.RED+"ЗАГОТОВКА.")){
                    e.setCancelled(true);
                    if(b!=null&&b.getType().equals(Material.ANVIL)){
                        p.getWorld().playSound(p.getLocation(), Sound.BLOCK_ANVIL_USE, 2, 0.75f+r.nextFloat());
                        return;
                    }
                    TextUtil.mes(p, "&6Kingdom", "Это заготовка. Ей нельзя бить, копать, одевать, &cЕЁ НУЖНО ВЫКОВАТЬ!");
                }
            }
    В чате выводит и ЛКМ и ПКМ одновременно.
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
         @EventHandler
         public void interact(PlayerInteractEvent e) {
            //Твоя проверка где то там.
            if (hasPermission(e.getItem())) {
                e.setCancelled(true);
            }
        }
     
    Последнее редактирование: 24 июл 2020
  3. nutrolshok

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

    Баллы:
    76
    А зачем такое извращение? Не легче просто не ставить скобки?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Да тут весь код сплошное извращение. Постом ниже пофиксил)
     
  5. Автор темы
    pro100koder

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

    Баллы:
    76
    Вот интересно, вроде бы уже 3 года кодом ведра занимаюсь, не могу понять, где здесь ещё "сплошное извращение"... Я хочу совершенствоваться и понять, в чём я ошибся.
    P. S. То шаманство с кривыми скобками я тупо копирую из старых своих проектов, ибо влом разбираться. Возможно, из за этой политики я как раз и допустил какие-то "извращения", которые впритык не вижу.
    P. P. S. Не совсем понял, что вы написали в коде выше.
     
  6. MurlikMurlik

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

    Баллы:
    96
    1. Правильнее проверять предмет заранее создав его и храня где нибудь, например enum или HashMap.
    Потом получить предмет, и через метод isSimilar(предмет) сравнивать, и при полном сходстве, отменять событие и выполнять свою логику.

    2. setCancelled() стал устаревший после того, как добавили возможность отменять взаимодействие по определенному типу в событии, а именно setUseInteractedBlock(Event.Result useInteractedBlock) и setUseItemInHand(Event.Result useItemInHand). То есть можно отменить взаимодействие по нажатому блоку, не трогая в тоже время взаимодействие по предмету.

    3. В самом начале добавь это, чтобы твой плагин знал о том что кто либо уже отменил событие и обрабатывать его уже не стоит:
    Код:
    if (event.useInteractedBlock() == Result.DENY) {
    return;
    }
    if (event.useItemInHand() == Result.DENY) {
    return;
    }
    
     
  7. Автор темы
    pro100koder

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

    Баллы:
    76
    Стоит пояснить, что предметов этих огромное множество, т. к. у них часто бывают разные описания, материал и т. д. Я не смогу сделать HM с ними, а если и сделаю, это будет гораздо хуже проверки "lorecontains".
    А так, тема закрыта, спасибо большое за объяснение.
     
Статус темы:
Закрыта.

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