首页 > 解决方案 > 我的玩家获取器返回 null,尽管它设置正常

问题描述

所以我一直在尝试编写一个用于禁止、静音等的惩罚 GUI 菜单。我试图让玩家进入我的 onClick 事件,这样我就可以从那里禁止玩家,因为 GUI 决定了它的命运。我已经尝试了我所知道的一切,但我不明白为什么它给我一个空值。这是我的代码:Commands.class:

package dev.glacial.punish;

import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;

import net.minecraft.server.v1_12_R1.CommandExecute;

public class Commands extends CommandExecute implements CommandExecutor,Listener {

public BanList banlist = Bukkit.getBanList(BanList.Type.NAME);
public String cmd1 = "bantest";
public GUIMenu m = new GUIMenu();
public Events e = new Events();
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {




      Player player = (Player) sender;


      if(cmd.getName().contains(cmd1)) {

        for(Player online : Bukkit.getOnlinePlayers()) {
            System.out.println("Searching Online");
            if(online.getName().equals(args[0])) {


                m.newInventory(player);
                m.setArg(args);
                e.setPlayer(online);
                System.out.println("Found Online");
                return true; 
            }else {
                for(OfflinePlayer offp : Bukkit.getOfflinePlayers()) {
                    System.out.println("Searching Offline");
                    if(offp.getName().equals(args[0])) {

                        m.newInventory(player);
                        m.setArg(args);
                        e.setOffp(offp);
                        System.out.println("Found Offline");
                        return true;
                    }else {
                        player.sendMessage(ChatColor.RED + "Error:" + ChatColor.DARK_RED + "The player you tried to find never joined the server!");
                        System.out.println("Player never joined, Invalid Player.");
                        return true;

                    }

                }

            }

        }
      }

事件类:

    package dev.glacial.punish;

import java.sql.Date;

import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class Events implements Listener {
    public GUIMenu m = new GUIMenu();
    public BanList banlist = Bukkit.getBanList(BanList.Type.NAME);
    public Player p;
    public OfflinePlayer offp;


public void setPlayer(Player player) {
    Player p2 = player;
    p = p2;
    System.out.println("Set player:" + p2.getName());
    System.out.println("Set player:" + p.getName());


}


public Player getPlayer() {
    Player p2 = p;
    if(p2 == null) {
        System.out.println("Player Invalid");
    }

    return p;

}

public OfflinePlayer getOffp() {

    return offp;

}

public void setOffp(OfflinePlayer player) {

    offp = player;
}


@EventHandler
public void onLogin(PlayerLoginEvent event) {
    if (event.getResult() == Result.KICK_BANNED) {
        event.setKickMessage("banned");
        System.out.println(" 1");
        }

    }


@EventHandler
public void onClick(InventoryClickEvent event) {
    Player player = (Player) event.getWhoClicked();
    ClickType click = event.getClick();
    Inventory einv = event.getInventory();
    String[] args = m.getArgs();

    Player target = p;;
    OfflinePlayer oftarget = offp;

    ItemStack i = event.getCurrentItem();
    ItemMeta imeta = i.getItemMeta();
    i.setItemMeta(imeta);



   if(i == null || !i.hasItemMeta()) {
                System.out.println("Invalid Menu Item");
                return;
            }

    if(einv == null) {
        return;
    }


    if(einv.getName().equals(ChatColor.AQUA + "GlacialMC Punish GUI")) {
        System.out.println(imeta.toString());
        System.out.println(i.toString());
        event.setCancelled(true);
        System.out.println(target.getName());
        System.out.println(oftarget.getName());

        if(i.getItemMeta().getDisplayName().equals(ChatColor.RED + "Ban Hammer")) {
                if(!(target == null)) {
                    Date date = new Date(System.currentTimeMillis() + 60*60*1000);
                    banlist.addBan(target.getName(), ChatColor.RED + "Ban", date, player.getName());
                    target.kickPlayer(ChatColor.RED + "Ban");
                    System.out.println("Banned Online");

                    }else {
                        return;
                    }


                if(!(oftarget == null)) {

                        Date date = new Date(System.currentTimeMillis() + 60*60*1000);
                        banlist.addBan(oftarget.getName(), ChatColor.RED + "Ban", date, player.getName());
                        System.out.println("Banned Offline");
                    }else {
                        System.out.println("Failed to ban");
                        return;
                    }
                System.out.println("Clicked Menu Item");

        }
        System.out.println("Clicked in the Inventory");







    }











}

}

GUIMenu.class:

    package dev.glacial.punish;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class GUIMenu implements Listener {


public String[] args;
public Player p;
public OfflinePlayer offp;


public void newInventory(Player player) {

    Inventory inv = Bukkit.getServer().createInventory(null, 27, ChatColor.AQUA + "GlacialMC Punish GUI");
    ItemStack item = new ItemStack(Material.APPLE,1);
    ItemMeta imeta = item.getItemMeta();
    imeta.setDisplayName(ChatColor.RED + "Ban Hammer");
    item.setItemMeta(imeta);
    inv.setItem(15,item);
    player.openInventory(inv);
    System.out.println("Opened Inventory");





}

public ItemStack getItem1() {

    ItemStack item = new ItemStack(Material.APPLE,1);
    ItemMeta imeta = item.getItemMeta();
    imeta.setDisplayName(ChatColor.RED + "Ban Hammer");
    item.setItemMeta(imeta);
    return item;
}


public void setArg(String[] newargs) {
    this.args = newargs;
}
public String[] getArgs() {

    return this.args;
}


}

希望得到一些帮助,谢谢!

标签: javaminecraftbukkit

解决方案


如果我是你,我会采取不同的方法。不要尝试手动将此播放器添加到事件中,我认为这是一个坏主意。我通常有一个名为“DataManager”的类,其中包含一些静态字段,通常是像缓存一样工作的列表/地图。所有必须在不同类之间共享的数据都存储在那里。

在你的情况下,我会这样做:

public class DataManager {
    public static Map<UUID, UUID> punishing = new HashMap<UUID, UUID>();
}

拥有一张地图,其中存储了哪个工作人员当前正在惩罚哪个玩家。使用命令打开菜单时,您可以简单地执行

DataManager.punishing.put(player.getUniqueId(), Bukkit.getPlayer(args[0]).getUniqueId());

然后,每当您需要此信息时,您只需执行以下操作

DataManager.punishing.get("uuid of staff");

并删除它

DataManager.punishing.remove("uuid of staff");

完成并关闭库存后。


推荐阅读