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

[Решено] Краш в GUI, если нажать по пустому месту.

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

Статус темы:
Закрыта.
  1. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Всем привет. Писал я GUI интерфейс, вроде все отлично работает, но если нажать в меню по пустому месту - выдает краш. Делал доп.проверки - но толку ноль. Что я делаю не так?

    Код самого GUI интерфейса:
    Код:
    package com.realistic.guilist;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.inventory.Inventory;
    
    import com.realistic.list.GUI_List;
    
    import net.md_5.bungee.api.ChatColor;
    
    public class GUI_mechanic implements Listener {
    
        public static void openGUI(Player p) {
    
            Inventory inv = Bukkit.createInventory(null, 45, ChatColor.BLUE + "Список крафтов вещей");
    
            inv.setItem(0, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                    ChatColor.BLUE + "--------------------------------------------------------------------",
                    ChatColor.GREEN + "Для создания предмета,",
                    ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                    ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                    ChatColor.BLUE + "--------------------------------------------------------------------"));
          
            inv.setItem(1, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                    ChatColor.BLUE + "--------------------------------------------------------------------",
                    ChatColor.GREEN + "Для создания предмета,",
                    ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                    ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                    ChatColor.BLUE + "--------------------------------------------------------------------"));
          
            inv.setItem(9, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                    ChatColor.BLUE + "--------------------------------------------------------------------",
                    ChatColor.GREEN + "Для создания предмета,",
                    ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                    ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                    ChatColor.BLUE + "--------------------------------------------------------------------"));
          
            inv.setItem(10, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                    ChatColor.BLUE + "--------------------------------------------------------------------",
                    ChatColor.GREEN + "Для создания предмета,",
                    ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                    ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                    ChatColor.BLUE + "--------------------------------------------------------------------"));
    
          
          
            inv.setItem(39, GUI_List.create(Material.BARRIER, ChatColor.RED + "Закрыть помощь крафт вещей."));
            inv.setItem(41, GUI_List.create(Material.SIGN, ChatColor.GREEN + "Перейти на страницу помощи по выживанию."));
            inv.setItem(40, GUI_List.create(Material.SIGN, ChatColor.GREEN + "Перейти на страницу крафтов медикаментов."));
    
            inv.setItem(38, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
            inv.setItem(42, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
    
            inv.setItem(29, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 5, " "));
            inv.setItem(30, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
            inv.setItem(31, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 5, " "));
            inv.setItem(32, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
            inv.setItem(33, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 5, " "));
    
            p.openInventory(inv);
        }
    }
    
    Код API
    Код:
    package com.realistic.list;
    
    import java.util.ArrayList;
    
    import org.bukkit.Material;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    
    public class GUI_List {
    
        public static ItemStack create(Material material, int amount, byte metadata, String name, String lore1,
                String lore2, String lore3, String lore4, String lore5) {
    
            ItemStack item = new ItemStack(material, amount, metadata);
            ItemMeta meta = item.getItemMeta();
    
            if (name != null) {
                meta.setDisplayName(name);
            }
    
            ArrayList<String> lore = new ArrayList<String>();
    
            if (lore1 != null) {
                lore.add(lore1);
            }
            if (lore2 != null) {
                lore.add(lore2);
            }
            if (lore3 != null) {
                lore.add(lore3);
            }
            if (lore4 != null) {
                lore.add(lore4);
            }
            if (lore5 != null) {
                lore.add(lore5);
            }
            meta.setLore(lore);
            item.setItemMeta(meta);
    
            return item;
        }
    
        public static ItemStack create(Material material, String name) {
    
            return create(material, 1, (byte) 0, name, null, null, null, null, null);
        }
    
        public static ItemStack create(Material material, int amount, byte metadata, String name) {
    
            return create(material, amount, metadata, name, null, null, null, null, null);
        }
    }
    
    Сам краш:
    Код:
    19:57:26 ERROR]: Could not pass event InventoryClickEvent to Realistic v1.4 beta
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1630) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:31) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:9) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [server.jar:git-Spigot-db6de12-18fbb24]
            at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_101]
            at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_101]
            at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [server.jar:git-Spigot-db6de12-18fbb24]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
    Caused by: java.lang.NullPointerException
            at com.realistic.events.GUI_Handler.GUI_guide(GUI_Handler.java:28) ~[?:?]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_101]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_101]
            at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_101]
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[server.jar:git-Spigot-db6de12-18fbb24]
            ... 15 more
    >
     
  2. Хостинг MineCraft
    <
  3. Mr_RoboMan

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

    Баллы:
    123
    А я читать еще до первого класса умел...
    Какой я способный оказывается, видимо это не всем дано...
    Код:
            at com.realistic.events.GUI_Handler.GUI_guide(GUI_Handler.java:28) ~[?:?]
     
  4. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    умри.
    У тебя ругается на код в классе Gui_Handler. Добавь проверку if (event.getCurrentItem() == null) { return};
     
  5. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Именно я добавлял, но все равно краш
    Я просто импортировал через комбинацию, не заметил.
     
  6. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    так ты скинь нужный класс.
     
  7. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Код:
    package com.realistic.events;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    
    import com.realistic.api.API;
    
    public class GUI_Handler implements Listener {
    
        private API plugin;
    
        public GUI_Handler(API plugin) {
            this.plugin = plugin;
        }
    
        @EventHandler
        public void GUI_guide(InventoryClickEvent e) {
    
            Player p = (Player) e.getWhoClicked();
    
            if (e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Помощь по выживанию")) {
                e.setCancelled(true);
    
                if (e.getCurrentItem().getItemMeta().getDisplayName() != null) {
    
                    if (e.getCurrentItem().getType() == Material.BARRIER) {
                        p.closeInventory();
                    }
    
                    if (e.getCurrentItem().getItemMeta().getDisplayName()
                            .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов.")
                            && e.getCurrentItem().getType() == Material.SIGN) {
    
                        p.closeInventory();
                        //GUI_mechanic.openGUI(p);
                    }
    
                    if (e.getCurrentItem().getItemMeta().getDisplayName()
                            .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов медикаментов.")
                            && e.getCurrentItem().getType() == Material.SIGN) {
    
                        p.closeInventory();
                        //GUI_medicine.openGUI(p);
                    }
                   
                    if(e.getCurrentItem() == null) {
                        p.closeInventory();
                    }
                }
            }
        }
    }
     
  8. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    ну нет... Это нормально делать проверки в самом конце?
     
  9. Mr_RoboMan

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

    Баллы:
    123
    Блyaaaat...
    Ты сначало работаешь с айтемом который может быть null, а потом проверяешь его на null...
    Это не программирование, это тупо логика... Которой у кое-кого НЕТ...
     
  10. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Поставил в самое начале - краш
     
  11. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Сделал так:

    if(!e.getCurrentItem().hasItemMeta()) {
    p.closeInventory();
    }

    Действие выполняется, но краш появляется
     
  12. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    а return; значит не надо?
     
  13. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Просто так я проверяю, а работает ли?
     
  14. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
        @EventHandler
        public void GUI_guide(InventoryClickEvent e) {
            Player p = (Player) e.getWhoClicked();
            if (!e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Помощь по выживанию")) {
                return;
            }
            e.setCancelled(true);
            if(e.getCurrentItem() == null) {
                return;
            }
            if (!e.getCurrentItem().hasItemMeta()) {
                return;
            }
            if (e.getCurrentItem().getItemMeta().getDisplayName().isEmpty()) {
                return;
            }
            if (e.getCurrentItem().getType() == Material.BARRIER) {
                p.closeInventory();
                return;
            }
            if (e.getCurrentItem().getItemMeta().getDisplayName()
                    .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов.")
                    && e.getCurrentItem().getType() == Material.SIGN) {
    
                p.closeInventory();
                //GUI_mechanic.openGUI(p);
                return;
            }
            if (e.getCurrentItem().getItemMeta().getDisplayName()
                    .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов медикаментов.")
                    && e.getCurrentItem().getType() == Material.SIGN) {
    
                p.closeInventory();
                //GUI_medicine.openGUI(p);
                return;
            }
    
        }
     
  15. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Спасибо, учел свои ошибки. Тема закрыта.
     
Статус темы:
Закрыта.

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