Jump to content

1.18.2 and tag changes


Adil Yilan

Recommended Posts

Hello,

Seems that there have been some breaking changes with 1.18.2 regarding the tags.

Following code no longer works:

public static final Tags.IOptionalNamedTag<Block> MACHINES = 
            BlockTags.createOptional(new ResourceLocation(ExperimentalMod.MODID, "machines"));

However, I have managed to change the code to:

    public static final TagKey<Block> MACHINES = 
            BlockTags.create(new ResourceLocation(ExperimentalMod.MODID, "machines"));

Is this valid migration path?

There are two additional lines of code that do not work any longer:

List<Block> flowers = BlockTags.SMALL_FLOWERS.getValues();

Method .getValues() no longer exists. Is there another way to get all blocks that have specific tag?

Same is with .is(...) method:

if (!blockState.is(BlockTags.LOGS)) {
	return;
}

Is there a different approach now to check if BlockState is tagged with specific tag?

Thanks!

Link to comment
Share on other sites

Things that goin into inventories, are items, blocks are in world placed.  So if you're using a tag file for say crafting/fuel/slot/whatnot,  it has to be an item tag.  the block tags are for literal inworld use (axe on log, for stripped_log)
-log placed world is the block tag use. 
-axe is the item tag use. 
-log in inventory, is item tag.
== aka, the fuel tag for logs is an item tag [logs_that_burn] to be put into a furnace. {as well as having a matching block tag}

Link to comment
Share on other sites

13 minutes ago, Adil Yilan said:

@DePhoegon I am not sure what exactly are you trying to point out.

Methods above were valid in Forge for 1.18.1.

Since update to 1.18.2 methods have stopped to exist so there are probably replacement methods that I am trying to find.

.is(..) method on BlockState existed before in 1.18.1 .

I must be dumb tired... but I believe you may need to examine 2 java classes

net.minecraft.data.tags
-BlockTagsProvider
-ItemTagsProvider

I believe that the way it was handled got shifted into those classes. 

 

I'm sorry for the confusion from me... but I hope it helps.

Link to comment
Share on other sites

.is(..) method is still there where it used to be.

Issue was with version of parchment mappings that I was using so method was obfuscated to something else.

I have updated to use latest parchment version (from yesterday) and that problem is now gone:

1.18.1-2022.03.06-1.18.2

 

Link to comment
Share on other sites

22 minutes ago, Adil Yilan said:

I am still not able to find a replacement method for .getValues().

Does anyone know how to get all blocks with specific tag?

@DePhoegon I have inspected BlockTagsProvider and ItemTagsProvider but I am not familiar with how to use those.

Aren't these supposed to be used with data generators?

 

from how they are structured, it seems they are for a clear separation of tags to prevent any chance of confusion or confliction.  

I would suggest you poke about and see what the methods in those java classes actually do.

Pay attention to how it is done for regular Minecraft stuff now, and how they are called. 
-- you have to remember that things like small flowers, desert plants, & even 'trees' have tags that are used to allow them to be planted on certain blocks.

I likely will have to go over this explicitly, to ensure my sand, sand slabs, & upside down stairs will support the deadbushes, & cacti.. but I am sure you can figure it out.  they are used in the code.

Link to comment
Share on other sites

  • 1 month later...

This is kind of hard to get them because items or blocks don't belong to tags, but tags belong to them : basically, an item (or a block) has a list of tags associated to it.

Luckily, there's another way to get the tag rather than looping through every item in the game and check if it has the tag you want :

// This is to get the values of a tag that is bound to items :
ForgeRegistries.ITEMS.tags().getTag([THE TAG YOU WANT]).stream().toList(); // Returns a List<Item>
//                                           ^
//                                Should be a TagKey<Item>


// To get a tag that is bound to blocks :
ForgeRegistries.BLOCKS.tags().getTag([THE TAG YOU WANT]).stream().toList(); // Returns a List<Block>
//                                            ^
//                                Should be a TagKey<Block>

Hope it helps :)

  • Thanks 2
Link to comment
Share on other sites

  • 2 weeks later...

Well, I'm not sure (as I haven't tested it for some reason), but I think this would like to work:

ForgeRegistries.<FORGE REGISTRY ENTRY>.tags().getTag(<THE TAG YOU WANT>).stream()

e.g. ForgeRegistries.BLOCKS.tags().getTag(BlockTags.REPLACEABLE_PLANTS).stream()

Edited by Shage_Jack
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.