目前,我正在学习Java,并且我正在为Bukkit开发一个插件。这是我的问题:
我有一个事件会在玩家单击清单时触发(该事件已在Main类中注册:
注册方法
private void registerEvents() {
Bukkit.getPluginManager().registerEvents(new SendMailInventory(), this);
Bukkit.getPluginManager().registerEvents(new MailInventory(), this);
}
onEnable():
public void onEnable() {
Logger log = getLogger();
PluginDescriptionFile file = this.getDescription();
log.info(file.getName() + " Version: " + file.getVersion() + " has been enabled!");
plugin = this;
registerCommands();
registerEvents(); //here
setConfig();
}
当播放器使用命令“ / smi open”时,我将创建一个新对象来打开清单并对其进行管理。我的问题来了,我需要一种仅用于该玩家的对象来存储物品的方法,等等。就像为每个使用命令的玩家创建一个对象实例并使用创建的对象来做事情一样:
播放器a->从类的分页中有自己的对象
播放器b->从类的分页中有自己的对象
Player c->从类分页中有自己的对象
等...
所以如何将这个对象传递给事件触发的类?我做到了(但是我不认为这是最好的方法,我真的不知道):
if(args[0].equalsIgnoreCase("open")) {
Pagination pag = new Pagination(player);
MailInventory.pagList.put(player, pag);
pag.setUpInventories();
return true;
}
所以通过事件类的这种方式,我可以做到这一点:
@EventHandler
public void clickCrate(InventoryClickEvent e) {
Player player = (Player) e.getWhoClicked();
Pagination pag = pagList.get(player); //RIGHT HERE
if(!(e.getInventory().getHolder() instanceof Pagination)) {return;}
ItemStack itemInHand = e.getCurrentItem();
if(itemInHand!=null) {
if(itemInHand.getType().equals(Material.CHEST)) {
ItemMeta meta = itemInHand.getItemMeta();
int id = meta.getCustomModelData();
pag.getItemsFromCrate(id);
}
e.setCancelled(true);
}
}
分页充当InventoryHolder
我使用该类,它允许您单击它们添加任何项目和操作