Nikedemos Posted September 10, 2018 Posted September 10, 2018 Hi everyone, I've literally joined just now - mainly to ask a question that has bugging me for a while! I'm quite new to Forge, still learning, but already at a point where I've read / watched all the popular 1.12.2 forge tutorials - and none of them brought me any closer to a solution. I googled and googled, found nothing useful, so here it goes: I know how to get/set NBT tags for itemstacks. I can do it fine in events such as right click/block place / tick update etc - but I have no clue how to make it so a newly registered item has a default NBT tag BEFORE anything else is done with it. Also, how to make it so items with certain NBT tags are placed in the Creative Inventory? For instance, I have an item called Watering Can, with water_level (int) tag, going from 0 to 8. I want the two "variants" (not actual variants in the minecraft sense), one with water_level 0, and one with water_level 8, to be added to my mod's Creative Inventory - but not the ones between 1 and 7, inclusive. And yes, I know how to add "normal" items without tags. This question is related to the mod I'm working on - there's quite an early, but semi-functional version on github. If you think it'd help, let me know, and I'll post the link. I really hope I made the question clear - in any other case, just give me a shout, and I'll re-phrase / elaborate. Thanks! Quote
V0idWa1k3r Posted September 10, 2018 Posted September 10, 2018 6 minutes ago, Nikedemos said: so a newly registered item has a default NBT tag BEFORE anything else is done with it This is impossible. You have to handle the cases where there isn't an NBTTagCompound attached to the item at all. The best way is to stop using NBT alltogether and use capabilities since a capability will always be attached to an ItemStack regardless of how the stack was created. 6 minutes ago, Nikedemos said: how to make it so items with certain NBT tags are placed in the Creative Inventory? Use Item#getSubItems, create a new ItemStack, assign the NBT needed to it and add it to the list. 1 Quote
Nikedemos Posted September 10, 2018 Author Posted September 10, 2018 (edited) Oh wow that was quick! Thanks. I'll definitely look into Capabilities, haven't had the need to use them yet, but it looks like I have no choice now when it comes to Item#getSubItems, it looks like it should return a list of subtypes - but I haven't defined any. The "variants" are not actually subtypes, it's just the model is based on the water_level NBT value. Should I define any subtypes in the class code first? EDIT: Oh and also, this is how items are added to the creative tab in my approach. Where does this Item#getSubItems method go, then? In my ModItems class, where I register items? Edited September 10, 2018 by Nikedemos forgot to ask Quote
V0idWa1k3r Posted September 10, 2018 Posted September 10, 2018 (edited) 7 minutes ago, Nikedemos said: it looks like it should return a list of subtypes - but I haven't defined any It's a void method. It doesn't return anything. The list you can add ItemStacks to is passed to you as the second argument, the first one being the creative tab that invoked the method in the first place. 7 minutes ago, Nikedemos said: The "variants" are not actually subtypes, it's just the model is based on the water_level NBT value. Should I define any subtypes in the class code first? I think you misunderstand what subtypes are. A subtype for an ItemStack is any itemstack that has the same Item but differs in something else like NBT or metadata(hence the name, it's a sub type of the Item). You do not need to "define them in class code" whatever that even means. Just populate the list passed to you as an argyment with whatever items you want added to the creative tab. For example here is me populating the creative tab with 16 versions of my items, each having a different color stored in it's capability. Edited September 10, 2018 by V0idWa1k3r Quote
Nikedemos Posted September 10, 2018 Author Posted September 10, 2018 8 minutes ago, V0idWa1k3r said: It's a void method. It doesn't return anything. The list you can add ItemStacks to is passed to you as the second argument, the first one being the creative tab that invoked the method in the first place. I think you misunderstand what subtypes are. A subtype for an ItemStack is any itemstack that has the same Item but differs in something else like NBT or metadata(hence the name, it's a sub type of the Item). You do not need to "define them in class code" whatever that even means. Just populate the list passed to you as an argyment with whatever items you want added to the creative tab. For example here is me populating the creative tab with 16 versions of my items, each having a different color stored in it's capability. I see! Thanks so much for the provided example... and your patience Basically, by "defining the subtypes in the class code" I meant exactly what you did right there: for (EnumDyeColor dyeColor : EnumDyeColor.values()) { ItemStack is = new ItemStack(this, 1, 0); IBackpack.of(is).createWrapper().setColor(dyeColor.getColorValue()); items.add(is); } It's a for loop - so it's going to add as many subtypes as there are dyes, correct? Thus, I dunno.... defining them? Defining them by NBT/meta, dye color's value in this case? Maybe that's not the right word... but it definitely adds stuff to the List. I am struggling to understand though - how is that list processed afterwards? Where is the bit that says "yes, add THIS itemstack to the Creative Tab"? Where do I call this getSubTypes method, be it an overriden one, or the one from Item.java? Or does it get called automatically? Quote
V0idWa1k3r Posted September 10, 2018 Posted September 10, 2018 9 minutes ago, Nikedemos said: I am struggling to understand though - how is that list processed afterwards? Where is the bit that says "yes, add THIS itemstack to the Creative Tab"? The game simply creates a NonNullList<ItemStack>, then calls this method for each item in the registry with that list as the second parameter and current creative tab as the first. Anything that ended up in the list is displayed in the creative tab. See GuiContainerCreative if you want to study this process in greater detail. This also answers your question of how to use this method. Just override it and you will be good to go. Quote
Nikedemos Posted September 10, 2018 Author Posted September 10, 2018 1 minute ago, V0idWa1k3r said: The game simply creates a NonNullList<ItemStack>, then calls this method for each item in the registry with that list as the second parameter and current creative tab as the first. Anything that ended up in the list is displayed in the creative tab. See GuiContainerCreative if you want to study this process in greater detail. This also answers your question of how to use this method. Just override it and you will be good to go. AWESOME. Now it's crystal clear. Consider this <SOLVED>! Thank you so much for all your help! Quote
Recommended Posts
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.