gwoonryan Posted July 25 Posted July 25 Hi, I am trying to get custom GUIs working, and I would like to have a GUI that works only client-side, which means that you are not supposed to pull items out, but I do want to display items in my GUI and let the player click them. I have a GUI working that has a size of 54 slots and I made a custom texture to remove the player inventory from the GUI texture (see image) Everything kinda works, but is seems like the inventory is in some way still linked to the player's inventory, even though I didn't add any slots linked to the player's inventory. As an example: If is click in the 5th row of my GUI, I get the chest that was in my hot bar slot (see image). It seems like the handling of the clicking of the inventory is handled by the player inventory still. I also get an error if I click in the bottom row because "java.lang.IndexOutOfBoundsException: Index: 49, Size: 45" the player inventory has a size of 45 I guess? I have posted all my relevant code below, if more is needed to solve this issue please tell me, thanks! Image of weird behaviour: Spoiler FlipsMenu.java: Opens the menu by changing a "screen to open" variable that gets checked every tick. Spoiler private static void openMenu(String serverResp){ // some code to read "serverResp" ConfigManager.screenToOpen = new AHFlipsGUI(new AHFlipsInventory("Best Flips", 54)); } // code in the tick event: (not in this class) if (screenToOpen != null) { Minecraft.getMinecraft().displayGuiScreen(screenToOpen); screenToOpen = null; } AHFlipsGui.java: draws the background image and specifies size of the gui. Spoiler package me.ryan.ryanair.features.AHFlips; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.util.ResourceLocation; public class AHFlipsGUI extends GuiContainer { private static final ResourceLocation GUI_TEXTURE = new ResourceLocation("ryanair", "container/no_inv_54.png"); private final AHFlipsInventory inventory; public AHFlipsGUI(AHFlipsInventory inventory) { super(new AHFlipsContainer(inventory)); this.inventory = inventory; this.xSize = 176; this.ySize = 134; } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { this.fontRendererObj.drawString(this.inventory.getDisplayName().getUnformattedText(), 8, 6, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { this.mc.getTextureManager().bindTexture(GUI_TEXTURE); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize); } } AHFlipsContainer.java: Where we assign the slots. Spoiler package me.ryan.ryanair.features.AHFlips; import me.ryan.ryanair.player.Player; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class AHFlipsContainer extends Container { public AHFlipsContainer(AHFlipsInventory inventory) { for (int i = 0; i < 6; i++) { for (int j = 0; j < 9; j++) { this.addSlotToContainer(new Slot(inventory, j + i * 9, 8 + j * 18, 18 + i * 18)); } } } @Override public boolean canInteractWith(EntityPlayer playerIn) { return true; } @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { Player.sendChatMessage("clicked in slot: " + index); System.out.println("Clicked slot index: " + index); return null; } } AHFlipsInventory.java: The actual inventory. Spoiler package me.ryan.ryanair.features.AHFlips; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; import net.minecraft.util.IChatComponent; import java.util.Arrays; public class AHFlipsInventory implements IInventory { private final ItemStack[] inventory; private final String name; public AHFlipsInventory(String name, int size) { this.name = name; this.inventory = new ItemStack[size]; } @Override public int getSizeInventory() { return inventory.length; } @Override public ItemStack getStackInSlot(int index) { return inventory[index]; } @Override public ItemStack decrStackSize(int index, int count) { return null; } @Override public ItemStack removeStackFromSlot(int index) { return null; } @Override public void setInventorySlotContents(int index, ItemStack stack) { } @Override public int getInventoryStackLimit() { return 64; } @Override public void markDirty() { } @Override public boolean isUseableByPlayer(EntityPlayer player) { return false; } @Override public void openInventory(EntityPlayer player) { } @Override public void closeInventory(EntityPlayer player) { } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } @Override public int getField(int id) { return 0; } @Override public void setField(int id, int value) { } @Override public int getFieldCount() { return 0; } @Override public void clear() { Arrays.fill(inventory, null); } @Override public String getName() { return name; } @Override public boolean hasCustomName() { return name != null && !name.isEmpty(); } @Override public IChatComponent getDisplayName() { return new ChatComponentText(name); } } Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.