Jump to content

Recommended Posts

Posted

I can add armor to the inventory fine and stays while the world is loaded but after closing and reopening the items are lost.

 

Can someone take a look at my readFrom/writeToNBT methods and point out what I am doing wrong.

Github Link

 

line 73 for read and line 108 for write

the inventory portions are at 90 and 123

 

Forewarning: I am probably trying to throw a lot more into the save than is necessary.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Posted

you will need a taglist to save an inventory. otherwise the last item saved will overwrite all others

 

@Override
public void readFromNBT(NBTTagCompound compound) {
	super.readFromNBT(compound);
	NBTTagList list = compound.getTagList("items", 10);
	for(int i=0; i<list.tagCount(); i++)
	{
		NBTTagCompound nbt = list.getCompoundTagAt(i);
		byte slot = nbt.getByte("slot");
		ItemStack stack = ItemStack.loadItemStackFromNBT(nbt);
		inventory.setInventorySlotContents(slot, stack);
	}
}

@Override
public void writeToNBT(NBTTagCompound compound) {

	super.writeToNBT(compound);

	NBTTagList list = new NBTTagList();
	for(int i=0; i<inventory.getSizeInventory(); i++)
	{

		ItemStack stack = inventory.getStackInSlot(i);
		if(stack==null) continue;
		NBTTagCompound nbt = new NBTTagCompound();
		nbt.setByte("slot", (byte) i);
		stack.writeToNBT(nbt);
		list.appendTag(nbt);
	}

	compound.setTag("items", list);
}

Posted

So you can only have one NBTTagCompound or NBTTagList per nest level?

 

I switched up my read and write to make use of NBTTagList but it still doesn't save the inventory.

But it still doesn't seem to be saving. I took a look at the region file in NBTExplorer and it doesn't list any tile entities at that block location. Is there something I need to do to outside of my TileEntity file to make writeToNBT get called during save?

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Posted

[quote name="UberAffe" post="193884" timestamp="1455814549"]
So you can only have one NBTTagCompound or NBTTagList per nest level?
[/quote]

Incorrect.

NBTTagCompound is a dictionary.  You can only have one object [i]with a given name[/i].

Both of these are using the same name:

[code		nbt.setTag(RefStrings.TAGLIST, list);
	nbt.setInteger(RefStrings.TAGLIST, count);

 

I'm sure the others are, too.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Is there something I need to do to outside of my TileEntity file to make writeToNBT get called during save?

I've seen vanilla code that marks tile entities as dirty so that they get saved. Hunt down an example and either imitate it or make sure that your TE calls a method that does it for you.

 

I've also run into default TE cleanup that deletes existing TE's and instantiates fresh replacements for trivial blockstate changes. Check to see if that's happening to you, and if it is, change the class member controlling that level of cleanup aggression. You might need to step through your TE code in a debugger to see what's really happening.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted

@jeffryfisher: I though markDirty was just to update the client with changes on the server?

 

@Draco18s: If it is just a dictionary then I am confused as to why my original bit of code wouldn't work.

//RefString values are formatted as "{modid}_{variableName}"
public void writeToNBT(NBTTagCompound nbt) 
{
            NBTTagCompound temp;
            for(int i = 0; i < inventory.length(); i++)
            {
                temp = new NBTTagCompound();
                inventory[i].writeToNBT(temp);
                nbt.setTag(RefStrings.Inventory + i, temp);
             }

 

When I had everything set up like that it still wouldn't save, even looking at the region file it doesn't show any tile entity in that location. Even if entries are getting overwritten something should still show up shouldn't it?

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Posted

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

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.