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
12 minutes ago, MythicalChromosome said:

NBTTagList nbttaglist;

 

13 minutes ago, 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()); } } }

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)
12 hours ago, 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.

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)
19 minutes ago, MythicalChromosome said:

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

    @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)
5 hours ago, 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)

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)
38 minutes ago, 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.

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)
15 minutes ago, 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.

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
20 minutes ago, Differentiation said:

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!

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!)

  • Like 1
Posted
7 minutes ago, 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!)

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 12/31/2017 at 6:34 PM, 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! :) 

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
11 minutes ago, 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.

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

    • When I first heard about Bitcoin back in 2018, I was skeptical. The idea of a decentralized, digital currency seemed too good to be true. But I was intrigued as I learned more about the technology behind it and its potential. I started small, investing just a few hundred dollars, dipping my toes into the cryptocurrency waters. At first, it was exhilarating to watch the value of my investment grow exponentially. I felt like I was part of the future, an early adopter of this revolutionary new asset. But that euphoria was short-lived. One day, I logged into my digital wallet only to find it empty - my Bitcoin had vanished without a trace. It turned out that the online exchange I had trusted had been hacked, and my funds were stolen. I was devastated, both financially and emotionally. All the potential I had seen in Bitcoin was tainted by the harsh reality that with decentralization came a lack of regulation and oversight. My hard-earned money was gone, lost to the ether of the digital world. This experience taught me a painful lesson about the price of trust in the uncharted territory of cryptocurrency. While the technology holds incredible promise, the risks can be catastrophic if you don't approach it with extreme caution. My Bitcoin investment gamble had failed, and I was left to pick up the pieces, wiser but poorer for having placed my faith in the wrong hands. My sincere appreciation goes to MUYERN TRUST HACKER. You are my hero in recovering my lost funds. Send a direct m a i l ( muyerntrusted ( @ ) mail-me ( . )c o m ) or message on whats app : + 1 ( 4-4-0 ) ( 3 -3 -5 ) ( 0-2-0-5 )
    • You could try posting a log (if there is no log at all, it may be the launcher you are using, the FAQ may have info on how to enable the log) as described in the FAQ, however this will probably need to be reported to/remedied by the mod author.
    • So me and a couple of friends are playing with a shitpost mod pack and one of the mods in the pack is corail tombstone and for some reason there is a problem with it, where on death to fire the player will get kicked out of the server and the tombstone will not spawn basically deleting an entire inventory, it doesn't matter what type of fire it is, whether it's from vanilla fire/lava, or from modded fire like ice&fire/lycanites and it's common enough to where everyone on the server has experienced at least once or twice and it doesn't give any crash log. a solution to this would be much appreciated thank you!
    • It is 1.12.2 - I have no idea if there is a 1.12 pack
  • Topics

×
×
  • Create New...

Important Information

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