本条基于 Minecraft 1.20.1 + Forge,Mojang 映射名。
实体注册表是登记所有实体类型(EntityType)的注册表。注意:它登记的是“类型”,不是世界里的实体实例。
位置
- 原版:
BuiltInRegistries.ENTITY_TYPE(Registry<EntityType<?>>),键是minecraft:zombie这样的ResourceLocation。 - Forge:
ForgeRegistries.ENTITY_TYPES(IForgeRegistry<EntityType<?>>),模组一般用DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, MODID)注册。 - 注册阶段结束后注册表会冻结,运行时无法再正常添加新类型。
EntityType 里有什么
实体工厂(EntityType.EntityFactory)、碰撞箱尺寸、分类(MobCategory)、追踪距离与更新间隔等。生成实体时由 EntityType.create(level) 调用工厂创建实例。
与实体储存的区别
- 实体实例存放在 EntityLookup、EntityTickList 等容器中(见 ServerLevel),与注册表无关;从注册表里拿不到“世界上有哪些实体”。
- 读档时,实体 NBT 里的
id会先在注册表中查到EntityType,再创建实体并加入上述容器。
所在链路
- EntityCommand(/forge entity list):用
ForgeRegistries.ENTITY_TYPES.getKey(e.getType())把实体按类型名分组,过滤器匹配的也是注册表的键。 - EntitySelector:
@e[type=...]会把类型名解析为EntityType,再作为EntityTypeTest过滤实体。