Jump to content

Recommended Posts

Posted (edited)

I'm having two issues with my custom item, both of which I suspect are related to NBT data.

 

Firstly, the addInformation method crashes the game on loading. This might have to do with some of the necessary variables not being initialized at that point in loading but I can't find anything that could help with that issue.

 

Second, right-clicking with the item for some reason causes the entire stack to disappear. Just to make sure it wasn't just using up only one of them, I changed the max stack size and it still removed the entire stack.

 

public class ItemStandArrow extends Item{
	
	private static final String name = "standArrow";
	public ItemStandArrow()
    {
		super();
        setUnlocalizedName(name);
        setCreativeTab(CreativeTabs.TOOLS);
        setMaxStackSize(1);
    }
	
	@Override
	public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand)
	{
	    NBTTagCompound nbt;
	    ItemStack stack = player.getActiveItemStack();
	    NBTTagList nbttaglist;

	    if (stack.hasTagCompound())
	    {
	        nbt = stack.getTagCompound();
	    }
	    else
	    {
	        nbt = new NBTTagCompound();
	    }
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    	for (int i = 0; i<nbttaglist.tagCount(); i++){
	    		if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){
	    			System.out.println("Failed to use arrow");
	    			return new ActionResult<ItemStack>(EnumActionResult.FAIL, stack);
	    		}
	    	}
	    }
	    StandHandlingMethods.grantRandomStandFromTable(player, null);
	    System.out.println("Successfully used arrow");
	    return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
	}
	
	public void addEntityToBlacklist(Entity entity, NBTTagCompound nbt, ItemStack stack){
	    NBTTagList nbttaglist;
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    }
	    else{
	    	nbttaglist = new NBTTagList();
	    }
	    
	    String entityId = entity.getUniqueID().toString();
	    NBTTagCompound compound = new NBTTagCompound();
	    compound.setString("name", entityId);
	    
	    nbttaglist.appendTag(compound);
	    
	    nbt.setTag("usedOn", nbttaglist);
	    
	    stack.setTagCompound(nbt);
	}

	@Override
	@SideOnly(Side.CLIENT)
	public void addInformation(ItemStack stack, @Nullable World worldIn,
			java.util.List<String> tooltip, ITooltipFlag flagIn) {
		NBTTagCompound nbt = stack.getTagCompound();
		NBTTagList nbttaglist;
		EntityPlayer player = Minecraft.getMinecraft().player;
		
		super.addInformation(stack, worldIn, tooltip, flagIn);
		
		if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    	for (int i = 0; i<nbttaglist.tagCount(); i++){
	    		if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){
	    			tooltip.add("Already used by " + player.getDisplayName());
	    		}
	    	}
	    }
	}
}

 

Edited by MythicalChromosome
Posted
  On 12/31/2017 at 3:13 AM, MythicalChromosome said:

NBTTagList nbttaglist;

Expand  

 

  On 12/31/2017 at 3:13 AM, MythicalChromosome said:

if (nbt.hasKey("usedOn")){ nbttaglist = (NBTTagList) nbt.getTag("usedOn"); for (int i = 0; i<nbttaglist.tagCount(); i++){ if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){ tooltip.add("Already used by " + player.getDisplayName()); } } }

Expand  

What if it doesn't have "usedOn"? "nbttaglist" is null. That's a NullPointerException.

Posted

Hey,

 

Looks like you forgot to check if the NBT tag is null in addInformation (or call stack.hasTagCompound()).

 

For the right click one, you should use the player.getHeldItem(hand) instead of getActiveItem(), which is for items you're using over a time period, like food and bows. That is probably empty when that right click is called, which is returning an empty item in the result. 

  • Like 2
Posted (edited)
    @Override
    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) 
    {
        EntityPlayer playerIn = Minecraft.getMinecraft().player;	
        super.addInformation(stack, worldIn, tooltip, flagIn);
		
        if (stack.getTagCompound() != null && nbt.hasKey("usedOn"))
        {
            NBTTagCompound nbt = stack.getTagCompound();

            if (nbt.getTag("usedOn") != null
            {
                NBTTagList list = (NBTTagList) nbt.getTag("usedOn");
        
                for (int i = 0; i < list.tagCount(); ++i)
                {
                    if (list.getStringTagAt(i) == playerIn.getUniqueID().toString())
                    {
                        tooltip.add("Already used by " + playerIn.getDisplayName());
                    }
                }
            }
        }
    }

There, that's better.

You have to add null checks, not everything is present all the time.

Edited by Differentiation
  • Like 1
Posted (edited)
  On 12/31/2017 at 3:33 AM, Differentiation said:
    @Override
    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) 
    {
        EntityPlayer playerIn = Minecraft.getMinecraft().player;	
        super.addInformation(stack, worldIn, tooltip, flagIn);
		
        if (stack.getTagCompound() != null && nbt.hasKey("usedOn"))
        {
            NBTTagCompound nbt = stack.getTagCompound();

            if (nbt.getTag("usedOn") != null
            {
                NBTTagList list = (NBTTagList) nbt.getTag("usedOn");
        
                for (int i = 0; i < list.tagCount(); ++i)
                {
                    if (list.getStringTagAt(i) == playerIn.getUniqueID().toString())
                    {
                        tooltip.add("Already used by " + playerIn.getDisplayName());
                    }
                }
            }
        }
    }

There, that's better.

You have to add null checks, not everything is present all the time.

Expand  

I'm going to assume this is a typo, but you have nbt.hasKey() being called before nbt is initialized.

Edited by MythicalChromosome
I just realized nbt could be moved to be initialized earlier and just nullcheck that instead of stack.getTagCompound(), derp
  • Like 1
Posted (edited)
  On 12/31/2017 at 4:25 PM, MythicalChromosome said:

I'm going to assume this is a typo, but you have nbt.hasKey() being called before nbt is initialized.

Expand  
    @Override
    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flag) 
    {
        EntityPlayer playerIn = Minecraft.getMinecraft().player;	
        super.addInformation(stack, worldIn, tooltip, flag);
		
        if (stack.getTagCompound() != null)
        {
            NBTTagCompound nbt = stack.getTagCompound();

            if (nbt.getTag("usedOn") != null && nbt.hasKey("usedOn"))
            {
                NBTTagList list = (NBTTagList) nbt.getTag("usedOn");
        
                for (int i = 0; i < list.tagCount(); ++i)
                {
                    if (list.getStringTagAt(i) == playerIn.getUniqueID().toString())
                    {
                        tooltip.add("Already used by " + playerIn.getDisplayName());
                    }
                }
            }
        }
    }

Sorry, that's better.

Edited by Differentiation
  • Like 1
Posted

Argh, NBT with itemstacks is confusing...

 

Both of my original issues were fixed, but now I have a new one showing up. The item reports a successful usage whenever it's right-clicked with, rather than only the first time it's right-clicked as it's supposed to. The method that's supposed to blacklist entities from using it is definitely being called, but it doesn't seem to be doing anything. I imagine this has something to do with problems reading from or writing to NBT, how would I go about fixing this?

 

@Override
	public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand)
	{
	    NBTTagCompound nbt;
	    ItemStack stack = player.getHeldItem(hand);
	    NBTTagList nbttaglist;

	    if (stack.hasTagCompound())
	    {
	        nbt = stack.getTagCompound();
	    }
	    else
	    {
	        nbt = new NBTTagCompound();
	    }
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    	for (int i = 0; i<nbttaglist.tagCount(); i++){
	    		if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){
	    			System.out.println("Failed to use arrow");
	    			return new ActionResult<ItemStack>(EnumActionResult.FAIL, stack);
	    		}
	    	}
	    }
	    StandHandlingMethods.grantRandomStandFromTable(player, null); //stub so far
	    addEntityToBlacklist(player, nbt, stack);
	    System.out.println("Successfully used arrow");
	    return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
	}
	
	public void addEntityToBlacklist(Entity entity, NBTTagCompound nbt, ItemStack stack){
	    NBTTagList nbttaglist;
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    }
	    else{
	    	nbttaglist = new NBTTagList();
	    }
	    
	    String entityId = entity.getUniqueID().toString();
	    NBTTagCompound compound = new NBTTagCompound();
	    compound.setString("name", entityId);
	    
	    nbttaglist.appendTag(compound);
	    
	    nbt.setTag("usedOn", nbttaglist);
	    
	    System.out.println("Blacklisted " + entityId + " from using this Arrow");
	    
	    stack.setTagCompound(nbt);
	}

	@Override
	@SideOnly(Side.CLIENT)
	public void addInformation(ItemStack stack, @Nullable World worldIn,
			java.util.List<String> tooltip, ITooltipFlag flagIn) {
		
		NBTTagList nbttaglist;
		EntityPlayer player = Minecraft.getMinecraft().player;
		
		
		super.addInformation(stack, worldIn, tooltip, flagIn);
		
		if (stack.getTagCompound() != null){
			NBTTagCompound nbt = stack.getTagCompound();
			if (nbt.getTag("usedOn") != null && nbt.hasKey("usedOn")){
		    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
		    	for (int i = 0; i<nbttaglist.tagCount(); i++){
		    		if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){
		    			tooltip.add("Already used by " + player.getDisplayName());
		    		}
		    	}
		    }
		}
	}

(Reuploaded code because I changed it somewhat significantly in the interrim)

Posted (edited)
  On 12/31/2017 at 5:16 PM, MythicalChromosome said:

Argh, NBT with itemstacks is confusing...

 

Both of my original issues were fixed, but now I have a new one showing up. The item reports a successful usage whenever it's right-clicked with, rather than only the first time it's right-clicked as it's supposed to. The method that's supposed to blacklist entities from using it is definitely being called, but it doesn't seem to be doing anything. I imagine this has something to do with problems reading from or writing to NBT, how would I go about fixing this?

 

@Override
	public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand)
	{
	    NBTTagCompound nbt;
	    ItemStack stack = player.getHeldItem(hand);
	    NBTTagList nbttaglist;

	    if (stack.hasTagCompound())
	    {
	        nbt = stack.getTagCompound();
	    }
	    else
	    {
	        nbt = new NBTTagCompound();
	    }
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    	for (int i = 0; i<nbttaglist.tagCount(); i++){
	    		if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){
	    			System.out.println("Failed to use arrow");
	    			return new ActionResult<ItemStack>(EnumActionResult.FAIL, stack);
	    		}
	    	}
	    }
	    StandHandlingMethods.grantRandomStandFromTable(player, null); //stub so far
	    addEntityToBlacklist(player, nbt, stack);
	    System.out.println("Successfully used arrow");
	    return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
	}
	
	public void addEntityToBlacklist(Entity entity, NBTTagCompound nbt, ItemStack stack){
	    NBTTagList nbttaglist;
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    }
	    else{
	    	nbttaglist = new NBTTagList();
	    }
	    
	    String entityId = entity.getUniqueID().toString();
	    NBTTagCompound compound = new NBTTagCompound();
	    compound.setString("name", entityId);
	    
	    nbttaglist.appendTag(compound);
	    
	    nbt.setTag("usedOn", nbttaglist);
	    
	    System.out.println("Blacklisted " + entityId + " from using this Arrow");
	    
	    stack.setTagCompound(nbt);
	}

	@Override
	@SideOnly(Side.CLIENT)
	public void addInformation(ItemStack stack, @Nullable World worldIn,
			java.util.List<String> tooltip, ITooltipFlag flagIn) {
		
		NBTTagList nbttaglist;
		EntityPlayer player = Minecraft.getMinecraft().player;
		
		
		super.addInformation(stack, worldIn, tooltip, flagIn);
		
		if (stack.getTagCompound() != null){
			NBTTagCompound nbt = stack.getTagCompound();
			if (nbt.getTag("usedOn") != null && nbt.hasKey("usedOn")){
		    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
		    	for (int i = 0; i<nbttaglist.tagCount(); i++){
		    		if (nbttaglist.getStringTagAt(i) == player.getUniqueID().toString()){
		    			tooltip.add("Already used by " + player.getDisplayName());
		    		}
		    	}
		    }
		}
	}

(Reuploaded code because I changed it somewhat significantly in the interrim)

Expand  

I tried playing with it myself and it just doesn't seem to work. 
You can do it my way by just adding to player capability. I do it this way:

public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand)
{
  DinocraftPlayer player = DinocraftPlayer.getEntityPlayer(playerIn);
  
  if (!player.getActions().hasUsedItem1())
  {
    player.setHasUsedItem1(true);
    return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
  }
  else
  {
    return new ActionResult<ItemStack>(EnumActionResult.FAIL, stack);
  }
}

Now the player can't use this item until they die. And then the process repeats.

 

For your case, it is best to use player capabilities since the item usage data is unique to the player itself and not the item.

Edited by Differentiation
Posted

I thought of using capabilities, but from what I see that makes it so that the item can only be used once in total. The idea I was going for was that the player could find more than one of those items, and could only use each one on themselves once. Your solution isn't quite what I'm going for, but I can't figure out how to make it so that each of the items can only be used once EACH without using NBT... hmm.

Posted (edited)
  On 12/31/2017 at 10:58 PM, MythicalChromosome said:

I thought of using capabilities, but from what I see that makes it so that the item can only be used once in total. The idea I was going for was that the player could find more than one of those items, and could only use each one on themselves once. Your solution isn't quite what I'm going for, but I can't figure out how to make it so that each of the items can only be used once EACH without using NBT... hmm.

Expand  

Wait, wait, wait, wait!! Are you trying to make it so that you can use the item once PER PLAYER?? Or every player can use that item once. So for example, if I use the item and I give it to another player, should they be able to use it?

Edited by Differentiation
Posted

Yeah. I probably should've made that clear earlier, but it should be like this:

1. Each individual item can only be used once per player, i.e. if a player finds another one they can use that item even if they've already used a different one.

2. Each item can be used an infinite number of times, but only once by any individual player, meaning they're reusable by a different person. So yes, if you give it to another player after using it they should also be able to use it.

Posted (edited)
  On 12/31/2017 at 11:46 PM, MythicalChromosome said:

Yeah. I probably should've made that clear earlier, but it should be like this:

1. Each individual item can only be used once per player, i.e. if a player finds another one they can use that item even if they've already used a different one.

2. Each item can be used an infinite number of times, but only once by any individual player, meaning they're reusable by a different person. So yes, if you give it to another player after using it they should also be able to use it.

Expand  

Yeah, I see that's why you used the UUID. I couldn't figure it out myself since I'm not that good at NBTs.

Best of luck figuring out the solution!

Edited by Differentiation
  • Like 1
Posted
  On 1/1/2018 at 12:26 AM, MythicalChromosome said:

Heh, well, thanks for your support anyways. If I figure out a solution to what I was looking for I'll post it here.

 

(Btw, happy new year!)

Expand  

I would like to see the solution if you figure it out. I myself don't have such a good experience with NBT, but I would like to see what you ended up doing.

Happy New Year to you as well. Here in New York, New Year is in 5 hours! :) 

  • Like 1
Posted
  On 1/1/2018 at 12:34 AM, Differentiation said:

I would like to see the solution if you figure it out. I myself don't have such a good experience with NBT, but I would like to see what you ended up doing.

Happy New Year to you as well. Here in New York, New Year is in 5 hours! :) 

Expand  

After a bit more debugging, the solution to my problem turned out to be simple (as it usually tends to be...:P)

 

I wasn't checking against the tag correctly. The method I was using was checking against the entire tag as a string, when it should've been checking against the value. Simply changing the method called made it work perfectly as intended:

public class ItemStandArrow extends Item{
	
	private static final String name = "standArrow";
	public ItemStandArrow()
    {
		super();
        setUnlocalizedName(name);
        setCreativeTab(CreativeTabs.TOOLS);
        setMaxStackSize(1);
    }
	
	@Override
	public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand)
	{
	    NBTTagCompound nbt;
	    ItemStack stack = player.getHeldItem(hand);
	    NBTTagList nbttaglist;

	    if (stack.hasTagCompound())
	    {
	        nbt = stack.getTagCompound();
	    }
	    else
	    {
	        nbt = new NBTTagCompound();
	    }
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    	for (int i = 0; i<nbttaglist.tagCount(); i++){
	    		System.out.println("Checking index " + i + ": "+ nbttaglist.getStringTagAt(i));
	    		if (nbttaglist.getCompoundTagAt(i).getString("name").equals(player.getUniqueID().toString())){
	    			System.out.println("Failed to use arrow");
	    			return new ActionResult<ItemStack>(EnumActionResult.FAIL, stack);
	    		}
	    	}
	    }
	    StandHandlingMethods.grantRandomStandFromTable(player, null); //stub so far
	    addEntityToBlacklist(player, nbt, stack);
	    System.out.println("Successfully used arrow");
	    return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
	}
	
	public void addEntityToBlacklist(Entity entity, NBTTagCompound nbt, ItemStack stack){
	    NBTTagList nbttaglist;
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    }
	    else{
	    	nbttaglist = new NBTTagList();
	    }
	    
	    String entityId = entity.getUniqueID().toString();
	    NBTTagCompound compound = new NBTTagCompound();
	    compound.setString("name", entityId);
	    
	    nbttaglist.appendTag(compound);
	    
	    nbt.setTag("usedOn", nbttaglist);
	    
	    stack.setTagCompound(nbt);
	    
	    System.out.println("Blacklisted " + entityId + " from using this Arrow");
	    
	    
	}

	@Override
	@SideOnly(Side.CLIENT)
	public void addInformation(ItemStack stack, @Nullable World worldIn,
			java.util.List<String> tooltip, ITooltipFlag flagIn) {
		
		NBTTagList nbttaglist;
		EntityPlayer player = Minecraft.getMinecraft().player;
		
		
		super.addInformation(stack, worldIn, tooltip, flagIn);
		
		if (stack.getTagCompound() != null){
			NBTTagCompound nbt = stack.getTagCompound();
			if (nbt.getTag("usedOn") != null && nbt.hasKey("usedOn")){
		    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
		    	for (int i = 0; i<nbttaglist.tagCount(); i++){
		    		if (nbttaglist.getCompoundTagAt(i).getString("name").equals(player.getUniqueID().toString())){
		    			tooltip.add("Already used by " + player.getName());
		    		}
		    	}
		    }
		}
	}
}

So the problem wasn't in writing to and reading from the ItemStack's NBT data, it was in how I was interpreting the data within the program.

 

Hopefully you learned some more about NBT from this, as I did.

Posted
  On 1/3/2018 at 4:53 PM, MythicalChromosome said:

After a bit more debugging, the solution to my problem turned out to be simple (as it usually tends to be...:P)

 

I wasn't checking against the tag correctly. The method I was using was checking against the entire tag as a string, when it should've been checking against the value. Simply changing the method called made it work perfectly as intended:

public class ItemStandArrow extends Item{
	
	private static final String name = "standArrow";
	public ItemStandArrow()
    {
		super();
        setUnlocalizedName(name);
        setCreativeTab(CreativeTabs.TOOLS);
        setMaxStackSize(1);
    }
	
	@Override
	public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand)
	{
	    NBTTagCompound nbt;
	    ItemStack stack = player.getHeldItem(hand);
	    NBTTagList nbttaglist;

	    if (stack.hasTagCompound())
	    {
	        nbt = stack.getTagCompound();
	    }
	    else
	    {
	        nbt = new NBTTagCompound();
	    }
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    	for (int i = 0; i<nbttaglist.tagCount(); i++){
	    		System.out.println("Checking index " + i + ": "+ nbttaglist.getStringTagAt(i));
	    		if (nbttaglist.getCompoundTagAt(i).getString("name").equals(player.getUniqueID().toString())){
	    			System.out.println("Failed to use arrow");
	    			return new ActionResult<ItemStack>(EnumActionResult.FAIL, stack);
	    		}
	    	}
	    }
	    StandHandlingMethods.grantRandomStandFromTable(player, null); //stub so far
	    addEntityToBlacklist(player, nbt, stack);
	    System.out.println("Successfully used arrow");
	    return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
	}
	
	public void addEntityToBlacklist(Entity entity, NBTTagCompound nbt, ItemStack stack){
	    NBTTagList nbttaglist;
	    
	    if (nbt.hasKey("usedOn")){
	    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
	    }
	    else{
	    	nbttaglist = new NBTTagList();
	    }
	    
	    String entityId = entity.getUniqueID().toString();
	    NBTTagCompound compound = new NBTTagCompound();
	    compound.setString("name", entityId);
	    
	    nbttaglist.appendTag(compound);
	    
	    nbt.setTag("usedOn", nbttaglist);
	    
	    stack.setTagCompound(nbt);
	    
	    System.out.println("Blacklisted " + entityId + " from using this Arrow");
	    
	    
	}

	@Override
	@SideOnly(Side.CLIENT)
	public void addInformation(ItemStack stack, @Nullable World worldIn,
			java.util.List<String> tooltip, ITooltipFlag flagIn) {
		
		NBTTagList nbttaglist;
		EntityPlayer player = Minecraft.getMinecraft().player;
		
		
		super.addInformation(stack, worldIn, tooltip, flagIn);
		
		if (stack.getTagCompound() != null){
			NBTTagCompound nbt = stack.getTagCompound();
			if (nbt.getTag("usedOn") != null && nbt.hasKey("usedOn")){
		    	nbttaglist = (NBTTagList) nbt.getTag("usedOn");
		    	for (int i = 0; i<nbttaglist.tagCount(); i++){
		    		if (nbttaglist.getCompoundTagAt(i).getString("name").equals(player.getUniqueID().toString())){
		    			tooltip.add("Already used by " + player.getName());
		    		}
		    	}
		    }
		}
	}
}

So the problem wasn't in writing to and reading from the ItemStack's NBT data, it was in how I was interpreting the data within the program.

 

Hopefully you learned some more about NBT from this, as I did.

Expand  

A very silly mistake indeed :P

I'm glad you figured it out.

Happy modding!

  • Like 1

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

    • As a stay-at-home dad and a farmer in Kentucky, my primary focus has always been on nurturing my family and managing our land. When Bitcoin began to gain traction, I saw it as a potential opportunity to secure our financial future. With my wife encouragement, I decided to invest $10,000 from our savings into cryptocurrency. Over time, my investment flourished beyond my wildest dreams, eventually soaring to an astonishing $200,000. Just as I began to feel a sense of financial security, disaster struck. In a shocking act of betrayal fueled by jealousy, my wife hacked into my email and gained access to my Bitcoin wallet. The devastation I felt was overwhelming years of careful planning and smart investing were wiped out in an instant. I was left feeling helpless and uncertain, grappling with the fear that I might never recover what I had lost. In the midst of this turmoil, a close friend reached out to me and mentioned RAPID DIGITAL RECOVERY. Desperate for a solution but still holding onto a glimmer of hope, I contacted them, praying for a lifeline. Their team responded promptly, providing both reassurance and a clear plan of action. With remarkable expertise, they tracked down the digital footprints left by the theft and successfully recovered a substantial portion of my stolen funds. But their assistance didn’t end there. Understanding the vulnerability I felt after such a betrayal, they also offered invaluable advice on how to strengthen my digital security to prevent future breaches. Their support was not just technical; it was a source of empowerment that helped me regain my confidence and sense of control over my financial situation. While the betrayal was a painful lesson, it ultimately taught me resilience and the importance of safeguarding my assets. Thanks to RAPID DIGITAL RECOVERY, I didn’t just reclaim my lost Bitcoin; I also regained my peace of mind. This experience has transformed my perspective on both trust and security in the digital age. I now approach investments with a renewed sense of caution and awareness, ensuring that I protect not only my financial future but also my emotional well-being. The journey has been challenging, but it has also been a testament to my strength and determination to rise above adversity as I continue to balance my roles as a dad and a farmer.
    • Same issue without Oculus Flywheel Compat?
    • When i start my game with a shader active the game crashes with this Error: java.lang.NoSuchFieldError: TESSELATION_SHADERS Minecraft java 1.20.1 in forge 47.4.0 crash report in pastebin: https://pastebin.com/6xiwHqZW thanks in advance
    • If you are using AMD/ATI, update your drivers - get the drivers from their website - do not update via system
    • Not sure why this is happening, but I would love some help. The reason I restarted the server was because I was getting an error while trying to join regarding this "Internal Exception: io.netty.handler.codec.DecoderException: io.netty.handler.codec.EncoderException: java.io.IOException: Root tag must be a named compound tag" Im using ServerMiner if thats any help
  • Topics

×
×
  • Create New...

Important Information

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