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

 

  Reveal hidden contents

 

 

Container Bagpack:

 

  Reveal hidden contents

 

 

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:

 

  Reveal hidden contents

 

  • 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
  On 8/19/2013 at 2:02 PM, Lua said:

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
  On 8/19/2013 at 2:19 PM, hydroflame said:

  Quote

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




  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Betafort Recovery has emerged as a prominent figure in the realm of cryptocurrency recovery, gaining a reputation for their exceptional ability to retrieve lost Bitcoin (BTC) and other cryptocurrencies. Their expertise and track record have made them a beacon of hope for individuals facing the distressing situation of lost or inaccessible crypto assets.  
    • When you name a method like that, with no return value, it is a constructor. The constructor must have the same name as the class it constructs, in this case, ModItems. I would strongly advise reading up on some basic Java tutorials, because you will definitely be running into a lot more issues as you go along without the basics. *I should also add that the Forge documentation is a reference, not a tutorial. Even following tutorials, you should know Java basics, otherwise the smallest of mistakes will trip you up as you copy someone elses code.
    • so, I'm starting modding and I'm following the official documantation for forge: https://docs.minecraftforge.net, but in the registries part it is not working as it is in the docs:   public class ModItems { private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, DarkStarvation.MOD_ID); public static final RegistryObject<Item> TEST_ITEM = ITEMS.register("test_item", () -> new Item(new Item.Properties())); public DarkStarvation(FMLJavaModLoadingContext context) { ITEMS.register(context.getModEventBus()); } } in 'public DarkStarvation(...' the DarkStarvation has this error: Invalid method declaration; return type required and the getModEventBus(): Cannot resolve method 'getModEventBus' in 'FMLJavaModLoadingContext' please help, I asked gpt but it is saying that I'm using an old method, but I'm following the latest version of Forge Docs???
    • I merged your second post with the original , there is no need to post a new thread asking for an answer. If someone sees your post and can help, they will reply. If you are seeking a quicker response, you could try asking in the Minecraft Forge diacord.
    • Create a new instance and start with cobblemon - if this works, add the rest of your mods in groups   Maybe another mod is conflicting - like Sodium/Iris or Radical Cobblemon Trainers
  • Topics

×
×
  • Create New...

Important Information

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