【发布时间】:2020-01-15 10:21:57
【问题描述】:
我现在正在学习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 --> 有他自己的类分页对象
玩家 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
【问题讨论】: