Forge GUI物品移动错误:全面指南,轻松解决物品获取问题
2024-03-22 06:16:34
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 中的其他错误引起的。在这些情况下,更新这些应用程序可能会解决问题。