You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:06:07