2016-12-06 5 views
0

Напоминание, этот плагин сам работает, просто дает ошибки при ударе.PlayerInteractEvent нарушение при попадании Spigot

Я пытаюсь полностью изменить, как сундуки работают в minecraft. В моем плагине, когда вы открываете их, они дают вам элемент, а затем исчезают, что работает, но есть проблема.

Я вызываю PlayerInteractEvent и использую оператор if, чтобы увидеть, является ли тип блока сундуком, если он тогда будет отменять событие, заставить сундук исчезнуть и дать игроку элемент. Но поскольку основной класс передает события классу ChestRewards, он также пропускает событие удара или действие перфорации из PlayerInteractEvent, которое ожидалось, но именно поэтому я использовал оператор if только для использования переданного события, если блок Тип - сундук. Но, похоже, что ошибки в консоли не могут проходить событие, пожалуйста, помогите!

@EventHandler 
    public void catchChestOpen(PlayerInteractEvent event) { 

    Entity p = event.getPlayer(); 
    Player player = (Player) p; 

    if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.PHYSICAL || event.getAction() == Action.LEFT_CLICK_BLOCK){ 
     // TODO: 2016-12-06 Nothing 
    } 

    if (event.getClickedBlock().getType() == Material.CHEST) { 


     event.getClickedBlock().setType(Material.AIR); 

     event.setCancelled(true); 

     int rando = (int) (Math.random() * 10); 


     //--------------------------------------------------------------------------------- 
     if (rando == 1) { 
      ItemStack Axe = new ItemStack(Material.DIAMOND_AXE, 1); 
      ItemMeta meta = Axe.getItemMeta(); 
      List<String> lores = new ArrayList<String>(); 
      lores.add(ChatColor.DARK_PURPLE + "The axe of a long lost survivor"); 

      meta.setDisplayName(ChatColor.DARK_RED + "Survivor Axe"); 
      meta.addEnchant(Enchantment.DAMAGE_ALL, 2, true); 
      meta.addEnchant(Enchantment.DURABILITY, 2, true); 
      meta.setLore(lores); 
      Axe.setItemMeta(meta); 
      Axe.setDurability((short) 800); 
      player.getInventory().addItem(Axe); 
      player.sendMessage(ChatColor.GOLD + "You opened a" + ChatColor.AQUA + " RARE " + ChatColor.GOLD + "loot chest!"); 
     } 
     //--------------------------------------------------------------------------------- 
     if (rando > 1) { 
      ItemStack IronSword = new ItemStack(Material.IRON_SWORD, 1); 
      ItemMeta meta2 = IronSword.getItemMeta(); 
      List<String> lores2 = new ArrayList<String>(); 
      lores2.add(ChatColor.DARK_PURPLE + "A reliable iron sword"); 

      meta2.setDisplayName(ChatColor.DARK_RED + "Reliable Iron Sword"); 
      meta2.addEnchant(Enchantment.DURABILITY, 3, true); 
      meta2.setLore(lores2); 
      IronSword.setItemMeta(meta2); 
      IronSword.setDurability((short) 800); 
      player.getInventory().addItem(IronSword); 
      player.sendMessage(ChatColor.GOLD + "You opened a loot chest!"); 
     } 
     //--------------------------------------------------------------------------------- 



    } 
} 

Это сама ошибка

[09:32:00 ERROR]: Could not pass event PlayerInteractEvent to Apocalypse v1.0 
+1

Вы можете разместить StackTrace, который приходит после того, как сообщение «Не удалось передать PlayerInteractEvent событие Апокалипсису v1.0»? – Pokechu22

ответ

0

Поскольку вы не остановить выполнение кода, если Action не RIGHT_CLICK_BLOCK или LEFT_CLICK_BLOCK, то event.getClickedBlock() будет аннулирована, если вы звоните block.getType() на это сравнить его с сундуком, если игрок ушел или щелкнул правой рукой.

Предлагаю вам добавить чек, чтобы узнать, имеет ли действие какое-то действие с блоком. Ниже фрагмент кода будет проверить, если игрок слева или справа нажал на грудь:

if ((event.getAction() == Action.RIGHT_CLICK_BLOCK || 
    event.getAction() == Action.LEFT_CLICK_BLOCK) && 
    event.getClickedBlock().getType() == Material.CHEST) { 
+0

Хорошо, спасибо за информацию! –

+0

Работал отлично! Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^