第三方群系联动
基本信息
| 属性 | 值 |
|---|---|
| 联动入口 | rwg.support.Support.init(),在 postInit 调用(rwg/RWG.java:51) |
| 检测方式 | Loader.isModLoaded(<modid>)(rwg/support/Support.java:34-47) |
| 支持的模组 | Biomes O’ Plenty、Extrabiomes XL、Thaumcraft、ChromatiCraft |
| 挂载包装类 | rwg.support.RealisticBiomeSupport(extends RealisticBiomeBase) |
| 联动群系总数 | 76 条注册语句(BOP 43 + EBXL 28 + CC 2 + TC 3) |
| 是否硬依赖 | 否。四者都是运行时可选检测,缺哪个都不影响 mod 启动 |
功能
RWG 允许其他模组的群系出现在 RWG 世界里,而且让这些群系复用 RWG 的地形/地表生成器,
而不是只拿到一块平底草原。做法是把外部 BiomeGenBase 包进 RealisticBiomeSupport,
再挂到 RWG 的气候带列表上。
RealisticBiomeSupport
RealisticBiomeSupport(rwg/support/RealisticBiomeSupport.java)继承 RealisticBiomeBase,
额外持有:
| 字段 | 说明 | 行号 |
|---|---|---|
customBiome |
外部模组的原始群系对象 | 18 |
terrain |
单个 TerrainBase,rNoise 直接转发给它 |
19、65-67 |
surfaces |
SurfaceBase[],rReplace 按序全部执行 |
21-22、72-75 |
edits |
EditBase[],在 rDecorate 中逐个补充装饰 |
24-25、59-61 |
三个构造器分别接受「表面数组 + 编辑数组」(27-35)、「单表面 + 单编辑」(44-46)、
「单表面、无编辑」(48-50)。
关键行为:rDecorate 在 strength > 0.3f 时调用原群系的 customBiome.decorate(...)
(RealisticBiomeSupport.java:55-57)—— 即在陆地强度足够时才让外部群系自己播撒植被。
四套联动
| 模组 | modid 检测 | 源码类 | 注册语句数 |
|---|---|---|---|
| Biomes O’ Plenty | Loader.isModLoaded("BiomesOPlenty") |
rwg/support/SupportBOP.java |
43 |
| Extrabiomes XL | Loader.isModLoaded("ExtrabiomesXL") |
rwg/support/SupportEBXL.java |
28 |
| Thaumcraft | Loader.isModLoaded("Thaumcraft") |
rwg/support/SupportTC.java |
3 |
| ChromatiCraft | Loader.isModLoaded("ChromatiCraft") |
rwg/support/SupportCC.java |
2 |
Support.java:48 对 ChromatiCraft 有一条注释:
/** ChromatiCraft is non-supported content. if this ever errors out in some way feel free to remove this. */
Biomes O’ Plenty:42 个不同群系、43 条注册语句(brushland 注册了两次,一次草原一次沙谷)。
覆盖 bambooForest、bayou、bog、borealForest、brushland、canyon、chaparral、cherryBlossomGrove、
coniferousForest、deadForest、deadSwamp、deciduousForest、fen、frostForest、fungiForest、garden、
grove、heathland、highland、jadeCliffs、lavenderFields、lushDesert、lushSwamp、mapleWoods、meadow、
mountain、mysticGrove、outback、prairie、rainforest、redwoodForest、sacredSprings、seasonalForest、
shield、shrubland、sludgepit、snowyConiferousForest、temperateRainforest、tropicalRainforest、tundra、
wetland、woodland。文件开头另有 ALPS、ARCTIC 两个条目被整段注释掉,未接入。
Extrabiomes XL:28 个群系,逐个用 BiomeManager.<name>.isPresent() 做 Optional 判空后注册
(SupportEBXL.java:34 起)。alpine、autumnwoods、birchforest、extremejungle、forestedhills、
forestedisland、glacier、greenhills、greenswamp、icewasteland、marsh、meadow、minijungle、
mountaindesert、mountainridge、mountaintaiga、pineforest、rainforest、redwoodforest、redwoodlush、
savanna、shrubland、snowforest、snowyrainforest、temperaterainforest、tundra、wasteland、woodlands。
Thaumcraft 与 ChromatiCraft 的注册语句写在
for (int i = 0; i < 256; i++) 循环里,按群系名匹配
(SupportTC.java:21-22、SupportCC.java:20-22),因此实际生效数量取决于对方 mod 实际注册了几个同名词条,
上表的「注册语句数」是代码分支数而非运行时数量:
- Thaumcraft 匹配
Tainted Land(固定按TerrainSmallSupport小群系挂载)与Magical Forest(受Generate large Thaumcraft biomes开关控制,true走TerrainHighland+baseTemperateForest大群系,false走TerrainSmallSupport+baseRiverTemperate,SupportTC.java:37-60) - ChromatiCraft 匹配
Ender Forest、Rainbow Forest(挂BiomeCategory.HOT)与Luminous Cliffs、Luminous Cliffs Shores,源码注释记录其群系 ID 为 46/47/48/49 (SupportCC.java:13-15)
村庄材质替换
rwg/data/VillageMaterials.java 是一个独立的 Forge 事件处理器,在 preInit 中注册到
MinecraftForge.TERRAIN_GEN_BUS(rwg/RWG.java:40)。它订阅两个事件并按 biomeID 查表替换方块:
BiomeEvent.GetVillageBlockID(VillageMaterials.java:18-60):替换Blocks.log、Blocks.cobblestone、Blocks.planks、Blocks.gravel、Blocks.oak_stairs、Blocks.stone_stairs、Blocks.stone_slabBiomeEvent.GetVillageBlockMeta(VillageMaterials.java:63-95):替换 log、cobblestone、planks、 gravel、stone_slab 的 metadata
查表数组 dataList 大小为 256,通过静态方法 registerVillageMaterial(VillageMaterialData) 填充
(VillageMaterials.java:11-15)。本仓库中没有任何地方调用该注册方法
(grep -rn "registerVillageMaterial" src/main/java/ 仅命中定义处),因此表始终为空,
该处理器不会替换任何村庄方块。rwg/data/TreeReplacement.java 同理未注册(见地表装饰)。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 联动模组数 | 4 | Support.java:34-47 |
| 注册语句总数 | 76(BOP 43 + EBXL 28 + CC 2 + TC 3) | grep -c "Support.addBiome(" 逐文件统计 |
| BOP 不同群系数 | 42 | grep -oE "BOPCBiomes\.\w+" 去重 |
| EBXL 不同群系数 | 28 | grep -oE "BiomeManager\.\w+" 去重 |
| 气候带分类枚举 | 6(SNOW / COLD / HOT / WET / SMALL / TEST) | Support.java:17-24 |
| 联动列表容量上限 | 随各 mod 实际注册数,无上限 | Support.java:27-32 |
| 村庄材质表大小 | 256 | VillageMaterials.java:11 |
| 装饰触发阈值 | strength > 0.3f |
RealisticBiomeSupport.java:55 |
源码中可核实的实现问题
Support.addBiome(RealisticBiomeSupport b, BiomeCategory cat) 的 switch 语句中,
6 个 case 分支全都没有 break(rwg/support/Support.java:51-70):
switch (cat) {
case SNOW: biomes_snow.add(b);
case COLD: biomes_cold.add(b);
case HOT: biomes_hot.add(b);
case WET: biomes_wet.add(b);
case SMALL: biomes_small.add(b);
case TEST: biomes_test.add(b);
}
按 Java 的 switch 贯穿语义,无论传入哪个分类,同一个群系对象都会被加入全部 6 个列表。
这与作者在 SupportEBXL / SupportBOP 中逐条标注 BiomeCategory.SNOW / COLD / HOT / WET
的意图不符。此处仅陈述源码事实,未在本环境实际运行游戏验证其表现。
交互
无玩家直接交互。联动效果只在创建 RWG 世界时按群系名/群系对象匹配生效。 注意 RWG 的 Biome ID 占用 200–224,与其他 mod 的群系 ID 可能冲突,配置见配置文件。