村庄生物群系

基本信息

属性 值
源码位置 climateControl/generator/AbstractWorldGenerator.java:83-93
相关类 generator/MapGenVillageCC.java、generator/VillageBiomes.java
控制开关 controlVillageBiomes(默认 false)
作用对象 村庄结构生成位置校验,不含方块/物品

功能

controlVillageBiomes 开关打开后(ClimateControlSettings.java:190-193),Climate Control 会接管 Minecraft 原版村庄的生成生物群系判定列表。

流程在 AbstractWorldGenerator.setRules() 中(generator/AbstractWorldGenerator.java:77-95):

  1. 新建 ClimateControlRules,遍历 settings().biomeSettings() 收集各生物群系包声明的村庄规则(:80-82)
  2. 遍历全部 256 个生物群系 ID,凡是 newRules.hasVillages(i) 为真的就加入列表(:83-88)
  3. 用该列表构造 VillageBiomes 并调用 reportMembers()(:89-90)
  4. 仅当 settings.controlVillageBiomes.value() 为真时,写入 Minecraft 静态字段 MapGenVillage.villageSpawnBiomes(:91-93)

也就是说:CC 自己不生成村庄,只是替换掉原版 MapGenVillage 用于判断"这里能不能建村庄"的白名单。配置项说明明确提示了风险(ClimateControlSettings.java:192):“may be incompatible with village mods”(可能与村庄类模组冲突)。

数值

项目 值 出处
开关默认值 false ClimateControlSettings.java:190-193
遍历的生物群系 ID 范围 0 – 255 generator/AbstractWorldGenerator.java:84
替换目标 MapGenVillage.villageSpawnBiomes generator/AbstractWorldGenerator.java:92
收集规则来源 settings().biomeSettings() 中每个包的 setRules(rules) generator/AbstractWorldGenerator.java:80-82
原版生物群系的村庄规则 由 VanillaBiomeSettings.setRules() → setVillages(rules) 声明 biomeSettings/VanillaBiomeSettings.java:133-142

交互

  • VanillaBiomeSettings.setRules() 除了 setVillages(rules),还调用 rules.disallowStoneBeach(...) 两次,分别传入 mesaPlateau(Mesa Plateau,ID 39)与 mesaPlateau_F(Mesa Plateau F,ID 38)的生物群系 ID(biomeSettings/VanillaBiomeSettings.java:135-140),即禁止这两种台地在岸线上生成石头海滩。
  • OceanBiomeSettings.setRules() 是空实现(biomeSettings/OceanBiomeSettings.java:33-35,注释 “nothing yet”),因此海洋生物群系不贡献任何村庄规则。
  • setRules() 在 AbstractWorldGenerator 的构造函数中被调用(generator/AbstractWorldGenerator.java:53-56),因此三套生成器(含 1.6 路径)都会执行;此外 1.7 路径 VanillaCompatibleGenerator.likeVanilla():54、默认路径 CorrectedContinentsGenerator.fromSeed():100、1.6 的 likeVanilla():57 又各调了一次。OneSixCompatibleGenerator.strictVanilla() 自身不再重复调用。
  • 「是否可建村庄」本身是一个逐生物群系的配置项:BiomeSettings.ID 会为每个群系生成 <名字> hasVillages 布尔配置(api/BiomeSettings.java:70),默认取 new Element(name, id, incidence, hasVillages, climate) 构造时传入的值。BiomeSettings.setVillages()(:316-318)把这些配置汇总进 ClimateControlRules.hasVillages[256] 布尔数组(api/ClimateControlRules.java:13、:50),读取入口是 hasVillages(int biomeID)(:39-41)。
  • MapGenVillageCC(generator/MapGenVillageCC.java:23)是 MapGenVillage 的子类,func_143025_a() 返回 "Village"(:59-60)。它与开关的接线关系无法从源码确认:grep -rn 'MapGenVillageCC' src/ 的全部命中都在该文件内部(:23、:36、:41、:112),没有任何其他类引用它,因此它当前是未接线的死代码。实际生效的村庄生物群系替换是上面第 4 步对 MapGenVillage.villageSpawnBiomes 的直接赋值。

相关条目