Bukkit跑酷服务器GUI翻页全服同步更新,如何实现单玩家库存独立更新?
问题根因
你当前代码中的basicInv是全局共享的Inventory实例,所有玩家打开的都是同一个内存对象,你修改这个实例的内容时,所有打开这个实例的玩家客户端都会同步收到更新,自然就会出现跨玩家同步翻页的问题。
你之前设置owner后GUI为空的问题是因为你创建了绑定owner的实例后没有对应为每个玩家单独初始化该实例的内容。
修复方案
步骤1:移除全局共享的Inventory实例
删掉类中全局声明的Inventory basicInv = Bukkit.createInventory(null, 54, "Basic Jumps");代码,不要在类成员位置创建全局共享的GUI实例。
步骤2:每个玩家打开GUI时创建独立实例
把打开GUI的逻辑改成每次玩家触发打开时,单独为当前玩家创建新的Inventory对象:
// 原逻辑里的player.openInventory(basicInv);替换成下面的代码 Inventory playerBasicInv = Bukkit.createInventory(player, 54, "Basic Jumps"); basicInventorySet1(player, playerBasicInv); player.openInventory(playerBasicInv);
步骤3:修改翻页逻辑,操作当前玩家自己的Inventory实例
翻页的分支里不要用全局的basicInv,改为操作当前点击事件关联的Inventory对象:
case "Basic Jumps": Inventory currentInv = event.getClickedInventory(); if (event.getCurrentItem().getItemMeta().getDisplayName().equals(pg2Name)) { event.setCancelled(true); basicInventorySet2(player, currentInv); } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(pg1Name)) { event.setCancelled(true); basicInventorySet1(player, currentInv); } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(pg3Name)) { event.setCancelled(true); basicInventorySet3(player, currentInv); } break;
步骤4:确认Inventory初始化方法适配独立实例
检查basicInventorySet1/2/3方法,确保逻辑是直接修改传入的Inventory对象,不要在方法内部引用全局的basicInv实例即可。
修复后核心逻辑示例
@EventHandler public void clickInv(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); if (event.getClickedInventory() == null) return; if (event.getCurrentItem() == null || event.getCurrentItem().getItemMeta() == null) return; String displayName = event.getCurrentItem().getItemMeta().getDisplayName(); if (displayName == null) return; event.setCancelled(true); if (displayName.equals(" ")) return; switch (event.getClickedInventory().getName()) { case "OneJump Menu": if (displayName.equals(basicName) && event.getCurrentItem().getItemMeta().getLore().equals(Collections.singletonList(ChatColor.GRAY + "Includes very historical and original jumps."))) { // 每个玩家打开时创建独立实例 Inventory playerBasicInv = Bukkit.createInventory(player, 54, "Basic Jumps"); basicInventorySet1(player, playerBasicInv); player.openInventory(playerBasicInv); plugin.getPlayerConfig().set("Player." + player.getUniqueId() + ".PlayingJumpType", "basicjump"); plugin.savePlayerConfig(); } else if (!displayName.equals(DisplayName) && !displayName.equals(basicName)) { player.closeInventory(); sendMessage(player, "§cComing soon!", "현재 개발 중입니다!"); } break; case "Basic Jumps": Inventory currentInv = event.getClickedInventory(); if (displayName.equals(pg2Name)) { basicInventorySet2(player, currentInv); } else if (displayName.equals(pg1Name)) { basicInventorySet1(player, currentInv); } else if (displayName.equals(pg3Name)) { basicInventorySet3(player, currentInv); } break; } }
内容的提问来源于stack exchange,提问作者Libration
相关产品推荐
相关产品推荐

