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

Статус
Закрыто для дальнейших ответов.

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ЕЁ НУЖНО ВЫКОВАТЬ!");
            }
        }
В чате выводит и ЛКМ и ПКМ одновременно.
 
Код:
     @EventHandler
     public void interact(PlayerInteractEvent e) {
        //Твоя проверка где то там.
        if (hasPermission(e.getItem())) {
            e.setCancelled(true);
        }
    }
 
Последнее редактирование:
Да тут весь код сплошное извращение. Постом ниже пофиксил)
Вот интересно, вроде бы уже 3 года кодом ведра занимаюсь, не могу понять, где здесь ещё "сплошное извращение"... Я хочу совершенствоваться и понять, в чём я ошибся.
P. S. То шаманство с кривыми скобками я тупо копирую из старых своих проектов, ибо влом разбираться. Возможно, из за этой политики я как раз и допустил какие-то "извращения", которые впритык не вижу.
P. P. S. Не совсем понял, что вы написали в коде выше.
 
Вот интересно, вроде бы уже 3 года кодом ведра занимаюсь, не могу понять, где здесь ещё "сплошное извращение"... Я хочу совершенствоваться и понять, в чём я ошибся.
P. S. То шаманство с кривыми скобками я тупо копирую из старых своих проектов, ибо влом разбираться. Возможно, из за этой политики я как раз и допустил какие-то "извращения", которые впритык не вижу.
P. P. S. Не совсем понял, что вы написали в коде выше.
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;
}
 
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;
}
Стоит пояснить, что предметов этих огромное множество, т. к. у них часто бывают разные описания, материал и т. д. Я не смогу сделать HM с ними, а если и сделаю, это будет гораздо хуже проверки "lorecontains".
А так, тема закрыта, спасибо большое за объяснение.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх