java - 我的玩家获取器返回 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;
}
}
希望得到一些帮助,谢谢!
解决方案
如果我是你,我会采取不同的方法。不要尝试手动将此播放器添加到事件中,我认为这是一个坏主意。我通常有一个名为“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");
完成并关闭库存后。
推荐阅读
- java - 如何在不同表中没有重复记录的情况下进行休眠保存
- testing - VSTS:从工作部分添加的测试用例在测试部分中不可用
- php - 如何确定可变日期php的前一个月
- node.js - NodeJs Express 错误处理程序到 json
- html - MaterializeCSS,如何使复选框居中
- javascript - 向函数内的对象添加值
- css - 如何列出一系列包含相同属性的类并为每个类分配不同的 z-index
- css - 使用 Material UI 持久抽屉正确推送画布
- python - 计算列值的 Django-tables2 页脚总和
- wordpress - 如何修复 WordPress 多站点网络上的内部服务器错误?