Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

 

 

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.