Jump to content

Recommended Posts

Posted

Okay Im trying to save the items in container item based gui. This is what ive got so far but I cant seem to get it to work:

 

ItemBagpackInventory(Ive written some comments on some bits which I think is the problem

 

package simplecamping;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;

public class ItemBagpackInventory implements IInventory
{

private ItemStack[] inv;
private ItemStack bagpack;

public ItemBagpackInventory(ItemStack itemstack)
{
	inv = new ItemStack[27];
	bagpack = itemstack;
}

@Override
public int getSizeInventory()
{
	return inv.length;
}

@Override
public ItemStack getStackInSlot(int slot)
{
	return inv[slot];
}

@Override
public ItemStack decrStackSize(int slot, int amt)
{
	ItemStack stack = getStackInSlot(slot);
	if(stack != null)
	{
		if(stack.stackSize <= amt)
		{
			setInventorySlotContents(slot, null);
		}
		else
		{
			stack = stack.splitStack(amt);
			if(stack.stackSize == 0)
			{
				setInventorySlotContents(slot, null);
			}
		}
	}
	return stack;
}

@Override
public ItemStack getStackInSlotOnClosing(int slot)
{
	ItemStack stack = getStackInSlot(slot);
	if(stack != null)
	{
		setInventorySlotContents(slot, null);
	}
	return stack;
}

@Override
public void setInventorySlotContents(int slot, ItemStack stack)
{
	inv[slot] = stack;
	if(stack != null && stack.stackSize > getInventoryStackLimit())
	{
		stack.stackSize = getInventoryStackLimit();
	}
}

@Override
public String getInvName()
{
	return "Bagpack";
}

@Override
public boolean isInvNameLocalized()
{
	return false;
}

@Override
public int getInventoryStackLimit()
{
	return 64;
}

@Override
public void onInventoryChanged()
{}

@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
	return true;
}

public NBTTagCompound writeToNBT(NBTTagCompound tagCompound)
{
	NBTTagList itemList = new NBTTagList();
	for(int i = 0; i < inv.length; i++)
	{
		ItemStack stack = inv[i];
		if(stack != null)
		{
			NBTTagCompound tag = new NBTTagCompound();
			tag.setByte("Slot", (byte) i);
			stack.writeToNBT(tag);
			itemList.appendTag(tag);
		}
	}
	tagCompound.setTag("Inventory", itemList);
	return tagCompound;
}

public void readFromNBT(NBTTagCompound tagCompound)
{
	NBTTagList tagList = tagCompound.getTagList("Inventory");

	for(int i = 0; i < tagList.tagCount(); i++)
	{
		NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i);
		byte slot = tag.getByte("Slot");
		System.out.println(i);

		if(slot >= 0 && slot < inv.length)
		{
			inv[slot] = ItemStack.loadItemStackFromNBT(tag);
			System.out.println("slot");
		}
	}
}

@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
	return true;
}

@Override
public void openChest()
{
	if(bagpack.hasTagCompound())
	{
		System.out.println("hastag");//never gets printed
		readFromNBT(bagpack.getTagCompound());
	}
}

@Override
public void closeChest()
{
	if(! bagpack.hasTagCompound())
	{

		System.out.println("writing without tag compound"); //Prints all the time, even after its set and it should be false
		bagpack.setTagCompound(new NBTTagCompound());
	}

	NBTTagCompound tag = bagpack.getTagCompound();
	writeToNBT(tag);

}

}

 

 

Container Bagpack:

 

package simplecamping;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;

public class ContainerBagpack extends Container
{

private ItemBagpackInventory bginv;

public ContainerBagpack(InventoryPlayer inventoryPlayer, ItemBagpackInventory bagpack)
{
	bginv = bagpack;
	bagpack.openChest();

	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 9; j++)
		{
			addSlotToContainer(new Slot(bginv, j + i * 3, 8 + j * 18, 17 + i * 18));
		}
	}

	bindPlayerInventory(inventoryPlayer);
}

@Override
public boolean canInteractWith(EntityPlayer player)
{
	return bginv.isUseableByPlayer(player);
}

protected void bindPlayerInventory(InventoryPlayer inventoryPlayer)
{
	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 9; j++)
		{
			addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
		}
	}

	for(int i = 0; i < 9; i++)
	{
		addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
	}
}

public void onContainerClosed(EntityPlayer par1EntityPlayer)
{
	super.onContainerClosed(par1EntityPlayer);
	this.bginv.closeChest();
}
}

 

 

GuBagpack:

package simplecamping;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;

import org.lwjgl.opengl.GL11;

import cpw.mods.fml.client.FMLClientHandler;

public class GuiBagpack extends GuiContainer
{
    public ItemBagpackInventory bagpack;

    public GuiBagpack(InventoryPlayer par1InventoryPlayer, ItemBagpackInventory bgInv)
    {
        super(new ContainerBagpack(par1InventoryPlayer, bgInv));
        this.bagpack = bgInv;
    }

    /**
     * Draw the foreground layer for the GuiContainer (everything in front of the items)
     */
    protected void drawGuiContainerForegroundLayer(int par1, int par2)
    {
        String s = this.bagpack.isInvNameLocalized() ? this.bagpack.getInvName() : I18n.func_135053_a(this.bagpack.getInvName());
        this.fontRenderer.drawString(s,  8, 6, 4210752);
        this.fontRenderer.drawString(I18n.func_135053_a("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
    }

    /**
     * Draw the background layer for the GuiContainer (everything behind the items)
     */
    protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
    {
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
	FMLClientHandler.instance().getClient().renderEngine.func_110577_a(new ResourceLocation(Strings.MOD_ID, "/textures/gui/bagpack.png"));
        int k = this.guiLeft;
	int l = this.guiTop;
	this.drawTexturedModalRect(k, l, 0, 0, 256, 256);
    }
}

 

GuiHandler:

 

package simplecamping;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;

public class GuiHandler implements IGuiHandler
{
@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
	TileEntity tile_entity = world.getBlockTileEntity(x, y, z);
	ItemBagpackInventory bp = new ItemBagpackInventory(player.inventory.getCurrentItem());

	switch(id)
	{
	case 0:
		return new ContainerCampfire(player.inventory, (TileEntityCampfire) tile_entity);
	case 1: 
		return new ContainerBagpack(player.inventory, (ItemBagpackInventory) bp);
	}
	return true;
}

@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{		
	TileEntity tile_entity = world.getBlockTileEntity(x, y, z);
	ItemBagpackInventory bp = new ItemBagpackInventory(player.inventory.getCurrentItem());//is not 100% the backpack

	switch(id)
	{
	case 0:
		return new GuiCampfire(player.inventory, (TileEntityCampfire) tile_entity);
	case 1:
		return new GuiBagpack(player.inventory, (ItemBagpackInventory) bp);
	}
	return true;
}
}

 

  • Replies 51
  • Created
  • Last Reply

Top Posters In This Topic

Posted

You can't use an item like you would a tile entity (which is what you're doing as you've implemented IInventory) since items are static. Everything will need to be written to the ItemStack's NBTTagCompound.

Posted

@Guff

It doesn't matter where you implement IInventory. TileEntity is only one of the possible implementation.

 

@Lua

You only need to call

 

writeToNBT(stack.getTagCompound());//To save

readFromNBT(stack.getTagCompound());//To load

 

Posted

@GotoLink Okay this is what i tried and it didnt work:

 

@Override
public void openChest()
{
	NBTTagCompound compound = new NBTTagCompound();
	ItemStack stack = ItemStack.loadItemStackFromNBT(compound);
	if(bagpack.hasTagCompound())
	{
		System.out.println("hastag");//never gets printed
		//readFromNBT(bagpack.getTagCompound());
		readFromNBT(stack.getTagCompound());
	}
}

@Override
public void closeChest()
{
	NBTTagCompound compound = new NBTTagCompound();
	ItemStack stack = ItemStack.loadItemStackFromNBT(compound);
		System.out.println("writing without tag compound"); //Prints all the time, even after its set and it should be false
		//bagpack.setTagCompound(new NBTTagCompound());
		if(stack != null)
		{
		writeToNBT(stack.getTagCompound());
		}
}

Posted

No, those methods don't give you the ItemStack as a variable.

 

Use your code inside a method which gives you the player or item in your container class or item.

If necessary, send packets from your gui.

Posted

I have no idea, I know most people dont work like this, but can some one just give me the code? Ive tried to do myself but no avail

Posted

I stand corrected, I didn't read all of your code. This should work :

@Override
public void openChest()
{
		if(bagpack.hasTagCompound())
	 {
  			readFromNBT(bagpack.getTagCompound());//Bag pack has some info for the inventory
	 }
                else
                {
                        bagpack.setTagCompound(writeToNBT(new NBTTagCompound()));//this is a "new" bagpack
                }
}

@Override
public void closeChest()
{
	if(! bagpack.hasTagCompound())
	 {
                        //Should never be reached, since done when opening the first time
		 bagpack.setTagCompound(writeToNBT(new NBTTagCompound()));
	}
                else
                {//We made changes to the inventory, save them
	        bagpack.setTagCompound(writeToNBT(bagpack.getTagCompound()));
                }

}

Posted

I give up.

this, its someting simple but you "give up" ... oh well one less mod on the market...

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

I give up.

this, its someting simple but you "give up" ... oh well one less mod on the market...

I couldnt figure out what was wrong w/ my saving code and neither could anyone else it seemed

Posted

well what you are trying to do is obviously possible, did you even debug at all?? try to check where it was saving/not saving

 

System.out.println("text");

System.out.println("the value of derp is: "+derp);

 

or even

 

try{

throw new Exception("weird thing happenning here !");

}catch(Exception e{

e.printStackTrace();

}

 

if you really need ?

 

i dont knwo just by looking at it whats wrong, but i know what you are trying to do is not impossible

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

Yes I have

@Override
public void openChest()
{
	if(bagpack.hasTagCompound())
	{
		System.out.println("hastag");//never gets printed
		readFromNBT(bagpack.getTagCompound());
	}
}

@Override
public void closeChest()
{
	if(! bagpack.hasTagCompound())
	{

		System.out.println("writing without tag compound"); //Prints all the time, even after its set and it should be false
		bagpack.setTagCompound(new NBTTagCompound());
	}

	NBTTagCompound tag = bagpack.getTagCompound();
	writeToNBT(tag);

}

 

It seems that the tag never gets properly because it always seems to get set everytime and always goes through the if statement. But the hasCompound never gets printed

Posted

public void openChest()
{
	if(bagpack.hasTagCompound())
	{
		System.out.println("hastag");//never gets printed
		readFromNBT(bagpack.getTagCompound());
	}
}

well this code alone will not make bagpack magicly have a tagCompount

 

you should have a else then set a new tag compound like gotolink said in his post

 

public void openChest()
{
	if(bagpack.hasTagCompound())
	{
		System.out.println("hastag");//never gets printed
		readFromNBT(bagpack.getTagCompound());
	}else{
                    bagpack.stackTagCompound = new NBTTagCompound();//im assuming that bagpack is an instance of ItemStack .. ?? ?
                }
}

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

Okay, after some more testing, it seems that it writes to nbt when opened to according to the console. And its trying to read the nbt but it looks like nothing is there. Also yeah bagpack is an instance of itemstack

Posted

after setting the new nbt, did you write anythign to it? because if not thats kindof normal

 

public class vec3{
public float x = 0, y = 0, z = 0;
}


in program:
vec3 = new vec3();
println(vec3.x);

"oh its 0 :\"
"yeah thats normal"

 

or are you legitimatelly writing to it and its not apparing :P

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

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.