java - 我可以在另一个 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
解决方案
在您的情况下,您将创建一个库存,并为每个人使用它。所以玩家每次打开物品栏,都会打开“共享”物品栏。
你正在这样做:
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
}
每次您打开新库存时,都会创建一个新实例。
推荐阅读
- python - 如何拆分用户输入列表
- sass - SASS - 将 $variable 从@mixin 中传递给@content
- c# - 如何使用 C# 保存网络凭据
- php - 如何在表单中强制使用谷歌验证码
- java - Hibernate:三级缓存
- c# - 剑道网格下拉列表不起作用
- android - firebase:如何链接电子邮件验证和密码
- hashicorp-vault - Vault approle auth 强制使用默认策略
- node.js - 从 Node.js 请求中获取 React 中的图像
- vb6 - Visual Basic 6.0 中的 eMode 是什么?它如何与记录集相关联?