Хостинг серверов Minecraft playvds.com
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Криво работает InventoryClickEvent

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

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

    Amafauz Ньюби

    Баллы:
    1
    Здравствуйте, появилась проблема. Есть InventoryClickEvent, в нём есть currentItem. Этот currentItem == голова с owner`ом. Мне нужно достать из него этого самого овнера.. Но проблема в том, что в нём нет этого овнера! Тупо приходит ItemStack без SkullMeta но с ItemMeta

    P.S -
    #1 =
    Код:
    ItemStack testStack = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
                    SkullMeta meta = (SkullMeta) testStack.getItemMeta();
                    meta.setOwningPlayer(Bukkit.getOfflinePlayer(clan.getOwner()));
                    testStack.setItemMeta(meta);
                  
                    inv.setItem(10, testStack);
    # 2 =
    Код:
    @EventHandler
        public void onClick(InventoryClickEvent e) {
            if (e.getWhoClicked() instanceof Player) {
                Player p = (Player) e.getWhoClicked();
                ItemStack curr = e.getCurrentItem();
                Inventory inv = e.getClickedInventory();
              
                if (curr == null || inv == null)
                    return;
    
                if (curr.getType() == Material.AIR || inv.getHolder() == null)
                    return;
    
                if (inv.getHolder() instanceof ClanInventoryHolder) {
                    e.setCancelled(true);
                  
                    if (isHead(curr)) {
                        String name = getHeadName(curr);
                        System.out.println(name);
                    }
                }
            }
        }
    #3 =
    Код:
    private boolean isHead(ItemStack stack) {
            if (stack != null && stack.getType() != Material.AIR) {
                if (stack.getType() == Material.SKULL_ITEM
                        && stack.getDurability() == 3) {
                    SkullMeta meta = (SkullMeta) stack.getItemMeta();
    
                    if (meta == null)
                        return false;
    
                    if (!meta.hasOwner())
                        return false;
    
                    if (meta.getOwningPlayer() == null)
                        return false;
    
                    if (meta.getOwningPlayer().getName() == null)
                        return false;
    
                    if (meta.getOwningPlayer().getName().isEmpty())
                        return false;
    
                    return true;
                }
            }
    
            return false;
        }
    
        private String getHeadName(ItemStack stack) {
            if (!isHead(stack))
                return "";
    
            SkullMeta meta = (SkullMeta) stack.getItemMeta();
    
            return meta.getOwningPlayer().getName();
        }
    В итоге isHead возращает false...
     
  2. Mr Hosting
  3. Автор темы
    Amafauz

    Amafauz Ньюби

    Баллы:
    1
  4. Vladis086

    Vladis086 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Vladis086
    По-моему у тебя слишком много лишнего кода, но это не в тему.
    У меня все отлично проверяет так:

    Код:
    @EventHandler
    public void onClick(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        Inventory inv = e.getClickedInventory();
        ItemStack clicked = e.getCurrentItem();
        if (clicked.getType() != null && clicked.getType() != Material.AIR) {
            if (clicked.getType() == Material.SKULL_ITEM && clicked.getDurability() == 3) {
                SkullMeta meta = (SkullMeta) clicked.getItemMeta();
                String name = meta.getOwningPlayer().getName();
                p.sendMessage("Owner= " + name);
            }
        }
    
    }
    
    Единственное подмечу - нужно добавить функцию уже из твоего плагина на проверку ClanInventoryHolder, получится такой код:

    Код:
       @EventHandler
        public void onClick(InventoryClickEvent e) {
            Player p = (Player) e.getWhoClicked();
            Inventory inv = e.getClickedInventory();
            ItemStack clicked = e.getCurrentItem();
            if (clicked.getType() != null && clicked.getType() != Material.AIR) {
                if (clicked.getType() == Material.SKULL_ITEM && clicked.getDurability() == 3) {
                    if (!(inv.getHolder() instanceof ClanInventoryHolder)) {
                        SkullMeta meta = (SkullMeta) clicked.getItemMeta();
                        String name = meta.getOwningPlayer().getName();
                        p.sendMessage("Owner =" + name);
                    }
                }
    
            }
        }
    }
    
     
    Последнее редактирование: 12 янв 2019 в 18:21

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