Проблема с InventoryClickEvent

BlackBaroness

Модератор
Разработчик
Сообщения
1 816
Решения
79
Веб-сайт
t.me
Имею такой код (создан инвентарь с таким названием, он работает):
Java:
 @EventHandler
    public void scrollmenuuse (InventoryClickEvent e) {
        Inventory i = e.getInventory();
        if (!i.getTitle().equals(ChatColor.RED + "Редактор Свитков")) return;
        int slot = e.getSlot();
        if (slot == 0) activate();
        if (slot == 1) scrolluse();
        if (slot == 2) scrollhelp();
        e.setCancelled(true);
    }

При клике в инвентаре следующая ошибка:
Java:
[16:40:23] [Server thread/ERROR]: Could not pass event InventoryClickEvent to Baroness v1.0-SNAPSHOT
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:69) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:503) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:488) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at net.minecraft.network.NetHandlerPlayServer.func_147351_a(NetHandlerPlayServer.java:2113) [pa.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:38) [lf.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:12) [lf.class:?]
        at net.minecraft.network.PacketThreadUtil$1.run(SourceFile:13) [hv$1.class:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_241]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_241]
        at net.minecraft.util.Util.func_181617_a(Util.java:50) [h.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:845) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:472) [nz.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:782) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:636) [MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.NullPointerException
        at com.baroness.Squad.activate(Squad.java:86) ~[?:?]
        at com.baroness.Squad.scrollmenuuse(Squad.java:79) ~[?:?]
        at catserver.server.executor.asm.generated.GeneratedEventExecutor116.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:67) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        ... 15 more
 
Решение
Хм, очень странно, но на всякий случай сделай так...

Java:
if (p == null) {
    Bukkit.getConsoleSender().sendMessage("У вас несуществующий игрок пытается что-то сделать");
    return;
}
if(p.getInventory() == null) {
    p.sendMessage("Маша-растеряша, ты где свой инвентарь потерял? Вот где оставил там и ищи!!");
    return;
}
строчка 79:
Java:
if (slot == 0) activate();
activate():

Java:
public void activate() {
 if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equals(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [Чистый]")) {

        p.sendMessage(ChatColor.DARK_GREEN + "Вы успешно активировали Свиток Отряда.");

        p.sendMessage(ChatColor.RED + "Скрыто");

        p.getInventory().removeItem(p.getInventory().getItemInMainHand());

        ItemStack return_stone = new ItemStack(Material.PAPER);

        ItemMeta meta = return_stone.getItemMeta();

        meta.addEnchant(Enchantment.OXYGEN, 1, true);

        meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);

        meta.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [5/5]");

        List<String> lore = new ArrayList<>();

        lore.add(ChatColor.GREEN + "Скрыто");

        lore.add(ChatColor.GREEN + "Скрыто " + ChatColor.YELLOW + "Скрыто" + ChatColor.GREEN + ".");

        lore.add(ChatColor.RED + "Скрыто");

        meta.setLore(lore);

        return_stone.setItemMeta(meta);

        p.getInventory().addItem(return_stone);

    } else {

        p.sendMessage(ChatColor.DARK_RED + "Возьмите свиток в руку.");

    }

}
 
В этом случае стоит сделать дополнительные проверки, есть ли предмет в руке, и есть ли у него мета.
Java:
if (!p.getInventory().getItemInMainHand().hasItemMeta()) {
            p.sendMessage("error");
            return;
        }
например так?
 
Java:
public void activate() {
        if (p.getInventory().getItemInMainHand() == null) {
            svitokvruku();
            return;
        }
        if (!p.getInventory().getItemInMainHand().hasItemMeta()) {
            svitokvruku();
            return;
        }
        if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equals(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [Чистый]")) {
            p.sendMessage(ChatColor.DARK_GREEN + "Вы успешно активировали Свиток Отряда.");
            p.sendMessage(ChatColor.RED + "Если вы умрёте, свиток навсегда сотрётся в пыль!");
            p.getInventory().removeItem(p.getInventory().getItemInMainHand());
            ItemStack return_stone = new ItemStack(Material.PAPER);
            ItemMeta meta = return_stone.getItemMeta();
            meta.addEnchant(Enchantment.OXYGEN, 1, true);
            meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            meta.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [5/5]");
            List<String> lore = new ArrayList<>();
            lore.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
            lore.add(ChatColor.GREEN + "Максимальное количество использований: " + ChatColor.YELLOW + "5 раз" + ChatColor.GREEN + ".");
            lore.add(ChatColor.RED + "При смерти лидера отряда свиток безвозвратно исчезает!");
            meta.setLore(lore);
            return_stone.setItemMeta(meta);
            p.getInventory().addItem(return_stone);
        } else {
            svitokvruku();
        }
    }

    void svitokvruku() {
        p.sendMessage(ChatColor.DARK_RED + "Возьмите свиток в руку.");
    }

Java:
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:69) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:503) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:488) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at net.minecraft.network.NetHandlerPlayServer.func_147351_a(NetHandlerPlayServer.java:2113) [pa.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:38) [lf.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:12) [lf.class:?]
        at net.minecraft.network.PacketThreadUtil$1.run(SourceFile:13) [hv$1.class:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_241]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_241]
        at net.minecraft.util.Util.func_181617_a(Util.java:50) [h.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:845) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:472) [nz.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:782) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:636) [MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.NullPointerException
        at com.baroness.Squad.activate(Squad.java:86) ~[?:?]
        at com.baroness.Squad.scrollmenuuse(Squad.java:79) ~[?:?]
        at catserver.server.executor.asm.generated.GeneratedEventExecutor116.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:67) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        ... 15 more
Объединено

судя по логам, ссылается на это

Java:
        if (p.getInventory().getItemInMainHand() == null) {
            svitokvruku();
            return;
        }
 
Хм, очень странно, но на всякий случай сделай так...

Java:
if (p == null) {
    Bukkit.getConsoleSender().sendMessage("У вас несуществующий игрок пытается что-то сделать");
    return;
}
if(p.getInventory() == null) {
    p.sendMessage("Маша-растеряша, ты где свой инвентарь потерял? Вот где оставил там и ищи!!");
    return;
}
 
судя по древним писаниям в консоли "╙ трё эхёє∙хёЄтє■∙шщ шуЁюъ я√ЄрхЄё ўЄю-Єю ёфхырЄ№", игрок был нуллом
Объединено

о боже, оно заработало
я задал this.p ранее, но оно не сработало
поставил в новом месте, работает
 
Последнее редактирование:
Назад
Сверху Снизу