Jump to content

[Solved]How would I use NBT on a Item( to store a randomly generated number)


Recommended Posts

Posted

Please Help! How would I use NBT on a Item to store a randomly generated number? I look at the tutorial for NBT Tags, but there is not the same functions used in a Item class? Is this possible?

 

THANKS TO HYDROFLAME!!!

Not new to java >> New to modding.

Posted

the nbt is not stored in the Item class but in a variable contained by the ItemStack

 

most function that Item has will give you a ItemStack as argument

 

aka (name may vary because i dont remember by heart)

 

public void onItemRightClick(ItemStack itemStack, and a bunch of other argument){
//here you can use the information about the itemstack nbt
//ex:
int theRandom = itemStack.stackTagCompound.getInteger("myRandomNumber");
	if(theRandom == 0){
		//here we DONT have anythin on the stack compound
		itemStack.stackTagCompound.setInteger("myRandomNumber", (int)(Math.random()*100));//generate a number between 0-100 and place it on the nbt
	}else{
		System.out.println("the number of thsi item is: "+theRandom);
	}
}

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

Right when i get excited i get a error  :-[

 

here is the error:

 

 

 2013-08-07 13:33:45 [iNFO] [sTDOUT] java.lang.NullPointerException
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at com.gmod622.SickMod.item.LicenseItemClass.onItemRightClick(LicenseItemClass.java:23)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.item.ItemStack.useItemRightClick(ItemStack.java:176)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.client.multiplayer.PlayerControllerMP.sendUseItem(PlayerControllerMP.java:428)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.client.Minecraft.clickMouse(Minecraft.java:1405)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.client.Minecraft.runTick(Minecraft.java:1854)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:898)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:826)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.client.main.Main.main(Main.java:93)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at java.lang.reflect.Method.invoke(Unknown Source)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.launchwrapper.Launch.launch(Launch.java:57)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 	at net.minecraft.launchwrapper.Launch.main(Launch.java:18)
2013-08-07 13:33:45 [iNFO] [sTDOUT] 

 

 

here is my code:

 

Item:

 

 

 
import com.gmod622.SickMod.tile.TileEntityLicense;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class LicenseItemClass extends Item {

public LicenseItemClass(int par1) {
	super(par1);
	this.setCreativeTab(CreativeTabs.tabMaterials);
}


 public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
	//here you can use the information about the itemstack nbt
	//ex:
	int theRandom = par1ItemStack.stackTagCompound.getInteger("myRandomNumber");
			if(theRandom == 0){
				//here we DONT have anythin on the stack compound
				par1ItemStack.stackTagCompound.setInteger("myRandomNumber", (int)(Math.random()*100));//generate a number between 0-100 and place it on the nbt
			}else{
				System.out.println("the number of thsi item is: "+theRandom);
			}
			return par1ItemStack;
	}


}

 

 

 

Please help me

Not new to java >> New to modding.

Posted

if you dont knwo what :

java.lang.NullPointerException mean, i suggest you google that

 

but you need to make a null check before using the stackTagCompound and create it if its null

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

To create a TagCompound.

NBTTagCompound tag = new NBTTagCompound();
tag.setTagCompound("tagName", new NBTTagCompound());
tag.getTagCompound("tagName").setInteger("YourInteger");
ItemStack.setTagCompound(tag);

 

To Read An tagCompound

NBTTagCompound tag = ItemStack.getTagCompound("tagName");
int i = tag.getInteger("YourInteger");

 

Thats it!

Posted

@Moritz, you realise you're creating a tagcompound inside a tagcompound right?

that exactly like using hashmap to store hashmaps

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

This is probably a newbie question but, I really don't know how to check if something is null. I know your probably not gonna answer this but, worth a shot... I haven't been code for about 1 1/2 now, so i really don't know stuff i didn't get indepth with it.

Not new to java >> New to modding.

Posted

then you should really learn a bit more java (either while you continue to make your mod or wtv) because itll help you a LOT

 

but a null check is like this:

Object a;

//more code

if(a == null){

//do or dont do something depending on the logic

}

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

  :( What do i put for the object? because if i make it the randomNumber then it gives me a error say your need to create it. So am i supposed to put something else? I probably sound like a noob.  :-[ :-[ :-[

Not new to java >> New to modding.

Posted
I probably sound like a noob.

you do :P, but dont worry we know a lot of people prefer to learn+mod at the same time so they often arrive in problem like this

but basicly everything in java (except primitive type: int, float, double, byte, long, boolean) is child of Object. Whenever you do "new Soemthing()" you are creating an object that is a child of the class Object (yup confusing i know)

but a == null can be done with anything !

 

Item s = wtv;
if (s == null){
//hello
}

Block b = some other stuff;

if (b == null){
//hello again 
}

 

now in the specific case you have, you want to check if the stackTagCompound is null , if it is you want to create it

 

if(itemStack.stackTagCompound == null){
//here we know the nbt is null
itemStack.stackTagCompoung = new NBTTagCompound();
}
//and here we can continue to use it becasue we know that if it was null it was also created

 

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

Thank you so much, I wish I could give you 100 thank yous!

 

Every time I ask somthing i dont know they usally quit helping  ;) But you sir are AWESOME, + Thank you and Credits :D

Not new to java >> New to modding.

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.