简体   繁体   中英

Can I make the inventory to be updated when clicking the item in another GUI, individually?

I'm making a GUI for my parkour server, but I have a problem:

在此处输入图片说明

( YT link , can expire)

As you can see, other player's GUI also updated when I click next page.

I also tried set the owner of Inventory not to be null (so individually), but it just showed the mpty GUI.

How can I fix this? I searched a lot and tried lots of thing but couldn't find the answer.

// 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;
    }

}

Full source: BasicInv.java OjMenu.java

In your case, you are create ONE inventory, and using it for EVERYONE. So each time that the player open the inventory, it will open the "shared" inventory.

You are doing this:

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

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

So everything will using same instance.

In your first code example, that was better :

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
}

That will create a new instance each time that you will open a new inventory.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM