Jump to content

[SOLVED][1.8.9] Learning NBT, keep crashing my game


Armetron

Recommended Posts

so I just started making my own mods for minecraft so I am a complete greenhorn however a do have java experience that I have had to brush up on.

 

I've gotten to the point where I want to make my items "do" something, specifically this item will eventually create an invisible lily pad platform on top of any water source blocks around you.

 

What I'm trying to achieve is have my item hold a Boolean value that determines if it is "on" or "off." To test this I want to feed the Boolean value into the hasEffect function so I can use the enchanted effect as a visual representation of what state it's in.

 

I feel like I'm close but I still have trouble wrapping my head around NBT data.

 

my code

public class MagicTester extends Item {

public MagicTester(String unlocalizedName) {
	super();

	this.setUnlocalizedName(unlocalizedName);
	this.setCreativeTab(CreativeTabs.tabMaterials);
}

@Override
public ItemStack onItemRightClick(ItemStack stack, World par2World, EntityPlayer par3EntityPlayer) {
	if (stack.getTagCompound() == null) {
		stack.setTagCompound(new NBTTagCompound());
	}
	NBTTagCompound nbt = stack.getTagCompound();
	nbt.setBoolean("active", !(nbt.getBoolean("active")));
	stack.getTagCompound().setTag("active", nbt);
	return stack;
}

@Override
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack stack) {
	NBTTagCompound nbt = (NBTTagCompound) stack.getTagCompound().getTag("active");
	boolean active = nbt.getBoolean("active");
	return active;
}

}

 

If you know a good tutorial that talks about nbt data I would much appreciate it

Link to comment
Share on other sites

@Override
public ItemStack onItemRightClick(ItemStack stack, World par2World, EntityPlayer par3EntityPlayer) {
	NBTTagCompound nbt = stack.getTagCompound();
	if (nbt == null) {
		nbt = new NBTTagCompound();
		stack.setTagCompound(nbt);
	}
	nbt.setBoolean("active", !(nbt.getBoolean("active"))); // "nbt" is alredy itemStack's NBT, you are now setting value inside of it - a "active" boolean.
	return stack;
}

@Override
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack stack) {
	NBTTagCompound nbt = stack.getTagCompound(); // nbt of itemStack
	boolean active = nbt.getBoolean("active"); // value stored inside nbt marked wtih "active" key.
	return active;
}

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

Woot, it works!!!

 

funny thing is at first it still crashed, the reson was that when hasEffect was being called the item in my saved world did not have nbt data yet so it was returning a null.

 

so I added a condition that if at the beggining of the hasEffect if getTagCompound == null then it makes a new NBTTagCompound

 

@Override
public ItemStack onItemRightClick(ItemStack stack, World par2World, EntityPlayer par3EntityPlayer) {
	NBTTagCompound nbt = stack.getTagCompound();
	if (nbt == null) {
		nbt = new NBTTagCompound();
		stack.setTagCompound(nbt);
	}
	nbt.setBoolean("active", !(nbt.getBoolean("active")));
	System.out.println(nbt.getBoolean("active"));           //Used to test before adding hasEffect
	return stack;
}

@Override
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack stack) {
	if (stack.getTagCompound() == null) {
		stack.setTagCompound(new NBTTagCompound());
	}

	NBTTagCompound nbt = stack.getTagCompound();
	boolean active = nbt.getBoolean("active");
	return active;
}

 

CODING DOGE IS BEST DOGE!!!!!

Link to comment
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.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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