Null при срабатывании события

macsik12

Пользователь
Сообщения
1
Пишу плагин на GUI для банов.
Не могу понять почему при срабатывании события inventory click в inv лежит null

BanInventory.java

Java:
package com.macsik12.bangui;


import org.bukkit.Bukkit;
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 org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;

public class BanInventory implements Listener {

    private Inventory inv;
    private Player pl;

    public BanInventory(Player player) {
        inv = Bukkit.createInventory(null, 45, "Ban GUI");
        pl = player;


        initializeItems();

    }

    public BanInventory() {

    }

    public void initializeItems() {
        ArrayList<Player> playerList = new ArrayList<>(pl.getServer().getOnlinePlayers());

        System.out.println(inv);
        for (int i = 0; i < playerList.size(); i++) {
            ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD, 1);
            ItemMeta meta = playerHead.getItemMeta();

            meta.setDisplayName(playerList.get(i).getDisplayName());
            ArrayList<String> lore = new ArrayList<>();
            lore.add(ChatColor.GOLD + "Player Health: " + playerList.get(i).getHealth());
            lore.add(ChatColor.GOLD + "EXP: " + playerList.get(i).getExp());
            meta.setLore(lore);
            playerHead.setItemMeta(meta);

            inv.addItem(playerHead);
        }
    }

    public void openInventory(Player player) {
        player.openInventory(inv);
    }

    public void openInventory() {
        pl.openInventory(inv);
    }

    @EventHandler
    public void onInventoryClick(final InventoryClickEvent e) {

        Player clicker = (Player) e.getWhoClicked();
        // ЗДЕСЬ ВСЕГДА inv == NULL и Я НЕ МОГУ ОТСЛЕДИТЬ БЫЛ ЛИ НАЖАТ ИМЕННО ИНВЕНТАРЬ БАНА
        if(e.getInventory() != inv) {
            clicker.sendMessage("No");
            return;
        };

        e.setCancelled(true);

        clicker.sendMessage("Yes");
    }

    @EventHandler
    public void onInventoryDrag(InventoryDragEvent e) {
        if(e.getInventory() == inv) {
            e.setCancelled(true);
        }
    }

}

Вот main:

Код:
package com.macsik12.bangui;

import com.macsik12.bangui.commands.BanCommand;
import org.bukkit.plugin.java.JavaPlugin;

public final class Bangui extends JavaPlugin {

    @Override
    public void onEnable() {
        // Plugin startup logic
        getCommand("bangui").setExecutor(new BanCommand());
        getServer().getPluginManager().registerEvents(new BanInventory(), this);
    }
}

И исполнитель команды:

Код:
package com.macsik12.bangui.commands;

import com.macsik12.bangui.BanInventory;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;


public class BanCommand implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        if (sender instanceof Player) {

            Player player = (Player) sender;

            BanInventory banGui = new BanInventory(player);
            banGui.openInventory();

        }

        return true;
    }
}
 
Последнее редактирование:
Решение
ты стактрейс то скинь
Авто объединение сообщений:

Я немного не понимаю что ты именно пытаешься сделать в коде, но попробуй вынести
Java:
inv = Bukkit.createInventory(null, 45, "Ban GUI");
из функции BanInventory в класс BanInventory в виде
Java:
Inventory inv = Bukkit.createInventory(null, 45, "Ban GUI");
И как это поможет? Что в конструкторе, что за его пределами определять переменную, результат один и тот же
Авто объединение сообщений:

Ну вообще как-то так:
Java:
public class MyInventory implements Listener, InventoryHolder {
    private Inventory gui;

    public MyInventory() {
        gui = Bukkit.createInventory(this, 9, "Awesome Menu");
        init();
    }

    private void init() {
        Material material = Material.GREEN_WOOL...
Я немного не понимаю что ты именно пытаешься сделать в коде, но попробуй вынести
Java:
inv = Bukkit.createInventory(null, 45, "Ban GUI");
из функции BanInventory в класс BanInventory в виде
Java:
Inventory inv = Bukkit.createInventory(null, 45, "Ban GUI");
Авто объединение сообщений:

И зачем тебе функции с одинаковыми названиями?
Авто объединение сообщений:

А так же можно попробовать сделать так
Java:
@EventHandler
public void onInventoryClick(final InventoryClickEvent e) {
    
    Player clicker = ((Player) e.getWhoClicked()).getPlayer();
    // ЗДЕСЬ ВСЕГДА inv == NULL и Я НЕ МОГУ ОТСЛЕДИТЬ БЫЛ ЛИ НАЖАТ ИМЕННО ИНВЕНТАРЬ БАНА
    if(e.getInventory() != inv) {
        clicker.sendMessage("No");
        return;
    };

    e.setCancelled(true);

    clicker.sendMessage("Yes");
}
 
ты стактрейс то скинь
Авто объединение сообщений:

Я немного не понимаю что ты именно пытаешься сделать в коде, но попробуй вынести
Java:
inv = Bukkit.createInventory(null, 45, "Ban GUI");
из функции BanInventory в класс BanInventory в виде
Java:
Inventory inv = Bukkit.createInventory(null, 45, "Ban GUI");
И как это поможет? Что в конструкторе, что за его пределами определять переменную, результат один и тот же
Авто объединение сообщений:

Ну вообще как-то так:
Java:
public class MyInventory implements Listener, InventoryHolder {
    private Inventory gui;

    public MyInventory() {
        gui = Bukkit.createInventory(this, 9, "Awesome Menu");
        init();
    }

    private void init() {
        Material material = Material.GREEN_WOOL;
        String line = "§7 Online Mode: §aEnabled";
        if (!Bukkit.getOnlineMode()) {
            material = Material.RED_WOOL;
            line = "§7 Online Mode: §cDisabled";
        }
        ItemStack stack = new ItemStack(material);
        ItemMeta meta = stack.getItemMeta();
        meta.setDisplayName(line);
        stack.setItemMeta(meta);
        gui.setItem(0, stack);
    }

    public void open(Player player) {
        player.openInventory(gui);
    }

    @EventHandler
    void onPlayerClick(InventoryClickEvent event) {
        if (event.getInventory().getHolder().equals(this)) {
            event.setCancelled(true);
        }
    }

    @Override
    public Inventory getInventory() {
        return gui;
    }
}


Java:
MyInventory inv = new MyInventory();
inv.open(player);

InventoryHolder нужен для проверки, вообще, инвентари именно с помощью него надо сравнивать, хотя я точно не помню как. Проверка по имени инвентаря - самое ужасное.
 
Последнее редактирование:
Назад
Сверху Снизу