• Forge论坛

导航页

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

数据包注册表对象生成

Datapack registry objects can be generated for a mod by constructing a new DatapackBuiltinEntriesProvider and providing a RegistrySetBuilder with the new objects to register. The provider must be added to the DataGenerator. 通过构造新的DatapackBuiltinEntriesProvider并为RegistrySetBuilder提供要注册的新对象,可以为模组生成数据包注册表对象。该提供者必须被添加到DataGenerator中。

注意

DatapackBuiltinEntriesProvider是RegistriesDatapackGenerator之上的一个Forge扩展,它可以正确处理引用现有数据包注册表对象而不会分解条目。因此,本文档将使用DatapackBuiltinEntriesProvider。

// 在模组事件总线上
@SubscribeEvent
public void gatherData(GatherDataEvent event) {
    event.getGenerator().addProvider(
        // 告诉生成器仅在生成服务端资源时运行
        event.includeServer(),
        output -> new DatapackBuiltinEntriesProvider(
          output,
          event.getLookupProvider(),
          // 包含要生成的数据包注册表对象的生成器
          new RegistrySetBuilder().add(/* ... */),
          // 用于生成的数据包注册表对象的mod id集合
          Set.of(MOD_ID)
        )
    );
}

RegistrySetBuilder

RegistrySetBuilder负责构建游戏中使用的所有数据包注册表对象。生成器可以为注册表添加一个新条目,然后注册表可以将对象注册到该注册表中。

首先,可以通过调用构造函数来初始化RegistrySetBuilder的新实例。然后,可以调用#add方法(它接受注册表的ResourceKey,一个包含BootstapContext的RegistryBootstrap Consumer来注册对象,以及一个可选的Lifecycle参数来指示注册表的当前生命周期状态)来处理特定注册表进行注册。

new RegistrySetBuilder()
  // 创建已配置的特性
  .add(Registries.CONFIGURED_FEATURE, bootstrap -> {
    // 在此处注册已配置的特性
  })
  // 创建已放置的特性
  .add(Registries.PLACED_FEATURE, bootstrap -> {
    // 在此处注册已放置的特性
  });

注意

通过Forge创建的数据包注册表也可以通过传递相关的ResourceKey来使用该生成器生成它们的对象。

使用BootstapContext注册

生成器提供的BootstapContext中的#register方法可用于注册对象。它采用ResourceKey表示对象的注册表名称、要注册的对象,以及一个可选的Lifecycle参数来指示注册表对象的当前生命周期状态。

public static final ResourceKey<ConfiguredFeature<?, ?>> EXAMPLE_CONFIGURED_FEATURE = ResourceKey.create(
  Registries.CONFIGURED_FEATURE,
  new ResourceLocation(MOD_ID, "example_configured_feature")
);

// 在某个恒定的位置或参数中
new RegistrySetBuilder()
  // 创建已配置的特性
  .add(Registries.CONFIGURED_FEATURE, bootstrap -> {
    // 在此处注册已配置的特性
    bootstrap.register(
      // 已配置的特性的资源键
      EXAMPLE_CONFIGURED_FEATURE,
      new ConfiguredFeature<>(
        Feature.ORE, // 创建一个矿物特性
        new OreConfiguration(
          List.of(), // 不做任何事情
          8 // 在最多8个矿脉中
        )
      )
    );
  })
  // 创建已放置的特性
  .add(Registries.PLACED_FEATURE, bootstrap -> {
    // 在此处注册已放置的特性
  });

Datapack Registry Object Lookup

有时,数据包注册表对象可能希望使用其他数据包注册表对象或包含数据包注册表对象的标签。在这种情况下,你可以使用BootstapContext#lookup查找另一个数据包注册表以获得HolderGetter。从那里,你可以通过#getOrThrow传递相关的键,获得数据包注册表对象的Holder$Reference或标签的HolderSet$Named。

public static final ResourceKey<ConfiguredFeature<?, ?>> EXAMPLE_CONFIGURED_FEATURE = ResourceKey.create(
  Registries.CONFIGURED_FEATURE,
  new ResourceLocation(MOD_ID, "example_configured_feature")
);

public static final ResourceKey<PlacedFeature> EXAMPLE_PLACED_FEATURE = ResourceKey.create(
  Registries.PLACED_FEATURE,
  new ResourceLocation(MOD_ID, "example_placed_feature")
);

// 在某个恒定的位置或参数中
new RegistrySetBuilder()
  // 创建已配置的特性
  .add(Registries.CONFIGURED_FEATURE, bootstrap -> {
    // 在此处注册已配置的特性
    bootstrap.register(
      // 已配置的特性的资源键
      EXAMPLE_CONFIGURED_FEATURE,
      new ConfiguredFeature(/* ... */)
    );
  })
  // 创建已放置的特性
  .add(Registries.PLACED_FEATURE, bootstrap -> {
    // 在此处注册已放置的特性

    // 获取已配置的特性的注册表
    HolderGetter<ConfiguredFeature<?, ?>> configured = bootstrap.lookup(Registries.CONFIGURED_FEATURE);

    bootstrap.register(
      // 已放置的特性的资源键
      EXAMPLE_PLACED_FEATURE,
      new PlacedFeature(
        configured.getOrThrow(EXAMPLE_CONFIGURED_FEATURE), // 获取已配置的特性
        List.of() // 并对于放置位置不做任何事情
      )
    )
  });
Built with MkDocs using a custom theme. Hosted by Read the Docs.
Enable Dark Theme