Posted November 24, 201410 yr hello all, I have made a tile entity that can store items but when i unload the world the items are gone. I know you have to use read to and write to NBT but im not sure how. As of right now i just took the tileentitychest code but it doesn't seem to work.I really don't have a great understanding of nbt so please be patient with me. My Code: public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.inv.length; ++i) { if (this.inv != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("slot", (byte)i); this.inv.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } } public void readFromNBT(NBTTagCompound p_145839_1_) { super.readFromNBT(p_145839_1_); NBTTagList nbttaglist = p_145839_1_.getTagList("Items", 10); this.inv = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("slot") & 255; if (j >= 0 && j < this.inv.length) { this.inv[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } } BioWarfare Mod: http://goo.gl/BYWQty
November 24, 201410 yr I think you forgot to add brackets after inv sometimes. For example you have this: for (int i = 0; i < this.inv.length; ++i) { if (this.inv != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("slot", (byte)i); this.inv.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } It should be this: for (int i = 0; i < this.inv.length; ++i) { if (this.inv[i] != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("slot", (byte)i); this.inv[i].writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } Do the same for readNBT and it should work
November 24, 201410 yr Author This doesn't seemed to have solved the problem i took the code from the chest class so i don't think it could be missing something like that. BioWarfare Mod: http://goo.gl/BYWQty
November 24, 201410 yr Author well is hasn't solved the problem and i was more looking for a definition on how nbt works because i dont have a clue. BioWarfare Mod: http://goo.gl/BYWQty
November 24, 201410 yr Ah I see, this tutorial gives some insight in NBT http://www.minecraftforge.net/wiki/Tile_Entities Your whole code should be like this: public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.inv.length; ++i) { if (this.inv[i] != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("slot", (byte)i); this.inv[i].writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } } public void readFromNBT(NBTTagCompound p_145839_1_) { super.readFromNBT(p_145839_1_); NBTTagList nbttaglist = p_145839_1_.getTagList("Items", 10); this.inv = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("slot") & 255; if (j >= 0 && j < this.inv.length) { this.inv[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } } If that code doesn't work the problem lies elsewhere. Did you register the TileEntity in the GameRegistry?
November 24, 201410 yr If that code doesn't work the problem lies elsewhere. Did you register the TileEntity in the GameRegistry? Game crashes if you don't, hehe. I've forgotten twice in my current project and when I did the game would immediately crash as soon as the block was placed in the world. Other two functions you should go ahead and implement now are: @Override public Packet getDescriptionPacket() { NBTTagCompound nbtTag = new NBTTagCompound(); writeToNBT(nbtTag); return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbtTag); } @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) { readFromNBT(packet.func_148857_g()); } And you'll also need this line any time you change the inventory (important when dealing with hoppers and similar!) if (worldObj != null) worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); 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.
November 24, 201410 yr Author Ok i have implemented everything but now when i use the inventory this happens: [21:17:19] [server thread/INFO]: Player238 joined the game [21:17:21] [server thread/ERROR]: Encountered an unexpected exception net.minecraft.util.ReportedException: Exception ticking world at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:708) ~[MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:624) ~[MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:495) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:762) [MinecraftServer$2.class:?] Caused by: java.lang.RuntimeException: class com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate is missing a mapping! This is a bug! at net.minecraft.tileentity.TileEntity.writeToNBT(TileEntity.java:100) ~[TileEntity.class:?] at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.writeToNBT(TileEntityAgarPlate.java:61) ~[TileEntityAgarPlate.class:?] at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.getDescriptionPacket(TileEntityAgarPlate.java:97) ~[TileEntityAgarPlate.class:?] at net.minecraft.server.management.PlayerManager$PlayerInstance.sendTileToAllPlayersWatchingChunk(PlayerManager.java:638) ~[PlayerManager$PlayerInstance.class:?] at net.minecraft.server.management.PlayerManager$PlayerInstance.sendChunkUpdate(PlayerManager.java:580) ~[PlayerManager$PlayerInstance.class:?] at net.minecraft.server.management.PlayerManager.updatePlayerInstances(PlayerManager.java:84) ~[PlayerManager.class:?] at net.minecraft.world.WorldServer.tick(WorldServer.java:195) ~[WorldServer.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:702) ~[MinecraftServer.class:?] ... 4 more [21:17:21] [server thread/ERROR]: This crash report has been saved to: C:\Users\Daniel\Desktop\MineCraft Java Script\Minecraft Mods\eclipse\.\crash-reports\crash-2014-11-24_21.17.21-server.txt [21:17:21] [server thread/INFO]: Stopping server [21:17:21] [server thread/INFO]: Saving players ---- Minecraft Crash Report ---- // I feel sad now Time: 24/11/14 21:17 Description: Exception ticking world java.lang.RuntimeException: class com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate is missing a mapping! This is a bug! at net.minecraft.tileentity.TileEntity.writeToNBT(TileEntity.java:100) at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.writeToNBT(TileEntityAgarPlate.java:61) at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.getDescriptionPacket(TileEntityAgarPlate.java:97) at net.minecraft.server.management.PlayerManager$PlayerInstance.sendTileToAllPlayersWatchingChunk(PlayerManager.java:638) at net.minecraft.server.management.PlayerManager$PlayerInstance.sendChunkUpdate(PlayerManager.java:580) at net.minecraft.server.management.PlayerManager.updatePlayerInstances(PlayerManager.java:84) at net.minecraft.world.WorldServer.tick(WorldServer.java:195) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:702) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:624) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:495) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:762) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Stacktrace: at net.minecraft.tileentity.TileEntity.writeToNBT(TileEntity.java:100) at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.writeToNBT(TileEntityAgarPlate.java:61) at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.getDescriptionPacket(TileEntityAgarPlate.java:97) at net.minecraft.server.management.PlayerManager$PlayerInstance.sendTileToAllPlayersWatchingChunk(PlayerManager.java:638) at net.minecraft.server.management.PlayerManager$PlayerInstance.sendChunkUpdate(PlayerManager.java:580) at net.minecraft.server.management.PlayerManager.updatePlayerInstances(PlayerManager.java:84) at net.minecraft.world.WorldServer.tick(WorldServer.java:195) -- Affected level -- Details: Level name: just another test All players: 1 total; [EntityPlayerMP['Player238'/394, l='just another test', x=30.36, y=71.25, z=167.88]] Chunk stats: ServerChunkCache: 625 Drop: 0 Level seed: -5804106722026325298 Level generator: ID 00 - default, ver 1. Features enabled: true Level generator options: Level spawn location: World: (32,64,180), Chunk: (at 0,4,4 in 2,11; contains blocks 32,0,176 to 47,255,191), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Level time: 92388 game time, 12854 day time Level dimension: 0 Level storage version: 0x04ABD - Anvil Level weather: Rain time: 78930 (now: false), thunder time: 20926 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:702) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:624) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:495) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:762) -- System Details -- Details: Minecraft Version: 1.7.10 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.7.0_21, Oracle Corporation Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 772486952 bytes (736 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95 FML: MCP v9.05 FML v7.10.24.1187 Minecraft Forge 10.13.0.1187 4 mods loaded, 4 mods active mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available FML{7.10.24.1187} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.0.1187.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Forge{10.13.0.1187} [Minecraft Forge] (forgeSrc-1.7.10-10.13.0.1187.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available BioWarfare{0.0.1 Alpha} [bioWarfare] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Profiler Position: N/A (disabled) Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used Player Count: 1 / 8; [EntityPlayerMP['Player238'/394, l='just another test', x=30.36, y=71.25, z=167.88]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge' #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2014-11-24_21.17.21-server.txt [21:17:21] [Client thread/INFO] [FML]: Waiting for the server to terminate/save. [21:17:21] [server thread/INFO]: Saving worlds [21:17:21] [server thread/INFO]: Saving chunks for level 'just another test'/Overworld [21:17:21] [server thread/ERROR] [FML]: A TileEntity type com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate has throw an exception trying to write state. It will not persist. Report this to the mod author java.lang.RuntimeException: class com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate is missing a mapping! This is a bug! at net.minecraft.tileentity.TileEntity.writeToNBT(TileEntity.java:100) ~[TileEntity.class:?] at com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate.writeToNBT(TileEntityAgarPlate.java:61) ~[TileEntityAgarPlate.class:?] at net.minecraft.world.chunk.storage.AnvilChunkLoader.writeChunkToNBT(AnvilChunkLoader.java:395) [AnvilChunkLoader.class:?] at net.minecraft.world.chunk.storage.AnvilChunkLoader.saveChunk(AnvilChunkLoader.java:204) [AnvilChunkLoader.class:?] at net.minecraft.world.gen.ChunkProviderServer.safeSaveChunk(ChunkProviderServer.java:289) [ChunkProviderServer.class:?] at net.minecraft.world.gen.ChunkProviderServer.saveChunks(ChunkProviderServer.java:342) [ChunkProviderServer.class:?] at net.minecraft.world.WorldServer.saveAllChunks(WorldServer.java:876) [WorldServer.class:?] at net.minecraft.server.MinecraftServer.saveAllWorlds(MinecraftServer.java:380) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.stopServer(MinecraftServer.java:415) [MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.stopServer(IntegratedServer.java:266) [integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:548) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:762) [MinecraftServer$2.class:?] [21:17:21] [server thread/INFO]: Saving chunks for level 'just another test'/Nether [21:17:21] [server thread/INFO]: Saving chunks for level 'just another test'/The End [21:17:21] [server thread/INFO] [FML]: Unloading dimension 0 [21:17:21] [server thread/INFO] [FML]: Unloading dimension -1 [21:17:21] [server thread/INFO] [FML]: Unloading dimension 1 [21:17:21] [server thread/INFO] [FML]: Applying holder lookups [21:17:21] [server thread/INFO] [FML]: Holder lookups applied [21:17:21] [server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded. [21:17:21] [Client thread/INFO] [FML]: Server terminated. AL lib: (EE) alc_cleanup: 1 device not closed BioWarfare Mod: http://goo.gl/BYWQty
November 24, 201410 yr java.lang.RuntimeException: class com.Looke81.BioWarfare.tileentity.TileEntityAgarPlate is missing a mapping! This is a bug! You didn't register your TE. If that code doesn't work the problem lies elsewhere. Did you register the TileEntity in the GameRegistry? Game crashes if you don't, hehe. 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.
November 24, 201410 yr Author Wow i really thought i had woops. But the data still isn't saving! I'm gonna give you my whole class. http://pastebin.com/V6zxySR6 BioWarfare Mod: http://goo.gl/BYWQty
November 24, 201410 yr You're missing: tc.setTag("Items", nbttaglist); in writeToNBT. Blame Ives. @Override public void writeToNBT(NBTTagCompound tc) { super.writeToNBT(tc); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < inventory.length; ++i) { if (inventory[i] != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); inventory[i].writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } tc.setTag("Items", nbttaglist); //you're missing this line //tc.setInteger("siftTime", siftTime); //this is how you would set other variables that need to be saved, such as burnTime for a furnace } 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.