MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.21.1模组开发教程/7.标签

来自MCBBS Wiki
跳到导航 跳到搜索

标签(Tags)是一种将注册对象分类的机制,并能影响到实际的游戏逻辑。

所有注册项(包括固有注册项和数据包注册项)都支持标签,不过给物品、方块添加标签最为常用。

给注册对象添加标签

对于原版的注册项而言,标签的路径在data/<modid>/tags/<registry_type>下。例如,物品的标签存放在路径data/<modid>/tags/item下。

标签的JSON格式如下:

{
   //在这里填写存放进该标签的所有注册对象。
   //可以填一个注册对象的资源路径,也可以填另一个标签(以#开头),表示将该标签下的所有注册对象加入进来。
   "values": [
       "modid:a_certain_object",
       "#modid:a_certain_tag"
   ],
   //在这里填写移出该标签的所有注册对象。
   "remove": [
       ...
   ]
}

标签不同于数据包的其他部分,它默认是不覆盖的,而是会综合所有数据包对某一个标签的修改。

在代码中引用标签

标签在代码中的呈现形式是TagKey<?>,泛型参数为标签的类型。

public static final TagKey<Item> EXAMPLE_ITEM_TAG = TagKey.create(Registries.ITEM, aCertainResourceLocation);

要判断某个注册对象是否属于某个标签,只需要调用Holder#is方法即可。

原版所有的标签的TagKey都在包net.minecraft.tags下,NeoForge新增的标签在类net.neoforged.neoforge.common.Tags中,有需要的话可以直接引用。

你可能注意到NeoForge添加的标签绝大部分命名空间是c而非neoforge,c代表common,这是为了利好同时开发NeoForge和Fabric模组的Modder。

数据生成

标签支持datagen,很多种标签都有其DataProvider实现类。如对于方块标签而言,对应的DataProvider实现类为BlockTagsProvider。下面就以生成方块标签为例:

public class MyBlockTagsProvider extends BlockTagsProvider {
   public MyBlockTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper existingFileHelper) {
       super(output, lookupProvider, TutorialMod.MODID, existingFileHelper);
   }

   @Override
   protected void addTags(HolderLookup.Provider lookupProvider) {
       tag(aCertainTagKey)
           //添加多个方块进标签。
           .add(block1, block2, ...)
           //添加多个其他标签进该标签。
           .addTags(tag1, tag2, ...)
           //移除该标签中的某个方块。
           .remove(aCertainBlock);
   }
}