BiomeProviderRTG
基本信息
| 属性 | 值 |
|---|---|
| 类名 | sedridor.forgeamidst.BiomeProviderRTG |
| 文件 | src/main/java/sedridor/forgeamidst/BiomeProviderRTG.java |
| 行数 | 166 |
| 启用版本 | Minecraft 1.7.10 |
功能
RTG 生物群系桥。RTG 使用自研的噪声系统(OpenSimplex + SimplexCellular)
而非原版 GenLayer,因此本类单独复刻了一套「按区块采样生物群系」的能力,
让 Map 在 RTG 世界下也能画出正确的生物群系。
硬编码的采样参数
| 字段 | 值 | 说明 |
|---|---|---|
sampleSize |
8 |
采样步长(方块) |
sampleArraySize |
21 |
采样数组边长(构造器内赋值) |
biomeData |
int[sampleArraySize * sampleArraySize] = int[441] |
采样结果 |
weightedBiomes |
float[BiomeGenBase.getBiomeGenArray().length] |
权重数组 |
storage |
new TimedHashMap(60000) |
LRU 容量 60000 |
baseBiomesList |
new BiomeGenBase[256] |
基础群系表 |
⚠️ 21 × 21 = 441 是 int 数组元素数,不是地图分辨率的说法;
采样是以 8 方块为步长的稀疏网格(8 × 8 方块 = 1 区块)。
⚠️ storage 的 60000 是缓存条目上限(约 937 个区块),
无过期时间配置项。
构造器的 RTG 耦合
this.cmr = (RTGBiomeProvider) this.worldObj.getWorldChunkManager();
this.simplex = new OpenSimplexNoise(seed);
this.cell = new SimplexCellularNoise(seed);
⚠️ (RTGBiomeProvider) 强转 getWorldChunkManager() ——
即在 RTG 缺席时必然 ClassCastException。
⚠️ 但本类直接 import 了 RTG 的类
(RTGBiomeProvider、OpenSimplexNoise、SimplexCellularNoise、
RealisticBiomePatcher、BiomeAnalyzer、ChunkLandscape、
PlaneLocation、TimedHashMap)。
这与 after:RTG 软依赖形成矛盾:
| 层面 | RTG |
|---|---|
| FML 依赖声明 | after:RTG(软) |
| 编译期 import | 直接依赖(硬) |
| 运行期 | 强转 getWorldChunkManager() |
即:编译必须要有 RTG,但 FML 层声明为软依赖。 只有当 RTG 存在时才会走到本类,所以不构成启动崩溃; 但「装 ForgeAmidst 不装 RTG 就能跑」的说法仅在不触发本类时成立。
provideInts(int cx, int cy, int width, int height)
主入口:landscape(cmr, cx * 16, cy * 16) 取地形样本,
再对 i = 0..255 逐像素填充。
⚠️ cx * 16 把区块坐标换算为方块坐标(16 = 1 区块边长)。
与 MapWorld 的伪世界方案共用同一坐标基准。
⚠️ 逐像素处理包在 try 里(源码 try { 出现在 for (i = 0; i < 256; i++) 内),
说明存在逐点容错。
实现要点
analyzer.xyinverted()提供采样坐标翻转数组。setWeightings()在构造末尾调用,初始化weightedBiomes。RealisticBiomePatcher biomePatcher用于按 RTG 规则修正群系边界。
关联
- MapWorldRTG - RTG 伪世界
- Map - 消费生物群系数据
- ForgeAmidst -
rtgFound判定 - Realistic Terrain Generation - 提供
RTGBiomeProvider等类(已登记未成文)