SlimeIsland
浮空黏液岛世界生成。⚠️ 已订正:「16×16×8 chunks」是把树位置扫描循环误当成岛屿尺寸;「yPos ≥ 4 + 天空光照」来自被注释掉的代码;维度黑名单语义写反。
基本信息
| 属性 | 值 |
|---|---|
| 生成类 | tconstruct.world.gen.SlimeIslandGen(WorldGenerator + IWorldGenerator) |
| 注册 | GameRegistry.registerWorldGenerator(new SlimeIslandGen(TinkerWorld.slimePool, 2), 2)(TConstruct.java:248) |
| 生成概率 | random.nextInt(PHConstruct.islandRarity) == 0 |
| 形状 | java.awt.geom.Ellipse2D.Double |
| 岛屿长宽 | 各 20–32 格(random.nextInt(13) + 20) |
| 初始厚度 | 12 格,底部侵蚀后 8 格 |
已订正 1(最严重):原文
生成规模 16×16×8 chunks与「脚印:16×16×8 chunks」完全错误。 16×16×8 这个数字确实出现在源码里,但它是SlimeIslandGen中第二个generate(World, Random, int, int, int)重载里给树周围铺块的体素扫描循环(for (xPos = 0; xPos < 16; ++xPos) ... for (yPos = 0; yPos < 8; ++yPos)),单位是方块不是区块,且与岛屿尺寸无关。 真实岛屿尺寸:xRange = random.nextInt(13) + 20、zRange = random.nextInt(13) + 20,即 20–32 × 20–32 格(SlimeIslandGen.java:56-58)。 已订正 2:原文称表面条件为「yPos ≥ 4且天空光照 > 0 时的顶层」——「天空光照」条件来自被注释掉的代码。 实际表层条件只有「当前位置是base且正上方一格为空」:if (world.getBlock(xPos, yPos, zPos) == base) { Block block = world.getBlock(xPos, yPos + 1, zPos); if (block == null || block == Blocks.air) world.setBlock(xPos, yPos, zPos, top, 0, 2); }放置时 metadata 固定 0。证据:
SlimeIslandGen.java:115-121。 另:yPos >= 4这个比较确实存在,但在另一个语境——yPos >= 4 ? Blocks.air : this.liquidBlock(第 218 行),用于决定岛屿下方填空气还是黏液池液体,与草皮表层无关。 被注释掉的那段位于/* for (z -= 8; y > 5 && world.isAirBlock(x, y, z); --y) { ; } if (y <= 4) { return false; } else { */(SlimeIslandGen.java:152-154)。 已订正 3:原文称「可通过PHConstruct配置禁用每个维度的生成」——语义写反。
⚠️ 维度黑名单:源码条件与注释意图相反
if (DimensionBlacklist.isDimInBlacklist(world.provider.dimensionId)) {
if (random.nextInt(PHConstruct.islandRarity) == 0) generateIsland(...);
}
证据:SlimeIslandGen.java:48-50。生成调用嵌在 isDimInBlacklist(...) 为真时执行,即只有被列入黑名单的维度才生成黏液岛,而非「黑名单禁用生成」。从方法名 genIslandsFlat(PHConstruct)的用法看,开发者本意应是 if (!isDimInBlacklist(...)),此处疑似源码缺陷(详见交付报告⑥)。
垂直坐标
| 属性 | 公式 |
|---|---|
| 中心高度 | 50 + world.getHeightValue(xChunk, zChunk) + random.nextInt(50) |
即岛底大致悬在地表高度 +50~+99 处(SlimeIslandGen.java:57)。
方块组成
| 部分 | 方块 | metadata | 证据 |
|---|---|---|---|
| 岛体基底 | TinkerTools.craftedSoil |
5 | world.setBlock(..., base, 5, 2)(第 68 行) |
| 表层 | TinkerWorld.slimeGrass |
0 | 第 119 行 |
| 岛上高草 | TinkerWorld.slimeTallGrass |
— | PlantGen(..., 0, 128, xRange, 1, zRange, false)(第 129 行) |
| 岛下填充 | slimePool(TConstruct:liquid.slime) |
— | yPos >= 4 ? air : liquidBlock(第 218 行) |
| 边缘黏液 | TinkerWorld.slimeGel |
2(紫色) | 第 252 行 |
已订正 4:原文写「
slimeGel+gelMeta」但没给值。gelMeta来自构造参数new SlimeIslandGen(TinkerWorld.slimePool, 2),故 gelMeta = 2 = 紫色。 ⚠️ 补充:该铺黏液代码被if (this.liquidBlock.getMaterial() == Material.water)包裹(第 237 行),而传入的是黏液池方块而非水,该分支在黏液岛实际生成时不执行。原文称「slimeGel形成周围的边缘/液体层」不准确。
已订正 5:原文「使用
SlimeTreeGen生成树木,参数(false, 5, 4, 1, 0)」——此条正确。证据:SlimeTreeGen trees = new SlimeTreeGen(false, 5, 4, 1, 0);(SlimeIslandGen.java:30)。 原文「4–8 随机噪声倍频用于自然变化」——树生成器的噪声半径实测为rand.nextInt(4) + 4,即 4–7(SlimeIslandGen.java:158)。无法核实原文 4–8 的上界。 原文「使用IChunkProvider进行世界生成分发」——正确,签名参数确为IChunkProvider chunkGenerator, IChunkProvider chunkProvider。
相关条目
- SlimeGel — 岛屿边缘黏液(meta 2 紫)
- SlimeGrass — 岛屿表面草方块
- BlueSlime — 黏液岛关联史莱姆