数据包资源类型
基本信息
| 属性 | 值 |
|---|---|
| 注册位置 | 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 一并保留(rawObjectDatamap),随后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 提供。
相关条目
- 数据包格式与优先级 -
pack.mcmeta、overlays、加载顺序与存档持久化 - /datapack 指令 - 管理上述资源的启用与排序
- 扩展点 -
DatapackRegisterHandlersEvent与标签注册事件