Помогите Зарядить арбалет только конкретным снарядом

  • Автор темы Автор темы Kirpich
  • Дата начала Дата начала

Kirpich

Новичок
Пользователь
Баллы
6
Мне нужно, чтобы арбалет можно было зарядить только одним снарядом, который выдается по команде. Эту команду я настроил, но теперь не могу найти Event, который бы отслеживал зарядку арбалета.

Точнее, такой ивент есть, но для paper:
https://papermc.io/javadocs/paper/1.16/io/papermc/paper/event/entity/EntityLoadCrossbowEvent.html

Мне нужно такой же ивент, но на spigot. Ну либо как-то сделать проверку по-другому.
До того, как узнал, что это ивент для paper, хотел отслеживать с помощью него зарядку арбалета, после чего проверять лежит ли нужный фейерверк в левой руке, и если лежит, то давать зарядить арбалет, в противном случае - отменять зарядку. Хотя опять же, не знаю точно, работало ли.

Надеюсь на помощь, спасибо.
 
Мне нужно, чтобы арбалет можно было зарядить только одним снарядом, который выдается по команде. Эту команду я настроил, но теперь не могу найти Event, который бы отслеживал зарядку арбалета.

Точнее, такой ивент есть, но для paper:
https://papermc.io/javadocs/paper/1.16/io/papermc/paper/event/entity/EntityLoadCrossbowEvent.html

Мне нужно такой же ивент, но на spigot. Ну либо как-то сделать проверку по-другому.
До того, как узнал, что это ивент для paper, хотел отслеживать с помощью него зарядку арбалета, после чего проверять лежит ли нужный фейерверк в левой руке, и если лежит, то давать зарядить арбалет, в противном случае - отменять зарядку. Хотя опять же, не знаю точно, работало ли.

Надеюсь на помощь, спасибо.
Попробуй проверять CrossbowMeta в PlayerInteractEvent
 
Ну да этот ивент тебе должен подойти, там возвращает стрелу которой заряжается.
Ну а без ивента ты вообще ничего не отследишь.
 
Код:
@EventHandler
    public void booleanPatron(PlayerInteractEvent e) {
        ItemMeta itemInMainHand = e.getPlayer().getInventory().getItemInMainHand().getItemMeta();
        if (itemInMainHand.getDisplayName().equals(ChatColor.LIGHT_PURPLE + "Мушкет")) {
            if(!e.getPlayer().getInventory().getItemInOffHand().getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Пуля для Мушкета")) {
                e.setCancelled(true);
            }
        }
    }

Написал что-то такое. Это должно работать так: если игрок что-то делает, то вызывается этот ивент, после чего мы получаем мету арбалета. Если у этого предмета имя "Мушкет" (+фиолетовый цвет), то выполняется следующая проверка. Если в левой руке нет предмета, который бы содержал голубое название "Пуля для Мушкета", то отменяем зарядку.

Как вы понимаете, не работает. Где-то я ошибку допустил.
 
Код:
@EventHandler
    public void booleanPatron(PlayerInteractEvent e) {
        e.getPlayer().chat("Ивент на патрон сработал");
        ItemMeta itemInMainHand = e.getPlayer().getInventory().getItemInMainHand().getItemMeta();
        if (itemInMainHand.getDisplayName().equals(ChatColor.LIGHT_PURPLE + "Мушкет")) {
            e.getPlayer().chat("У тебя в руках мушкет (1if)");
            if(e.getPlayer().getInventory().getItemInOffHand().getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Пуля для Мушкета")) {
                e.getPlayer().chat("У тебя в руках пуля, заряжай! (2if)");
                e.setCancelled(false);
            }
            else {
                e.getPlayer().chat("У тебя в руках не пуля, отменяю зарядку (2if)");
                e.setCancelled(true);
            }
        }
    }

Теперь понял как это примерно работает, но теперь добился только такого результата. Все условия работают, так как в чат пишется, то что я написал в коде.

По крайней мере, теперь он не отменяет зарядку, если в руках есть эта пуля. Но если в руках ее нет, то else не срабатывает, так как в чат ничего не пишет, а по идее должно. Насколько понимаю это происходит, потому что когда условие получает предмет из левой руки и если в этой руке ничего нет, то и проверять нечего, из-за чего метод ничего не возвращает и конструкция if-else не работает.

Есть идеи как это исправить?
 
Да, я был прав, в этом все дело.
Как проверить то, что предмета нет в левой руке?

Если в левой руке есть, например, стрела, то все отменяется. А вот если нет предмета, тогда не работает.
 
Можешь взять инвентарь игрока и проверить какой предмет является первым (по факту его и будет заряжать). Для этого есть специальный метод в инвентаре .first(material)
Поскольку он выдаёт слот в котором находится, берём нужный предмет методом .getItem(slot) и его уже проверяем.
На сколько я помню, помимо этой проверки нужно проверять предметы в руках, ибо они являются ключевыми,
для этого есть два метода getItemInMainHand() и getItemInOffHand()
 
Можешь взять инвентарь игрока и проверить какой предмет является первым (по факту его и будет заряжать). Для этого есть специальный метод в инвентаре .first(material)
Поскольку он выдаёт слот в котором находится, берём нужный предмет методом .getItem(slot) и его уже проверяем.
На сколько я помню, помимо этой проверки нужно проверять предметы в руках, ибо они являются ключевыми,
для этого есть два метода getItemInMainHand() и getItemInOffHand()
Не, мне нужно именно в левой руке, потому что фейерверки заряжаются только так. Да тем более я уже настроил, мне нужна лишь проверка, что в левой руке нет снаряда и все.
 
Не, мне нужно именно в левой руке, потому что фейерверки заряжаются только так. Да тем более я уже настроил, мне нужна лишь проверка, что в левой руке нет снаряда и все.
Значит возьми getItemInOffHand() и проверяй
 
Я вот как раз про это. Могу я использовать getItemInOffHand() и сделать проверку равен ли он null? Будет ли это так работать?
Да, будет
Вообще, оно возвращает итемстак, поэтому любые проверки делай. Но если ничего нет, то возвращает null
 
Нет, а правда. Работает просто идеально и как надо, когда в левой руке есть какой-то предмет.
Например у меня в левой руке стрела, он начинает заряжать, после чего выстрел не происходит - задача выполнена.
Но вот если стрела не в левой руке, а просто в инвентаре, то почему-то все работает.

То есть у меня даже есть else if, при условии что в руке воздух, по идее опять же он должен отменятся, но почему-то не работает. Скидываю код, помогите пожалуйста.

Код:
@EventHandler
    public void booleanPatron(PlayerInteractEvent e) {
        ItemMeta itemInMainHand = e.getPlayer().getInventory().getItemInMainHand().getItemMeta();
        if (itemInMainHand.getDisplayName().equals(ChatColor.LIGHT_PURPLE + "Мушкет")) {
            ItemStack airitem = new ItemStack(Material.AIR, 0);
            ItemStack iteminhand = e.getPlayer().getInventory().getItemInOffHand();
            if(e.getPlayer().getInventory().getItemInOffHand().getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Пуля для Мушкета")) {
                e.setCancelled(false);
            }
            else if (iteminhand == airitem) {
                e.setCancelled(true);
            }
            else {
                e.getPlayer().chat("У тебя в руках не пуля, отменяю зарядку (2if)");
                e.setCancelled(true);
            }
        }
    }
 
Код:
            else if (iteminhand == airitem) {
                e.setCancelled(true);
            }
Глупости, оно никогда не выдаст true, итемстаки проверяются через isSimilar, но в данном случае, оно не надо. Проверяй через item.getType() == Material.AIR.
Я понять из твоих долгих текстов не могу в чём проблема. Напиши ситуацию, в которой должно работать, а в которых не надо
Ещё очень важно, если в руке ничего нет, то выдаст ошибку, изначально проверяй является ли предмет null.
Так-же, проще использовать в строках специальные символы для цветов, вместо ChatColor, по типу: "§3" - AQUA
 
Глупости, оно никогда не выдаст true, итемстаки проверяются через isSimilar, но в данном случае, оно не надо. Проверяй через item.getType() == Material.AIR.
Я понять из твоих долгих текстов не могу в чём проблема. Напиши ситуацию, в которой должно работать, а в которых не надо
Ещё очень важно, если в руке ничего нет, то выдаст ошибку, изначально проверяй является ли предмет null.
Так-же, проще использовать в строках специальные символы для цветов, вместо ChatColor, по типу: "§3" - AQUA
Итак, у меня есть мушкет (переделанный арбалет), который выдается по команде. Так как это мушкет, я не хочу, чтобы его можно было зарядить стрелами, только пулями (передаланные фейерверки). Именно так, как я писал выше я это реализую, отменяя зарядку.

Сейчас проблема в том, что это не работает, если в левой руке ничего нет. Для примера возьмем стрелу отравления, если она лежит в левой руке, все работает замечательно, зарядка отменяется. Но если эта же самая стрела будет в инвентаре, то зарядка произойдет. В этом моя проблема.

Теперь понял насчет item.getType(). Но не понял насчет предмета null. Разве такой предмет может быть в левой руке? Если ничего нет в руке, то там содержится ItemStack{AIR,1}, ну или как-то так пишется.
 
Сейчас проблема в том, что это не работает, если в левой руке ничего нет. Для примера возьмем стрелу отравления, если она лежит в левой руке, все работает замечательно, зарядка отменяется. Но если эта же самая стрела будет в инвентаре, то зарядка произойдет. В этом моя проблема.
Ну теоретически, если зарядка должна происходить только через левую руку, то делаем следующим образом:

Код:
ItemStack item = player.getInventory().getItemInOffHand();

e.setCancelled(item == null || item.getType() != Material.FIREWORK  || !item.getItemMeta().getDisplayName().equals("§3Пуля для Мушкета"));

В некоторых случаях, выдаёт null, возможно ты прав, на счёт воздуха, но я не не помню точно, возможности проверить пока нет, лишний раз обезопасить себя от ненужной ошибки не помешает.
Теперь понял насчет item.getType(). Но не понял насчет предмета null. Разве такой предмет может быть в левой руке? Если ничего нет в руке, то там содержится ItemStack{AIR,1}, ну или как-то так пишется.
 
Ну теоретически, если зарядка должна происходить только через левую руку, то делаем следующим образом:

Код:
ItemStack item = player.getInventory().getItemInOffHand();

e.setCancelled(item == null || item.getType() != Material.FIREWORK  || !item.getItemMeta().getDisplayName().equals("§3Пуля для Мушкета"));

В некоторых случаях, выдаёт null, возможно ты прав, на счёт воздуха, но я не не помню точно, возможности проверить пока нет, лишний раз обезопасить себя от ненужной ошибки не помешает.
Спасибо! Теперь работает идеально)
 
Назад
Верх