Jump to content

Custom Gui functions like its linked to the players inventory, while it is not.


gwoonryan

Recommended Posts

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

spacer.png

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);
    }
}

 

 

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.