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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Kirpich, 6 мар 2022.

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

    Kirpich Новичок Пользователь

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

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

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

    Надеюсь на помощь, спасибо.
     
  2. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Попробуй проверять CrossbowMeta в PlayerInteractEvent
     
  3. alexandrage

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

    Баллы:
    173
    Ну да этот ивент тебе должен подойти, там возвращает стрелу которой заряжается.
    Ну а без ивента ты вообще ничего не отследишь.
     
  4. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Код:
    @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);
                }
            }
        }
    Написал что-то такое. Это должно работать так: если игрок что-то делает, то вызывается этот ивент, после чего мы получаем мету арбалета. Если у этого предмета имя "Мушкет" (+фиолетовый цвет), то выполняется следующая проверка. Если в левой руке нет предмета, который бы содержал голубое название "Пуля для Мушкета", то отменяем зарядку.

    Как вы понимаете, не работает. Где-то я ошибку допустил.
     
  5. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Код:
    @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 не работает.

    Есть идеи как это исправить?
     
  6. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

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

    Если в левой руке есть, например, стрела, то все отменяется. А вот если нет предмета, тогда не работает.
     
  7. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Можешь взять инвентарь игрока и проверить какой предмет является первым (по факту его и будет заряжать). Для этого есть специальный метод в инвентаре .first(material)
    Поскольку он выдаёт слот в котором находится, берём нужный предмет методом .getItem(slot) и его уже проверяем.
    На сколько я помню, помимо этой проверки нужно проверять предметы в руках, ибо они являются ключевыми,
    для этого есть два метода getItemInMainHand() и getItemInOffHand()
     
  8. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Не, мне нужно именно в левой руке, потому что фейерверки заряжаются только так. Да тем более я уже настроил, мне нужна лишь проверка, что в левой руке нет снаряда и все.
     
  9. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Значит возьми getItemInOffHand() и проверяй
     
  10. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Я вот как раз про это. Могу я использовать getItemInOffHand() и сделать проверку равен ли он null? Будет ли это так работать?
     
  11. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Да, будет
    Вообще, оно возвращает итемстак, поэтому любые проверки делай. Но если ничего нет, то возвращает null
     
  12. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Круто, спасибо, буду пробовать)
     
  13. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Нет, а правда. Работает просто идеально и как надо, когда в левой руке есть какой-то предмет.
    Например у меня в левой руке стрела, он начинает заряжать, после чего выстрел не происходит - задача выполнена.
    Но вот если стрела не в левой руке, а просто в инвентаре, то почему-то все работает.

    То есть у меня даже есть 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);
                }
            }
        }
     
  14. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Глупости, оно никогда не выдаст true, итемстаки проверяются через isSimilar, но в данном случае, оно не надо. Проверяй через item.getType() == Material.AIR.
    Я понять из твоих долгих текстов не могу в чём проблема. Напиши ситуацию, в которой должно работать, а в которых не надо
    Ещё очень важно, если в руке ничего нет, то выдаст ошибку, изначально проверяй является ли предмет null.
    Так-же, проще использовать в строках специальные символы для цветов, вместо ChatColor, по типу: "§3" - AQUA
     
  15. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Итак, у меня есть мушкет (переделанный арбалет), который выдается по команде. Так как это мушкет, я не хочу, чтобы его можно было зарядить стрелами, только пулями (передаланные фейерверки). Именно так, как я писал выше я это реализую, отменяя зарядку.

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Ну теоретически, если зарядка должна происходить только через левую руку, то делаем следующим образом:

    Код:
    ItemStack item = player.getInventory().getItemInOffHand();
    
    e.setCancelled(item == null || item.getType() != Material.FIREWORK  || !item.getItemMeta().getDisplayName().equals("§3Пуля для Мушкета"));
    В некоторых случаях, выдаёт null, возможно ты прав, на счёт воздуха, но я не не помню точно, возможности проверить пока нет, лишний раз обезопасить себя от ненужной ошибки не помешает.
     
  17. Автор темы
    Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Спасибо! Теперь работает идеально)
     

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