【问题标题】:Passing object to an event将对象传递给事件
【发布时间】: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

【问题讨论】:

    标签: java bukkit


    【解决方案1】:

    我使用这个类,它允许您在点击时添加任何项目和操作

    public class GUI implements InventoryHolder {
    
        static {
            Bukkit.getPluginManager().registerEvents(new Listener() {
                @EventHandler
                public void onClick(InventoryClickEvent e) {
                    if (e.getInventory().getHolder() instanceof GUI) {
                        ((GUI) e.getInventory().getHolder()).onInventoryClick(e);
                    }
                }
    
            }, Plugin.getInstance());
        }
    
        private final Inventory inv;
        private final Map<Integer, InventoryAction> runnableMap = new HashMap<>();
    
        public void open(Player player) {
            Utils.runSyncTask(() -> player.openInventory(getInventory()));
        }
    
        public GUI(String title, int rows) {
            if (Bukkit.isPrimaryThread())
                inv = Bukkit.createInventory(this, 9 * rows, title);
            else {
                try {
                    inv = Bukkit
                            .getScheduler()
                            .callSyncMethod(
                                    Plugin.getInstance(),
                                    () -> Bukkit.createInventory(GUI.this, 9 * rows, title))
                            .get();
                } catch (InterruptedException | ExecutionException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    
        public GUI(String title) {
            this(title, 6);
        }
    
    
        public void clear() {
            inv.clear();
            runnableMap.clear();
        }
    
        @Override
        public Inventory getInventory() {
            return inv;
        }
    
        public void addItem(int slot, ItemStack item, InventoryAction runnable) {
            inv.setItem(slot, item);
            runnableMap.put(slot, runnable);
        }
    
        public void removeItem(int slot) {
            inv.clear(slot);
            runnableMap.remove(slot);
        }
    
    
    
        public void onInventoryClick(InventoryClickEvent e) {
            e.setCancelled(true);
            if (e.getClickedInventory() == null || e.getClickedInventory().getHolder() != this)
                return;
            InventoryAction action = runnableMap.get(e.getSlot());
            if (action == null)
                return;
            switch (e.getClick()) {
                case LEFT:
                    action.click((Player) e.getWhoClicked());
                    break;
                case RIGHT:
                    action.rightClick((Player) e.getWhoClicked());
                    break;
                case SHIFT_LEFT:
                    action.shiftClick((Player) e.getWhoClicked());
                    break;
            }
        }
    
        public static class InventoryAction {
            private final Consumer<Player> click, rightClick, shiftClick;
    
            public InventoryAction(Consumer<Player> click) {
                this(click, null, null);
            }
    
            public InventoryAction(Consumer<Player> click, Consumer<Player> rightClick, Consumer<Player> shiftClick) {
                this.click = click;
                this.rightClick = rightClick;
                this.shiftClick = shiftClick;
            }
    
            public void click(Player p) {
                click.accept(p);
            }
    
            public void rightClick(Player p) {
                if (rightClick != null) {
                    rightClick.accept(p);
                }
            }
    
            public void shiftClick(Player p) {
                if (shiftClick != null) {
                    shiftClick.accept(p);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多