I'm attempting to create a gui similar to that of a spigot plugin in forge 1.20.2 for a pixelmon sidemod. I have all the code running everything works but i'm having an issue i can't solve. I created a gui and attached a clicked method which i override from its original AbstractContainerMenu class normally when you click on an item in the gui it wont allow you to grab the item but if you click on the next or back button it allows you to grab the button item and duplicate it as well as completely erasing whats currently in your player inventory. I could really use some help with this as i have no idea where i went wrong with it.
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);
}
public ItemStack quickMoveStack(Player player, int index) {
return ItemStack.EMPTY;
}
I can provide more of the code from the class if needed but this is the method where the error occurs.
I also have this error that occurs in console when clicking on a slot in the player inventory or basically any slot outside of the actual gui.
[20Mar2024 00:42:16.385] [Server thread/ERROR] [net.minecraft.network.protocol.PacketUtils/]: Failed to handle packet net.minecraft.network.protocol.game.ServerboundContainerClickPacket@2c62ee95, suppressing error
java.lang.IndexOutOfBoundsException: Index 59 out of bounds for length 54
at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[?:?] {}
at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[?:?] {}
at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) ~[?:?] {}
at java.util.Objects.checkIndex(Objects.java:361) ~[?:?] {re:mixin}
at java.util.ArrayList.get(ArrayList.java:427) ~[?:?] {re:mixin,re:computing_frames}
at net.minecraft.core.NonNullList.get(NonNullList.java:47) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading}
at net.minecraft.world.inventory.AbstractContainerMenu.m_38853_(AbstractContainerMenuMixin.java:287) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:world.inventory.AbstractContainerMenuMixin,pl:mixin:A}
at net.minecraft.server.network.ServerGamePacketListenerImpl.m_5914_(ServerPlayNetHandlerMixin.java:3076) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:network.ServerPlayNetHandlerMixin,pl:mixin:APP:mixins.arclight.impl.forge.optimization.json:network.ServerGamePacketListenerImplMixin_Optimize,pl:mixin:A}
at net.minecraft.network.protocol.game.ServerboundContainerClickPacket.m_5797_(ServerboundContainerClickPacket.java:56) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading}
at net.minecraft.network.protocol.game.ServerboundContainerClickPacket.m_5797_(ServerboundContainerClickPacket.java:12) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading}
at net.minecraft.network.protocol.PacketUtils.md8880c7$lambda$ensureRunningOnSameThread$0$0(PacketThreadUtilMixin.java:537) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:mixin:APP:mixins.arclight.core.json:network.protocol.PacketThreadUtilMixin,pl:mixin:A}
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading}
at net.minecraft.util.thread.BlockableEventLoop.m_6367_(BlockableEventLoop.java:156) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.thread.ReentrantBlockableEventLoop.m_6367_(ReentrantBlockableEventLoop.java:23) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading}
at net.minecraft.server.MinecraftServer.m_6367_(MinecraftServerMixin.java:765) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_6367_(MinecraftServerMixin.java:160) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at net.minecraft.util.thread.BlockableEventLoop.m_7245_(BlockableEventLoop.java:130) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.m_129961_(MinecraftServerMixin.java:748) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_7245_(MinecraftServerMixin.java:742) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at net.minecraft.util.thread.BlockableEventLoop.m_18699_(BlockableEventLoop.java:115) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.m_130012_(MinecraftServerMixin.java:727) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServerMixin.java:2081) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServerMixin.java:249) ~[server-1.20.2-20230921.100330-srg.jar%23167!/:?] {re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixins.arclight.core.json:server.MinecraftServerMixin,pl:mixin:A}
at java.lang.Thread.run(Thread.java:840) ~[?:?] {re:mixin,re:mixin}