首页 > 解决方案 > 我可以在另一个 GUI 中单独单击项目时更新库存吗?

问题描述

我正在为我的跑酷服务器制作一个 GUI,但我有一个问题:

在此处输入图像描述

YT 链接,可能过期)

如您所见,当我单击下一页时,其他播放器的 GUI 也会更新。

我还尝试将 Inventory 的所有者设置为不为空(如此单独),但它只显示了 mpty GUI。

我怎样才能解决这个问题?我搜索了很多,尝试了很多东西,但找不到答案。

// the showed inventory
Inventory basicInv = Bukkit.createInventory(null, 54, "Basic Jumps");

@EventHandler
public void clickInv(InventoryClickEvent event) {

    Player player = (Player) event.getWhoClicked();

    if (event.getClickedInventory() == null) return;

    if (event.getCurrentItem() == null) return;
    if (event.getCurrentItem().getItemMeta() == null) return;
    if (event.getCurrentItem().getItemMeta().getDisplayName() == null) return;

    if (event.getCurrentItem().getItemMeta().getDisplayName().equals(" ")) {
        event.setCancelled(true);
    }

    switch (event.getClickedInventory().getName()) {
        case "OneJump Menu":
            if (event.getCurrentItem().getItemMeta().getDisplayName().equals(basicName)
                    && event.getCurrentItem().getItemMeta().getLore().equals(Collections.singletonList(ChatColor.GRAY + "Includes very historical and original jumps."))) {
                player.openInventory(basicInv);
                basicInventorySet1(player, basicInv);
                event.setCancelled(true);

                plugin.getPlayerConfig().set("Player." + player.getUniqueId() + ".PlayingJumpType", "basicjump");
                plugin.savePlayerConfig();
            } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(DisplayName)
                    || event.getCurrentItem().getItemMeta().getDisplayName().equals(basicName)) {
                event.setCancelled(true);
            } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(" ")) {
                event.setCancelled(true);
            } else {
                event.setCancelled(true);
                player.closeInventory();
                sendMessage(player, "§cComing soon!", "현재 개발 중입니다!");
            }
            break;
        case "Basic Jumps":
            if (event.getCurrentItem().getItemMeta().getDisplayName().equals(pg2Name)) {
                event.setCancelled(true);
                basicInventorySet2(player, basicInv);
            } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(pg1Name)) {
                event.setCancelled(true);
                basicInventorySet1(player, basicInv);
            } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(pg3Name)) {
                event.setCancelled(true);
                basicInventorySet3(player, basicInv);
            }
            break;
    }

}

完整来源:BasicInv.java OjMenu.java

标签: javaminecraft

解决方案


在您的情况下,您将创建一个库存,并为每个人使用它。所以玩家每次打开物品栏,都会打开“共享”物品栏。

你正在这样做:

Inventory inv = Bukkit.createInventory(null, 54, "Inventory"); // create one instance

public void show(Player p) {
   p.openInventory(inv); // everyone open same inventory instance
}

所以一切都将使用相同的实例。

在您的第一个代码示例中,这更好:

public Inventory createInventory() {
   return Bukkit.createInventory(null, 54, "Inventory"); // create a new inventory
}

public void showBasicJump(Player p) { // show an inventory to the given player
   Inventory myInv = createInventory(); // create a new inv, for thi splayer
   myInv.setItem(0, new ItemStack(Material.STICK); // set item
   basicInventorySet1(player, myInv); // call your method that change all items
   p.openInventory(myInv); // final inventory
}

public void updateBasicJumpInv(InventoryClickEvent e, Player player) { // before this, you made all check about inv
   Inventory openInv = e.getClickedInventory(); // get the current opened inv. Can also work with player.getOpenInventory()
   basicInventorySet1(player, openInv);
   p.updateInventory(); // update player inv
}

每次您打开新库存时,都会创建一个新实例。


推荐阅读