Jump to content

[1.8][SOLVED]Container not allowing item movement


Toxicshadow

Recommended Posts

Okay so I've been trying to do some inventory work; I ended up just working backwards from vanilla code trying my best, and I actually got items to appear! However they appear because I'm literally just copying the vanilla inventory and rendering it again in a new GUI. The reasoning for this is to add in my own additional slots to go with the vanilla slots.

 

So right now I can get the inventory to render, based on you placing blocks in the vanilla menu, and then opening the new menu. However when you click them it super fast picks the item up and places it right back down. There are plenty of other bugs too, but right now I need the inventory to be interactable first.

 

I don't mean to just dump code and ask "whats wrong" but I honestly no absolutely nothing about inventories/containers except the relationship between the two. I've tried looking at tutorials but the only ones I found were outdated and not the best quality.

 

package ca.grm.rot.gui;

import ca.grm.rot.inventory.RotTrinketInventory;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ContainerPseudoPlayer extends Container{
private IInventory pseudoPlayerInventory;
    
@Override
public boolean canInteractWith(EntityPlayer playerIn) {
	return true;
}

public ContainerPseudoPlayer(final InventoryPlayer realPlayerInventory, EntityPlayer player)
{
	int i;
        int j;
        
        // Inventory
	for (i = 0; i < 3; ++i)
        {
            for (j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(realPlayerInventory, j + (i + 1) * 9, 8 + j * 18, 84 + i * 18));
            }
        }

	// Hotbar
	for (i = 0; i < 9; ++i)
        {
            this.addSlotToContainer(new Slot(realPlayerInventory, i, 8 + i * 18, 142));
        }

	// Trinkets
	for (i = 0; i < 4; i++)
	{
		this.addSlotToContainer(new Slot(new RotTrinketInventory(), i, 26, 8 + i * 18));
	}

	// Armor, literally copy-pasted from container-player
	 for (i = 0; i < 4; ++i)
        {
            final int k = i;
            this.addSlotToContainer(new Slot(realPlayerInventory, realPlayerInventory.getSizeInventory() - 1 - i, 8, 8 + i * 18)
            {
                public int getSlotStackLimit()
                {
                    return 1;
                }
                public boolean isItemValid(ItemStack stack)
                {
                    if (stack == null) return false;
                    return stack.getItem().isValidArmor(stack, k, player);
                }
                @SideOnly(Side.CLIENT)
                public String getSlotTexture()
                {
                    return ItemArmor.EMPTY_SLOT_NAMES[k];
                }
            });
        }
}
}

 

Any help is appreciated, because right now this code is garbage. I'm just super lost.

Link to comment
Share on other sites

Wow haha I'm surprised it looks okay. But the constructor for the class is

public GuiPseudoPlayer(EntityPlayer player)
{
	super(new ContainerPseudoPlayer(Minecraft.getMinecraft().thePlayer.inventory, player));

	this.player = player;
	this.xSize = 176;
	this.ySize = 166;
}

 

Is it just because I'm passing in the client player inventory?

Link to comment
Share on other sites

Show gui handler and where you open The gui pls

oh.

public class GuiHandler implements IGuiHandler {
@Override
public Object getClientGuiElement(int guiId, EntityPlayer player, World world, int x,
		int y, int z) {
	TileEntity entity = world.getTileEntity(new BlockPos(x, y, z));
	switch (guiId) {
		case 0 :
			if (entity instanceof TileEntityBaseBuilder) {
				return new GuiBaseNode((TileEntityBaseBuilder) entity, player);
			} else {
				return null;
			}
		case 1 : {
			return new GuiPseudoPlayer(player);
		}
		default :
			return null;
	}
}

// 0 is base builder
// 1 is class Menu
@Override
public Object getServerGuiElement(int guiId, EntityPlayer player, World world, int x,
		int y, int z) {
	TileEntity entity = world.getTileEntity(new BlockPos(x, y, z));

	switch (guiId) {
		case 0 :
			if (entity instanceof TileEntityBaseBuilder) {
				return null;
			} else {
				return null;
			}
		default :
			return null;
	}
}

}

 

There's code for another GUI, ignore that. :P

 

You might be looking specifically for the line:

return new GuiPseudoPlayer(player);

Idk though

Link to comment
Share on other sites

Also:

super(new ContainerPseudoPlayer(Minecraft.getMinecraft().thePlayer.inventory, player));

You already have an EntityPlayer available, why not use that inventory instead of client-side inventory?

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

jfc. Sorry.

EntityPlayer player = FMLClientHandler.instance().getClient().thePlayer;
	if (ClientProxy.classKey.isPressed())
	{
		FMLNetworkHandler.openGui(player, Rot.instance, 1, player.worldObj, (int) player.posX,
				(int) player.posY, (int) player.posZ);
	}

This is where I call the gui.

 

Also:

super(new ContainerPseudoPlayer(Minecraft.getMinecraft().thePlayer.inventory, player));

You already have an EntityPlayer available, why not use that inventory instead of client-side inventory?

I'm not sure actually... I'll switch that.

Link to comment
Share on other sites

That is client-only indeed. You will need a packet that you send to the server to make a GUI open from a key.

Okay that makes sense, I can do packets, but are you saying I need the open the gui on the server side?

If thats what you mean, I can figure it out from here.

 

Either way, thank you!

Link to comment
Share on other sites

That is client-only indeed. You will need a packet that you send to the server to make a GUI open from a key.

Okay that makes sense, I can do packets, but are you saying I need the open the gui on the server side?

If thats what you mean, I can figure it out from here.

 

Either way, thank you!

Yes, every GuiContainer has to be openen server-side.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements



×
×
  • Create New...

Important Information

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