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.