• Forge论坛

导航页

  • 主页
  • 向文档做出贡献
  • 入门
    • 概述
    • 模组文件
    • 规划你的模组结构
    • 版本号
  • 核心概念
    • 注册表
    • 端位(Sides)
    • 事件
    • 模组生命周期
    • 资源
    • 国际化与本地化
  • 方块
    • 概述
    • 方块状态
  • 物品
    • 概述
    • BlockEntityWithoutLevelRenderer
  • 网络
    • 概述
    • SimpleImpl
    • 实体的同步
  • 方块实体
    • 概述
    • BlockEntityRenderer
  • 游戏特效
    • 粒子效果
    • 音效
  • 数据储存
    • Capabilities
    • Saved Data
    • 编解码器(Codecs)
  • 图形用户界面
    • 菜单(Menus)
    • 屏幕(Screens)
  • 渲染
    • 模型扩展
      • 概述
      • 根变换
      • 渲染类型
      • 部分可见度
      • 面数据
    • 模型加载器
      • 概述
      • 烘焙模型
      • 变换
      • 物品重载
  • 资源
    • 客户端资源(Assets)
      • 概述
      • 模型
        • 概述
        • 纹理色调
        • 物品属性
    • 服务端数据(Data)
      • 概述
      • 配方
        • 概述
        • 自定义配方
        • 原料
        • 非数据包配方
      • 战利品表
      • 全局战利品修改器
      • 标签
      • 进度
      • 条件性加载数据
  • 数据生成
    • 概述
    • 客户端资源(Assets)
      • 模型提供者
      • 语言提供者
      • 音效提供者
    • 服务端数据(Data)
      • 配方提供者
      • 战利品表提供者
      • 标签提供者
        • TagsProvider
        • 自定义标签提供者
      • 进度提供者
      • 全局战利品修改器提供者
      • 数据包注册表对象提供者
  • 杂项功能
    • 配置
    • 键盘布局
    • 游戏测试
    • Forge更新检查器
    • 调试分析器
  • 进阶主题
    • 访问转换器
  • 向Forge做出贡献
    • 概述
    • Pull Request准则
  • 旧版本
    • 概述
    • 移植到当前版本

标签生成

可以通过子类化TagsProvider并实现#addTags来为模组生成标签。实现后,该提供者必须被添加到DataGenerator中。

// 在模组事件总线上
@SubscribeEvent
public void gatherData(GatherDataEvent event) {
    event.getGenerator().addProvider(
        // 告诉生成器仅在生成服务端资源时运行
        event.includeServer(),
        // 扩展net.minecraftforge.common.data.BlockTagsProvider
        output -> new MyBlockTagsProvider(
          output,
          event.getLookupProvider(),
          MOD_ID,
          event.getExistingFileHelper()
        )
    );
}

TagsProvider

标签提供者有两种用于生成标签的方法:通过#tag创建带有对象和其他标签的标签,或通过#getOrCreateRawBuilder使用其他对象类型的标签生成标签数据。

注意

通常,提供者不会直接调用#getOrCreateRawBuilder,除非注册表包含来自不同注册表的对象表示(方块具有物品表示以获得物品栏中的方块)。

当调用#tag时,将创建一个TagAppender,它充当要添加到标签中的元素的可链接Consumer:

方法 描述
add 通过对象的资源键将对象添加到标签中。
addOptional 通过对象的名称将对象添加到标签中。如果对象不存在,则加载时将跳过该对象。
addTag 通过标签键将标签添加到标签中。内部标签中的所有元素现在都是外部标签的一部分。
addOptionalTag 通过标签的名称将标签添加到标签中。如果标签不存在,则加载时将跳过该标签。
replace 当为true时,从其他数据包添加到此标签的所有先前加载的条目都将被丢弃。如果在这个数据包之后加载了一个数据包,那么它仍然会将条目附加到标签中。
remove 通过对象或标签的名称或键从标签中删除对象或标签。
// 在某个TagProvider#addTags中
this.tag(EXAMPLE_TAG)
  .add(EXAMPLE_OBJECT) // 向该标签添加一个对象
  .addOptional(new ResourceLocation("othermod", "other_object")) // 向该标签添加一个来自其他模组的对象

this.tag(EXAMPLE_TAG_2)
  .addTag(EXAMPLE_TAG) // 向该标签添加一个标签
  .remove(EXAMPLE_OBJECT) // 从该标签中移除一个对象

重要

如果模组的标签软依赖于另一个模组的标签(另一个模组可能在运行时存在,也可能不存在),则应使用可选方法引用其他模组的标签。

Existing Providers

Minecraft包含一些用于某些注册表的标签提供者,这些注册表可以被子类化。此外,一些提供者包含额外的辅助方法,以便更容易地创建标签。

注册表对象类型 标签提供者
Block BlockTagsProvider*
Item ItemTagsProvider
EntityType EntityTypeTagsProvider
Fluid FluidTagsProvider
GameEvent GameEventTagsProvider
Biome BiomeTagsProvider
FlatLevelGeneratorPreset FlatLevelGeneratorPresetTagsProvider
WorldPreset WorldPresetTagsProvider
Structure StructureTagsProvider
PoiType PoiTypeTagsProvider
BannerPattern BannerPatternTagsProvider
CatVariant CatVariantTagsProvider
PaintingVariant PaintingVariantTagsProvider
Instrument InstrumentTagsProvider
DamageType DamageTypeTagsProvider

* BlockTagsProvider是一个由Forge添加的TagsProvider。

ItemTagsProvider#copy

方块具有用于在物品栏中获取它们的物品表示。因此,许多方块标签也可以是物品标签。为了容易地生成与方块标签具有相同条目的物品标签,可以使用#copy方法,该方法接受要从中复制的方块标签和要复制到的物品标签。

// 在ItemTagsProvider#addTags中
this.copy(EXAMPLE_BLOCK_TAG, EXAMPLE_ITEM_TAG);

自定义标签提供者

可以通过TagsProvider子类创建自定义标签提供者,该子类接受注册表键来为其生成标签。

public RecipeTypeTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries, ExistingFileHelper fileHelper) {
  super(output, Registries.RECIPE_TYPE, registries, MOD_ID, fileHelper);
}

Intrinsic Holder Tags Providers

一种特殊类型的TagProvider是IntrinsicHolderTagsProvider。当通过#tag使用此提供者创建标签时,可以使用对象本身通过#add将自己添加到标签中。为此,在构造函数中提供了一个函数,将对象转换为其ResourceKey。

// `IntrinsicHolderTagsProvider`的子类型
public AttributeTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries, ExistingFileHelper fileHelper) {
  super(
    output,
    ForgeRegistries.Keys.ATTRIBUTES,
    registries,
    attribute -> ForgeRegistries.ATTRIBUTES.getResourceKey(attribute).get(),
    MOD_ID,
    fileHelper
  );
}
Built with MkDocs using a custom theme. Hosted by Read the Docs.
Enable Dark Theme