数据包资源类型

基本信息

属性 值
注册位置 CommonProxy.serverAboutToStart(FMLServerAboutToStartEvent),CommonProxy.java:127-153
生命周期 每个世界启动时先 DatapackHandlerRegistry.clearAll()(CommonProxy.java:127)再全量重注册
已注册资源类型数 19
标签类处理器 4(继承/实现 ITagRegistry)
JSON DTO 类处理器 15(全部继承 JsonDatapackTypeHandler<T>)
注册表结构 PathTrie<IDatapackTypeHandler>(DatapackHandlerRegistry.java:12),按路径分量最深匹配分派
分派方法 getTypeHandler(List<String> path) / findDeepestHandler(DatapackHandlerRegistry.java:24-30)

功能

Databack 的全部实际内容面。它不注册方块、物品、实体或配方,而是把数据包里的 JSON 解析成 DTO 对象并按资源路径建表,供世界生成与标签系统查询。

serverAboutToStart 在清空注册表后发出 DatapackRegisterHandlersEvent,这是留给其他模组追加资源类型的公开挂钩点(CommonProxy.java:153)。

已注册资源类型列表

# 资源路径 处理器类 处理器基类 载荷类型
1 tags/block BuiltinTagRegistries.BlockTagRegistry TagRegistry<BlockIdentity> 方块身份标签
2 tags/item BuiltinTagRegistries.ItemTagRegistry TagRegistry<ItemIdentity> 物品身份标签
3 tags/entity_type EntityTagRegistry implements ITagRegistry<Class<? extends Entity>> 实体类标签
4 tags/worldgen/biome BuiltinTagRegistries.BiomeGenBaseTagRegistry TagRegistry<BiomeGenBase> 群系标签
5 dimension DimensionList JsonDatapackTypeHandler<Dimension> 维度定义
6 dimension_type DimensionTypeList JsonDatapackTypeHandler<DimensionType> 维度类型
7 worldgen/configured_carver ConfiguredCarverList JsonDatapackTypeHandler<IConfiguredCarver> 雕刻器
8 worldgen/configured_feature ConfiguredFeatureList JsonDatapackTypeHandler<IConfiguredFeature> 特征
9 worldgen/biome BiomeList JsonDatapackTypeHandler<DatapackBiome> 群系
10 worldgen/noise DatapackNoiseList JsonDatapackTypeHandler<DatapackNoise> 噪声
11 worldgen/density_function DensityFunctionList JsonDatapackTypeHandler<IDensityFunctionFactory> 密度函数
12 worldgen/noise_settings NoiseSettingsList JsonDatapackTypeHandler<NoiseGeneratorSettings> 噪声设置
13 worldgen/placed_feature PlacedFeatureList JsonDatapackTypeHandler<PlacedFeature> 放置特征
14 worldgen/multi_noise_biome_source_parameter_list MultiNoiseBiomeSourceParameterListHandler JsonDatapackTypeHandler<MultiNoiseBiomeSourceParameterList> 多噪声群系源参数表
15 worldgen/processor_list ProcessorListHandler JsonDatapackTypeHandler<ProcessorList> 结构处理器列表
16 worldgen/template_pool TemplatePoolList JsonDatapackTypeHandler<TemplatePool> 模板池
17 worldgen/structure StructureList JsonDatapackTypeHandler<IStructure> 结构
18 worldgen/structure_set StructureSetList JsonDatapackTypeHandler<StructureSet> 结构集
19 worldgen/world_preset WorldPresetList JsonDatapackTypeHandler<WorldPreset> 世界预设

(前 4 行的注册语句位于 CommonProxy.java:131-134,其余 15 行位于 CommonProxy.java:136-151。)

JSON 处理器的工作方式

JsonDatapackTypeHandler<T> 是全部 15 个 JSON 处理器的共同基类(JsonDatapackTypeHandler.java:21):

  • handle(ResourceId id, byte[] content):先把字节按 UTF-8 解成字符串、交给 DatapackSerialization.getGson() 解析为 JsonElement,再反序列化为 T,同时把原始 JsonElement 一并保留(rawObjectData map),随后 objects.put(id.fqid(), obj)(JsonDatapackTypeHandler.java:42-52)
  • 类注释明确说明对象「在客户端或服务端线程上可能被任意访问」,因此假定 T 不可变,且所有接收到的对象会保留到世界卸载(JsonDatapackTypeHandler.java:17-20)
  • 子类典型写法:声明 public static final ResourceType<XList> RT = ResourceType.withPath("..."),并在构造器中 super(RT, Xxx.class),另提供 getXxx(String id) 便捷取值(如 WorldPresetList.java:9-17)

原始 JSON 双份保存是客户端同步的基础:数据包内容以 JSON 形式而非反序列化对象形式发给客户端(见下节封包)。

DTO 定义规模

src/main/java/databack/common/dto/ 下按数据包类型分了 8 个顶层 DTO 包:dimension、dimension_type、particle、tag、timeline、worldgen,以及顶层单类 BlockStateDTO、SoundEventRef。其中 worldgen 子包有 19 个子包(biome、block_predicate、block_state_provider、carver、configured_feature、density_function、float_provider、height_provider、int_provider、multi_noise_biome_source、noise、noise_settings、placed_feature、processor_list、structure、structure_set、template_pool、world_preset 等)。

这些 DTO 由 GTNH 明示的 AI 辅助流程产出:项目 README 记载先用 LLM 把 vanilla-mcdoc 转成 TypeScript 类型,再由另一个 LLM 生成 DTO,重要逻辑手写(README.md)。

网络同步

数据包内容通过 2 类封包同步到客户端(DBPacketEntry.java:4-6,id 取 ordinal()):

封包枚举 编码器 用途
SyncJsonHandler PacketEncoderSyncJsonHandler 同步 JSON DTO 原始内容
SyncTagHandler PacketEncoderSyncTagHandler 同步标签

通道为 DBNetworkChannel,基于 FMLEmbeddedChannel 以 modid databack 注册(DBNetworkChannel.java:33-35),编解码器数组由 DBPacketEntry.values() 映射得到,最大封包 ID 取各编码器 getPacketID() 的最大值(DBNetworkChannel.java:37-45)。

标签与身份的运行时挂载

标签不是靠反射扫描,而是靠 Mixin 注入字段(Mixin_InjectTaggable,@Mixin({ Block.class, Item.class, BiomeGenBase.class })(Mixin_InjectTaggable.java:15),为每个实例注入 BitSet db$presentTags(:18-19)并由 db$getTagBitSet() 暴露(:21-24))——方块与物品身份则分别由 MixinBlock_Identity、MixinItem_Identity 提供。

相关条目