村庄生物群系
基本信息
| 属性 | 值 |
|---|---|
| 源码位置 | 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):
- 新建
ClimateControlRules,遍历settings().biomeSettings()收集各生物群系包声明的村庄规则(:80-82) - 遍历全部 256 个生物群系 ID,凡是
newRules.hasVillages(i)为真的就加入列表(:83-88) - 用该列表构造
VillageBiomes并调用reportMembers()(:89-90) - 仅当
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的直接赋值。
相关条目
- 综合参数 -
controlVillageBiomes配置项 - 原版生物群系 - 村庄规则与禁止石头海滩的来源
- GenLayer 生成栈 -
setRules()的调用点