Помогите Не берется предмет из наковальни.

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

Slavkaa

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Slavok2001
Доброго времени суток, столкнулся с такой проблемой: хотел при скрещивании двух вещей получать первую вещь с лором(типа кастомный чар).
Код максимально примитивный, вещь появляется в слоте, но взять ее не получается.
PHP:
@EventHandler
public void prepareAnvil(PrepareAnvilEvent e) {
   AnvilInventory inventory = e.getInventory();
   if(inventory.getItem(0) == null || inventory.getItem(1) == null) return;
   ItemStack firstItem = inventory.getItem(0);
   ItemStack secondItem = inventory.getItem(1);
   if(secondItem.getType() == Material.ARROW) {
      ItemStack resultItem = firstItem.clone();
      ItemMeta meta = resultItem.getItemMeta();
      meta.setDisplayName("§cTest");
      resultItem.setItemMeta(meta);
      inventory.setRepairCost(1);
      e.setResult(resultItem);
   }
}
 
Похоже, это что-то со стороны клиента, аля невозможный "рецепт" для наковальни(либо я просто тормоз, что тоже не маловероятно)
Как вариант - сделать костыль в виде ещё одного ивента InventoryClickEvent, который будет устанавливать в руке игрока нужный предмет и удалять предметы из наковальни.
Что-то вроде этого, в общем. Требуется ещё сымитировать проверку на количеству опыта, его сбор и т.п.
Код:
@EventHandler
public void onInventoryClick(InventoryClickEvent e){
    if (e.getInventory() instanceof AnvilInventory) {
        AnvilInventory inv=(AnvilInventory) e.getInventory();
        if (e.getSlotType()!=InventoryType.SlotType.RESULT) return;
        HumanEntity human=e.getWhoClicked();
        ItemStack item1 = inv.getItem(0);
        ItemStack item2 = inv.getItem(1);
        if (item1!=null && item2!=null && item2.getType()==Material.ARROW && human.getItemOnCursor()==null){
            ItemStack result=item1.clone();
            ItemMeta meta = result.getItemMeta();
            meta.setDisplayName("§cTest");
            result.setItemMeta(meta);
            e.getInventory().setItem(0, null);
            e.getInventory().setItem(1, null);
            e.getInventory().setItem(2, null);
            human.setItemOnCursor(result);
        }
    }
}
 
Похоже, это что-то со стороны клиента, аля невозможный "рецепт" для наковальни(либо я просто тормоз, что тоже не маловероятно)
Как вариант - сделать костыль в виде ещё одного ивента InventoryClickEvent, который будет устанавливать в руке игрока нужный предмет и удалять предметы из наковальни.
Что-то вроде этого, в общем. Требуется ещё сымитировать проверку на количеству опыта, его сбор и т.п.
Код:
@EventHandler
public void onInventoryClick(InventoryClickEvent e){
    if (e.getInventory() instanceof AnvilInventory) {
        AnvilInventory inv=(AnvilInventory) e.getInventory();
        if (e.getSlotType()!=InventoryType.SlotType.RESULT) return;
        HumanEntity human=e.getWhoClicked();
        ItemStack item1 = inv.getItem(0);
        ItemStack item2 = inv.getItem(1);
        if (item1!=null && item2!=null && item2.getType()==Material.ARROW && human.getItemOnCursor()==null){
            ItemStack result=item1.clone();
            ItemMeta meta = result.getItemMeta();
            meta.setDisplayName("§cTest");
            result.setItemMeta(meta);
            e.getInventory().setItem(0, null);
            e.getInventory().setItem(1, null);
            e.getInventory().setItem(2, null);
            human.setItemOnCursor(result);
        }
    }
}
Думал о таком варианте, но искал способ без костылей. Спасибо, попробую.
 
Назад
Верх