Posted August 7, 201312 yr 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.
August 7, 201312 yr 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-
August 7, 201312 yr Author Wow! Thank you so much!!! I really thought there was no way of doing it I soo happy! +1 Thank You! Not new to java >> New to modding.
August 7, 201312 yr Author 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.
August 7, 201312 yr 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-
August 7, 201312 yr 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!
August 7, 201312 yr @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-
August 7, 201312 yr Author 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.
August 7, 201312 yr 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-
August 7, 201312 yr Author 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.
August 7, 201312 yr I probably sound like a noob. you do , 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-
August 7, 201312 yr Author 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 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.