Jump to content

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


Recommended Posts

Posted

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

Posted
@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.

Posted

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

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

    • Thanks, I've now installed a slightly newer version and the server is at least starting up now.
    • i have the same issue. Found 1 Create mod class dependency(ies) in createdeco-1.3.3-1.19.2.jar, which are missing from the current create-1.19.2-0.5.1.i.jar Found 11 Create mod class dependency(ies) in createaddition-fabric+1.19.2-20230723a.jar, which are missing from the current create-1.19.2-0.5.1.i.jar Detailed walkthrough of mods which rely on missing Create mod classes: Mod: createaddition-fabric+1.19.2-20230723a.jar Missing classes of create: com/simibubi/create/compat/jei/category/sequencedAssembly/JeiSequencedAssemblySubCategory com/simibubi/create/compat/recipeViewerCommon/SequencedAssemblySubCategoryType com/simibubi/create/compat/rei/CreateREI com/simibubi/create/compat/rei/EmptyBackground com/simibubi/create/compat/rei/ItemIcon com/simibubi/create/compat/rei/category/CreateRecipeCategory com/simibubi/create/compat/rei/category/WidgetUtil com/simibubi/create/compat/rei/category/animations/AnimatedBlazeBurner com/simibubi/create/compat/rei/category/animations/AnimatedKinetics com/simibubi/create/compat/rei/category/sequencedAssembly/ReiSequencedAssemblySubCategory com/simibubi/create/compat/rei/display/CreateDisplay Mod: createdeco-1.3.3-1.19.2.jar Missing classes of create: com/simibubi/create/content/kinetics/fan/SplashingRecipe
    • The crash points to moonlight lib - try other builds or make a test without this mod and the mods requiring it
    • Do you have shaders enabled? There is an issue with the mod simpleclouds - remove this mod or disable shaders, if enabled  
    • Maybe you need to create file in assets/<modid>/items/<itemname>.json with content like this:   { "model": { "type": "minecraft:model", "model": "modname:item/itemname" } }  
  • Topics

×
×
  • Create New...

Important Information

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