跳到正文
烈焰甘蔗Wiki

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。

相关条目

浏览全部模组