Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.7.2] NBT not working???


Recommended Posts

Hi, i have a registered tile entity and stuff, everything works fine except for when i reload my world the items inside the arent there. I added system.out.println() codes and the writeToNBT gets called but not readFromNBT!

 

Is it just me being stupid? Thanks in advance!

 

nbt code (It wont let me add a spoiler for some reason -.-):

 

@Override

public void writeToNBT(NBTTagCompound compound) {

super.writeToNBT(compound);

 

NBTTagList items = new NBTTagList();

 

for(int i=0;i<getSizeInventory();i++) {

ItemStack stack = getStackInSlot(i);

if(stack != null) {

NBTTagCompound item = new NBTTagCompound();

item.setByte("Slot", (byte)i);

stack.writeToNBT(compound);

items.appendTag(item);

System.out.println("Storing Stack "+i);

}

}

 

compound.setTag("Items", items);

}

 

@Override

public void readFromNBT(NBTTagCompound compound) {

super.readFromNBT(compound);

 

NBTTagList items = compound.getTagList("Items", compound.getId());

 

for (int i = 0; i < items.tagCount(); ++i) {

NBTTagCompound item = items.getCompoundTagAt(i);

byte slot = item.getByte("Slot");

if (slot >= 0 && slot < getSizeInventory()) {

setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item));

System.out.println("Storing Stack "+i);

}

}

}

Link to post
Share on other sites

NBT works fine, just add in different print checks to see which parts are being called. Most likely one of your if statements is returning false and you don't realize it.

If you really want help, give that modder a thank you.

 

Modders LOVE thank yous.

Link to post
Share on other sites

Did you ever call the readFromNBT method?

 

You (the programmer) don't have to.  That's the point of overriding existing functions: they're called by Minecraft's internals automagically.

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.

Link to post
Share on other sites

@coolAlias:

 

Thanks, do i just copy that? I'm not very good with packet handlers!

 

That function, yes, and another.

 

public void onDataPacket(INetworkManager net, S35PacketUpdateTileEntity packet) {
    readFromNBT(packet.data);
}

 

(alert: this code was for 1.6.4, I just updating the packet class type, there MAY be other differences for 1.7)

They're both called automatically.

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.

Link to post
Share on other sites

Yes, just copy and paste this into your TileEntity:

@Override
public Packet getDescriptionPacket() {
NBTTagCompound tag = new NBTTagCompound();
this.writeToNBT(tag);
return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, tag);
}

@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
readFromNBT(packet.func_148857_g());
}

 

If that's not working for you, did you update your IInventory code to use markDirty() now that onInventoryChanged() has been removed from that interface? You need to use it to ensure the inventory changes are recorded, as far as I can tell.

Link to post
Share on other sites

It still doesn't work! Maybe im being stupid somewhere else in my tile entity:

 

package com.ljcoding.robotmod.robotworkshop;

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;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;

public class TileEntityWorkshop extends TileEntity implements IInventory {

private ItemStack[] items;

public TileEntityWorkshop() {
	items = new ItemStack[12];
}

@Override
public void closeInventory() {}

@Override
public void openInventory() {}

@Override
public ItemStack decrStackSize(int i, int count) {
	ItemStack itemstack = getStackInSlot(i);

	if(itemstack != null) {
		if(itemstack.stackSize <= count) {
			setInventorySlotContents(i, null);
		} else {
			itemstack = itemstack.splitStack(count);
			markDirty();
		}
	}

	return itemstack;
}

@Override
public String getInventoryName() {
	return "RobotWorkshop";
}

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

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

@Override
public ItemStack getStackInSlot(int i) {
	return items[i];
}

@Override
public ItemStack getStackInSlotOnClosing(int i) {
	ItemStack item = getStackInSlot(i);
	setInventorySlotContents(i, null);
	return item;
}

@Override
public boolean hasCustomInventoryName() {
	return true;
}

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

@Override
public boolean isUseableByPlayer(EntityPlayer player) {
	return player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 64;
}

@Override
public void setInventorySlotContents(int i, ItemStack itemstack) {
	items[i] = itemstack;

	if(itemstack != null && itemstack.stackSize > getInventoryStackLimit()) {
		itemstack.stackSize = getInventoryStackLimit();
	}

	markDirty();
}

@Override
public void writeToNBT(NBTTagCompound compound) {
	super.writeToNBT(compound);

	NBTTagList items = new NBTTagList();

	for(int i=0;i<getSizeInventory();i++) {
		ItemStack stack = getStackInSlot(i);
		if(stack != null) {
			NBTTagCompound item = new NBTTagCompound();
			item.setByte("Slot", (byte)i);
			stack.writeToNBT(compound);
			items.appendTag(item);
			System.out.println("Storing Stack "+i);
		}
	}

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

@Override
public void readFromNBT(NBTTagCompound compound) {
	super.readFromNBT(compound);

	NBTTagList items = compound.getTagList("Items", compound.getId());

	for (int i = 0; i < items.tagCount(); ++i) {
		NBTTagCompound item = items.getCompoundTagAt(i);
		byte slot = item.getByte("Slot");
		if (slot >= 0 && slot < getSizeInventory()) {
			setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item));
			System.out.println("Storing Stack "+i);
		}
	}
}

@Override
public Packet getDescriptionPacket() {
	NBTTagCompound tag = new NBTTagCompound();
	this.writeToNBT(tag);
	return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, tag);
}

@Override
	public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
	readFromNBT(packet.func_148857_g());
}
}

Link to post
Share on other sites

Main Class:

 

package com.ljcoding.robotmod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Items;
import net.minecraft.item.Item;

import com.ljcoding.robotmod.robotworkshop.BlockWorkshop;
import com.ljcoding.robotmod.robotworkshop.GuiHandler;
import com.ljcoding.robotmod.robotworkshop.TileEntityWorkshop;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid = RobotMod.MODID, version = RobotMod.VERSION)
public class RobotMod {

    public static final String MODID = "RobotMod";
    public static final String VERSION = "0.0.1";
    
    @Instance(value = MODID)
    public static RobotMod instance;
    
    //Creative Tabs
    public static CreativeTabs robotTab = new CreativeTabs("robotTab") {
	@Override
	public Item getTabIconItem() {
		return Items.paper;
	}
    };
    
    //Blocks
    public static final Block workshop = new BlockWorkshop(1000, Material.iron);
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
	GameRegistry.registerBlock(workshop, "Robot Workshop");
    }
    
    @EventHandler
    public void init(FMLInitializationEvent event) {
        new GuiHandler();
    	GameRegistry.registerTileEntity(TileEntityWorkshop.class, "tileentityworkshop");
    }
}

 

Block Class:

 

package com.ljcoding.robotmod.robotworkshop;

import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;

import com.ljcoding.robotmod.RobotMod;

import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class BlockWorkshop extends BlockContainer {

private IIcon icon;

public BlockWorkshop(int i, Material mat) {
	super(mat);
	this.setCreativeTab(RobotMod.robotTab);
	this.setStepSound(soundTypeMetal);
	this.setHardness(8f);
	this.setResistance(10f);
	this.setLightLevel(0.2f);
	this.setBlockName("Robot Workshop");
}

@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
	if(!world.isRemote) {
		FMLNetworkHandler.openGui(player, RobotMod.instance, 0, world, x, y, z);
	}
	return false;
}

@Override
public TileEntity createNewTileEntity(World var1, int var2) {
	return new TileEntityWorkshop();
}

 @Override
 @SideOnly(Side.CLIENT)
 public void registerBlockIcons(IIconRegister iconRegister) {
	 icon = iconRegister.registerIcon("robot:block_workshop");
 }

 @SideOnly(Side.CLIENT)
 @Override
 public IIcon getIcon(int i, int j) {
	 return icon;
 }
}

Link to post
Share on other sites
  • 3 months later...

The problem is that you are writing the ItemStack to compound, but adding item to the tag list. When you are reading from nbt, you are reading the contents of the tag list, which doesn't contain any of the ItemStacks. Changing

stack.writeToNBT(compound);

into

stack.writeToNBT(item);

in writeToNBT should fix this problem.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
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.



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Hi! I had this mod that adds new chest, and when i launch it in a single player world it works good. But when i try to load it on a server, i receive this error: 13.05 11:48:37 [Server] modloading-worker-11/INFO [ne.mi.co.ForgeMod/FORGEMOD]: Forge mod loading, version 36.1.13, for MC 1.16.5 with MCP 20210115.111550 13.05 11:48:37 [Server] modloading-worker-11/INFO [ne.mi.co.MinecraftForge/FORGE]: MinecraftForge v36.1.13 Initialized 13.05 11:48:37 [Server] modloading-worker-2/ERROR [ne.mi.fm.ja.FMLModContainer/LOADING]: Failed to create mod instance. ModID: tenchest, class com.ike.tenchest.TenChest 13.05 11:48:37 [Server] INFO java.lang.BootstrapMethodError: java.lang.IllegalAccessError: no such constructor: com.ike.tenchest.minichest.MiniChest.<init>()void/newInvokeSpecial 13.05 11:48:37 [Server] INFO at com.ike.tenchest.Blocks.<clinit>(Blocks.java:63) ~[tenchest:1.0] {re:classloading,pl:runtimedistcleaner:A} 13.05 11:48:37 [Server] INFO at com.ike.tenchest.TenChest.<init>(TenChest.java:54) ~[tenchest:1.0] {re:classloading} 13.05 11:48:37 [Server] INFO at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:81) ~[forge:36.1] {re:classloading} 13.05 11:48:37 [Server] INFO at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:120) ~[forge:?] {re:classloading} 13.05 11:48:37 [Server] INFO at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1640) [?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1632) [?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) [?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) [?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) [?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175) [?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO Caused by: java.lang.IllegalAccessError: no such constructor: com.ike.tenchest.minichest.MiniChest.<init>()void/newInvokeSpecial 13.05 11:48:37 [Server] INFO at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:483) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO ... 15 more 13.05 11:48:37 [Server] INFO Caused by: java.lang.NoClassDefFoundError: net/minecraft/tileentity/IChestLid 13.05 11:48:37 [Server] INFO at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.lang.ClassLoader.defineClass(ClassLoader.java:756) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:138) ~[modlauncher-8.0.9.jar:?] {re:classloading} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:98) ~[modlauncher-8.0.9.jar:?] {re:classloading} 13.05 11:48:37 [Server] INFO at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.eventbus.EventSubclassTransformer.buildEvents(EventSubclassTransformer.java:62) ~[eventbus-4.0.0.jar:?] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.eventbus.EventSubclassTransformer.transform(EventSubclassTransformer.java:44) ~[eventbus-4.0.0.jar:?] {} 13.05 11:48:37 [Multicraft] Skipped 83 lines due to rate limit (30/s) 13.05 11:48:37 [Server] main/FATAL [ne.mi.fm.ModLoader/LOADING]: Failed to complete lifecycle event CONSTRUCT, 1 errors found 13.05 11:48:37 [Server] main/FATAL [ne.mi.co.ForgeMod/]: Preparing crash report with UUID 449cf277-bc9c-4a21-b16a-3f07d0d4e0c4 13.05 11:48:37 [Server] main/INFO [STDOUT/]: [net.minecraft.crash.CrashReport:func_85057_a:196]: Negative index in crash report handler (16/18) 13.05 11:48:37 [Server] main/FATAL [ne.mi.fm.se.ServerModLoader/]: Crash report saved to ./crash-reports/crash-2021-05-13_11.48.37-fml.txt 13.05 11:48:37 [Server] INFO ---- Minecraft Crash Report ---- 13.05 11:48:37 [Server] INFO // Daisy, daisy... 13.05 11:48:37 [Server] INFO Time: 5/13/21 11:48 AM 13.05 11:48:37 [Server] INFO Description: Mod loading error has occurred 13.05 11:48:37 [Server] INFO java.lang.Exception: Mod Loading has failed 13.05 11:48:37 [Server] INFO at net.minecraftforge.fml.CrashReportExtender.dumpModLoadingCrashReport(CrashReportExtender.java:85) ~[forge:?] {re:classloading} 13.05 11:48:37 [Server] INFO at net.minecraftforge.fml.server.ServerModLoader.load(ServerModLoader.java:51) ~[forge:?] {re:classloading} 13.05 11:48:37 [Server] INFO at net.minecraft.server.Main.main(Main.java:95) ~[?:?] {re:classloading} 13.05 11:48:37 [Server] INFO at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_292] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.fml.loading.FMLServerLaunchProvider.lambda$launchService$0(FMLServerLaunchProvider.java:51) ~[forge_1.16.5.jar:36.1] {} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.0.9.jar:?] {} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.0.9.jar:?] {} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.0.9.jar:?] {} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.0.9.jar:?] {} 13.05 11:48:37 [Server] INFO at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.0.9.jar:?] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.server.ServerMain$Runner.runLauncher(ServerMain.java:63) [forge_1.16.5.jar:?] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.server.ServerMain$Runner.access$100(ServerMain.java:60) [forge_1.16.5.jar:?] {} 13.05 11:48:37 [Server] INFO at net.minecraftforge.server.ServerMain.main(ServerMain.java:57) [forge_1.16.5.jar:?] {} 13.05 11:48:37 [Server] INFO A detailed walkthrough of the error, its code path and all known details is as follows: 13.05 11:48:38 [Multicraft] Server shut down (running) 13.05 11:48:38 [Multicraft] Restarting crashed server in 300 seconds 13.05 11:48:38 [Multicraft] Server stopped 13.05 11:50:33 [Multicraft] Received kill command 13.05 11:50:33 [Multicraft] Server stopped What can i do?
    • This is wrong, they still ship J8 for <1.17 So for any of the versions that arnt the latest snapshot use J8.
    • Post your debug.log if it is crashing when you are trying to play. If it crashes when you are downloading mods, well, that's a computer issue, not a MC/forge issue, and you probably need a computer tech, or someone to help you.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.