Jump to content

[1.12.2] Registering an item with default NBT tag(s)


Nikedemos

Recommended Posts

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!

Link to comment
Share on other sites

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.

 

 

  • Like 1
Link to comment
Share on other sites

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 by Nikedemos
forgot to ask
Link to comment
Share on other sites

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 by V0idWa1k3r
Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

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!

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.