5,347 bytes added
, 05:51, 6 December 2021
Tags are generalized sets of objects in the game, used for grouping related things together and providing fast membership checks.
== Declaring Your Own Groupings ==
Tags are declared in your mod’s [https://mcforge.readthedocs.io/en/latest/utilities/tags/datapacks.md datapack]. For example, <code><nowiki>/data/modid/tags/blocks/foo/tagname.json</nowiki></code> will declare a <code><nowiki>Tag$Named<Block></nowiki></code> with ID <code><nowiki>modid:foo/tagname</nowiki></code>. Similarly, you may append to or override tags declared in other domains, such as Vanilla, by declaring your own JSONs. For example, to add your own mod’s saplings to the Vanilla sapling tag, you would specify it in <code><nowiki>/data/minecraft/tags/blocks/saplings.json</nowiki></code>, and Vanilla will merge everything into one tag at reload, if the <code><nowiki>replace</nowiki></code> option is false. If <code><nowiki>replace</nowiki></code> is true, then all entries before the json specifying <code><nowiki>replace</nowiki></code> will be removed. See the [https://minecraft.gamepedia.com/Tag#JSON_format Vanilla wiki] for a description of the base syntax.
Forge provides two extensions on the Vanilla syntax: * You may declare an <code><nowiki>optional</nowiki></code> array of the same format as the <code><nowiki>values</nowiki></code> array, but any values listed here that are not present will not cause the tag loading to error. This is useful to provide integration for mods that may or may not be present at runtime.
* You may declare a <code><nowiki>remove</nowiki></code> array of the same format as the <code><nowiki>values</nowiki></code> array. Any values listed here will be removed from the tag. This acts as a finer grained version of the Vanilla <code><nowiki>replace</nowiki></code> option.
==Using Tags In Code==
Block, Item, and Fluid tags are automatically sent from the server to any remote clients on login and reload. Function tags are not synced.
<code><nowiki>BlockTags#getAllTags</nowiki></code> and <code><nowiki>ItemTags#getAllTags()</nowiki></code> will retrieve the current <code><nowiki>TagCollection</nowiki></code>, from which you can retrieve a <code><nowiki>Tag</nowiki></code> object by its ID. With a <code><nowiki>Tag</nowiki></code> object in hand, membership can be tested with <code><nowiki>tag.contains(thing)</nowiki></code>, or all the objects in the tag queried with <code><nowiki>tag.getAllElements()</nowiki></code>.
As an example:
<syntaxhighlight lang="java">
public static final Tag.Named<Item> myTag = ItemTags.bind("mymod:myitemgroup");
// In some method
Item unknownItem = stack.getItem();
boolean isInGroup = unknownItem.is(myTag);
</syntaxhighlight>
{{Colored box|title=tip|content=The <code><nowiki>TagCollection</nowiki></code> returned by <code><nowiki>#getAllTags</nowiki></code> (and the <code><nowiki>Tag</nowiki></code>s within it) may expire if a reload happens, so you should always query the collection anew every time you need it. The static <code><nowiki>Tag$Named</nowiki></code> fields in <code><nowiki>BlockTags</nowiki></code> and <code><nowiki>ItemTags</nowiki></code> avoid this by introducing a wrapper that handles this expiring. Alternatively, a resource reload listener can be used to refresh any cached tags.}}
== Conventions ==
There are several conventions that will help facilitate compatibility in the ecosystem:
* If there is a Vanilla tag that fits your block or item, add it to that tag. See the [https://minecraft.gamepedia.com/Tag#List_of_tags list of Vanilla tags].
* If there is a Forge tag that fits your block or item, add it to that tag. The list of tags declared by Forge can be seen on [https://github.com/MinecraftForge/MinecraftForge/tree/1.16.x/src/generated/resources/data/forge/tags GitHub].
* If there is a group of something you feel should be shared by the community, consider PR-ing it to Forge instead of making your own tag
* Tag naming conventions should follow Vanilla conventions. In particular, item and block groupings are plural instead of singular. E.g. <code><nowiki>minecraft:logs</nowiki></code>, <code><nowiki>minecraft:saplings</nowiki></code>.
* Item tags should be sorted into subdirectories according to the type of item, e.g. <code><nowiki>forge:ingots/iron</nowiki></code>, <code><nowiki>forge:nuggets/brass</nowiki></code>, etc.
== Migration from OreDictionary ==
* For recipes, tags can be used directly in the vanilla recipe format (see below)
* For matching items in code, see the section above.
* If you are declaring a new type of item grouping, follow a couple naming conventions:
** Use <code><nowiki>domain:type/material</nowiki></code>. When the name is a common one that all modders should adopt, use the <code><nowiki>forge</nowiki></code> domain.
** For example, brass ingots should be registered under the <code><nowiki>forge:ingots/brass</nowiki></code> tag, and cobalt nuggets under the <code><nowiki>forge:nuggets/cobalt</nowiki></code> tag.
== Using Tags in Recipes and Advancements ==
Tags are directly supported by Vanilla, see the respective Vanilla wiki pages for [https://minecraft.gamepedia.com/Recipe#JSON_format recipes] and [https://minecraft.gamepedia.com/Advancements advancements] for usage details.
[[Category:Resources and Data/1.17|Category:Resources and Data]]