写实群系
基本信息
| 属性 | 值 |
|---|---|
| 基类 | rwg.biomes.realistic.RealisticBiomeBase(src/main/java/rwg/biomes/realistic/RealisticBiomeBase.java) |
| 实例容器 | RealisticBiomeBase 的 47 个 public static 字段(RealisticBiomeBase.java:67-140) |
| ID 分配 | 静态初始化顺序即 ID 顺序:biomeID = nextBiomeID++,写入 biomeList[256](RealisticBiomeBase.java:155-157) |
| 群系索引表 | private static final RealisticBiomeBase[] biomeList = new RealisticBiomeBase[256](RealisticBiomeBase.java:64) |
| 查询入口 | RealisticBiomeBase.getBiome(int id)(RealisticBiomeBase.java:165-167) |
| 选择算法 | ChunkManagerRealistic.getBiomeDataAt(int, int, float)(rwg/world/ChunkManagerRealistic.java:205) |
| 子类数量 | 48 个文件(src/main/java/rwg/biomes/realistic/ 下按 coast / desert / forest / land / ocean / red / savanna 分包),其中 47 个被实例化为静态字段 |
功能
「写实群系」才是 RWG 真正决定地形的单位。每个实例持有四个引用
(RealisticBiomeBase.java:144-148):
| 字段 | 含义 | 来源 |
|---|---|---|
biomeID |
0–255 的运行时索引 | RealisticBiomeBase.java:155 |
subID |
子类型编号 | 构造参数 sub |
baseBiome |
对应的基础群系(决定草色/刷怪) | 构造参数 biome |
beachBiome |
该群系过渡到海岸时使用的写实群系 | 构造参数 coast |
riverBiome |
河岸使用的基础群系 | 构造参数 river |
两参数构造器 RealisticBiomeBase(int sub, BiomeGenBase biome) 会默认填入
beachBiome = coastIce、riverBiome = RWGBiomes.baseRiverTemperate
(RealisticBiomeBase.java:150-152)。四参数构造器可逐个指定(RealisticBiomeBase.java:154-163)。
选择算法
getBiomeDataAt 先用一条气候噪声 b 把世界切成气候带,再用一条独立的噪声 h
在各带内部做群系细分(ChunkManagerRealistic.java:225-270):
b = biomecell.noise((x + 4000) / 1200, z / 1200, 1) * 0.5 + 0.5 // 气候带
h = biomecell.noise(x / 450, z / 450, 1) * 0.5 + 0.5 // 带内细分
h *= <该带列表长度>; return <该带列表>.get((int) h)
条件(ChunkManagerRealistic.java) |
选中的列表 |
|---|---|
s > 0.975f(s 为 /140 尺度噪声,仅当 smallEnabled) |
biomes_small(235-240) |
b < 0.25f(wetEnabled)/ b < 0.33f(未启用) |
biomes_snow(241-245) |
b < 0.50f / b < 0.66f |
biomes_cold(246-251) |
b < 0.75f / b < 1f |
biomes_hot(252-257) |
其余且 wetEnabled |
biomes_wet(258-263) |
其余且未启用 wetEnabled |
biomes_hot(264-269) |
两个开关由列表长度决定(ChunkManagerRealistic.java:123-131):
wetEnabled = biomes_wetLength > 0;smallEnabled = biomes_smallLength > 1。
因为原生列表中 biomes_wet 为空,wetEnabled 只有在装了支持湿地的第三方群系时才会为 true。
结果按坐标缓存在 biomeDataMap,超过 4096 条时整体清空(ChunkManagerRealistic.java:272-277)。
数值
47 个写实群系实例
| 分组 | 字段(RealisticBiomeBase.java 行号) |
|---|---|
| 测试用 | test(67)、river(68)、ocean(70)、coast(71) |
| 极地 | polar(74) |
| 雪地 | snowHills(77)、snowRivers(78)、snowLakes(79)、redwoodSnow(80) |
| 松林 | tundraHills(83)、tundraPlains(84)、taigaHills(85)、taigaPlains(86) |
| 森林 | redwood(89)、darkRedwood(90)、darkRedwoodPlains(91)、woodhills(92)、woodmountains(93) |
| 稀树草原 | duneValleyForest(96)、savanna(97)、savannaForest(98)、savannaDunes(99)、stoneMountains(100)、stoneMountainsCactus(101)、hotForest(102)、hotRedwood(103)、canyonForest(104)、mesaPlains(105) |
| 沙漠 | desert(108)、desertMountains(109)、duneValley(110)、oasis(111) |
| 红岩区 | redDesertMountains(114)、redDesertOasis(115)、canyon(116)、mesa(117) |
| 丛林 | rainForestHigh(124)、jungleHills(125)、jungleCanyon(126)、redwoodJungle(127) |
| 海岸 | coastIce(130)、coastColdSlope(132)、coastColdCliff(133)、coastDunes(134)、coastMangrove(136)、coastOasis(137) |
| 海洋 | islandTropical(140) |
源码中的 SWAMP(119 行)与 TROPICAL(121 行)分组只有注释标题,没有任何字段。
原生选择列表
| 列表 | 条目数 | 去重后 | 行号 |
|---|---|---|---|
biomes_snow |
5 | 5 | ChunkManagerRealistic.java:71-75 |
biomes_cold |
11 | 9 | 77-88(woodhills、woodmountains 各被 add 两次) |
biomes_hot |
18 | 18 | 90-107 |
biomes_wet |
0 | 0 | 仅由 Support.biomes_wet 填充(112) |
biomes_small |
0 | 0 | 仅由 Support.biomes_small 填充(113) |
biomes_test |
0 | 0 | 仅由 Support.biomes_test 填充(114) |
合计原生可选 32 个,第三方联动最多再补 76 个(见第三方群系联动)。
源码中可核实的未接线实例
以下 12 个群系会被实例化、占用一个 biomeID 并进入 biomeList,但既未加入任何选择列表,
源码中也没有按字段名引用(grep -rn "RealisticBiomeBase.<name>" src/main/java/ 零匹配):
test、river、coast、coastColdSlope、coastColdCliff、coastMangrove、coastOasis、
islandTropical、rainForestHigh、jungleHills、jungleCanyon、redwoodJungle
(ocean 的 2 处引用位于 ChunkManagerRealistic.java:212、217 的注释块内。)
另有 RealisticBiomeIslandTundra(rwg/biomes/realistic/ocean/RealisticBiomeIslandTundra.java)
是本 mod 唯一写了类却从未实例化的写实群系:RealisticBiomeBase 的静态字段里没有对应项,
因此它不占用 biomeID、不会进入 biomeList,是完全不可达的代码。
其中 islandTropical 值得单独一提:它是本仓库中唯一重写了 rMapGen 的群系,会调用
MapVolcano.build(...)(rwg/biomes/realistic/ocean/RealisticBiomeIslandTropical.java:71),
但由于它无法被 getBiomeDataAt 选中,该调用在本仓库内没有可达路径。
同理 rwg/map/MapAncientRuins.java 与 rwg/map/old/ 下的
MapGenAncientVillage、MapGenSmallRiver 均无任何调用点。
交互
无玩家直接交互。玩家只能通过世界类型选择间接影响群系分布。