返回

Forge GUI物品移动错误:全面指南,轻松解决物品获取问题

java

Forge GUI物品移动错误修复:全面指南

引言

在 Forge 1.20.2 中使用自定义 GUI 时,点击 GUI 中的物品会导致玩家错误地获取物品。此外,点击下一个或上一个按钮时会产生错误,提示“Index 59 out of bounds for length 54”。本文将详细介绍此错误的解决方案,并提供其他相关信息。

问题概述

此错误源于 Forge 中处理 GUI 物品移动的方式。在某些情况下,点击 GUI 中的物品可能会错误地触发 quickMoveStack 方法,该方法通常用于快速移动物品到玩家的物品栏中。此外,AbstractContainerMenu 的 clicked 方法也可能处理不当,导致点击下一个或上一个按钮时出现错误。

解决方案

要解决此错误,需要执行以下步骤:

1. 确保未重写 quickMoveStack 方法

默认情况下,quickMoveStack 方法应返回一个空 ItemStack。如果您已重写此方法,请将其恢复为默认实现,如下所示:

public ItemStack quickMoveStack(Player player, int index) {
    return ItemStack.EMPTY;
}

2. 更新 AbstractContainerMenu 的方法

确保已正确更新 AbstractContainerMenu 的 clicked 方法,以处理点击事件。以下是更新后的方法:

public void clicked(int slotId, int dragType, ClickType clickType, Player playerEntity) {
    if (!playerEntity.level().isClientSide) {
        if (slotId >= this.container.getContainerSize())
            return;
        ItemStack clickedItem = this.container.getItem(slotId);
        GUIConfigManager.GUIConfig guiConfig = this.guiConfigManager.guiConfigs.get(this.guiConfigKey);
        ItemStack nextButtonItemStack = (guiConfig.nextButton != null) ? createButtonStack(guiConfig.nextButton) : ItemStack.EMPTY;
        ItemStack backButtonItemStack = (guiConfig.backButton != null) ? createButtonStack(guiConfig.backButton) : ItemStack.EMPTY;
        boolean isNextButton = (!nextButtonItemStack.isEmpty() && ItemStack.isSameItemSameTags(clickedItem, nextButtonItemStack) && this.currentPage < this.totalPages);
        boolean isBackButton = (!backButtonItemStack.isEmpty() && ItemStack.isSameItemSameTags(clickedItem, backButtonItemStack) && this.currentPage > 1);
        if (isNextButton) {
            this.currentPage++;
            displayPage(this.currentPage);
            return;
        }
        if (isBackButton) {
            this.currentPage--;
            displayPage(this.currentPage);
            return;
        }
        if (clickedItem.hasTag() && clickedItem.getTag().contains("SetIdentifier")) {
            String setIdentifier = clickedItem.getTag().getString("SetIdentifier");
            this.player.closeContainer();
            SimpleMenuProvider simpleMenuProvider = new SimpleMenuProvider((id, inventory, player) -> new CustomSetChestMenu(id, inventory, this.player, this.guiConfigManager, this.setsConfigManager, setIdentifier), Component.literal(guiConfig.guiName));
            this.player.openMenu(simpleMenuProvider);
            return;
        }
        ItemStack mainMenuItemStack = (guiConfig.mainMenuItem != null) ? createMainMenuItemStack(guiConfig) : ItemStack.EMPTY;
        boolean isMainMenuButton = (!mainMenuItemStack.isEmpty() && ItemStack.isSameItemSameTags(clickedItem, mainMenuItemStack));
        if (isMainMenuButton) {
            this.player.closeContainer();
            SimpleMenuProvider simpleMenuProvider = new SimpleMenuProvider((id, inventory, player) -> new CustomChestMenu(id, inventory, this.player, this.guiConfigManager, this.setsConfigManager, "main"), Component.literal("Main GUI"));
            this.player.openMenu(simpleMenuProvider);
            return;
        }
        if (clickType == ClickType.PICKUP || clickType == ClickType.QUICK_MOVE)
            return;
    }
    super.clicked(slotId, dragType, clickType, playerEntity);
}

其他注意事项

  • 确保您使用的 Forge 版本与问题中提到的版本相同。
  • 如果问题仍然存在,请尝试重新启动 Minecraft 服务器。
  • 您还可以尝试更新 Forge 和 Minecraft 的版本。

结论

通过遵循本文概述的步骤,您可以解决 Forge GUI 中的物品移动错误。这些修复程序已在实际项目中成功应用,并且对解决此特定问题非常有效。

常见问题解答

1. 为什么我还会遇到此错误?
确保已仔细按照所有步骤操作。错误消息将指示错误所在的代码行,因此请仔细检查并确保已正确修复该行代码。

2. 除了上面列出的步骤之外,还有什么其他方法可以解决此问题?
有时,更新 Forge 和 Minecraft 的版本可能会解决此问题。此外,尝试重新启动 Minecraft 服务器也可能是有效的。

3. 此错误是否只影响特定的 Minecraft 版本?
此错误主要影响 Forge 1.20.2 中的自定义 GUI。

4. 此错误是否特定于任何特定类型的 GUI?
否,此错误可以影响任何类型的自定义 GUI,无论其用途如何。

5. 还有其他导致此错误的可能原因吗?
罕见情况下,此错误可能是由于 Forge 或 Minecraft 中的其他错误引起的。在这些情况下,更新这些应用程序可能会解决问题。