跳到正文
烈焰甘蔗Wiki

Saltpeter(硝石)生成

[!WARNING] 已订正(1.7.10 树) 原条目不是生物群系,而是矿石生成器;类名与 API 全部取自 mc-1.12.2:

  1. 类名错:1.7.10 的矿石事件分流类是 SaltpeterGenerator(不是 GeneratorSaltpeter); 单点放置类是 WorldGenSaltpeter(这个类名 1.7.10 确实存在,原条目此处无误)。
  2. 原条目通篇使用 1.12.2 的 BlockPos / getTopSolidOrLiquidBlock(BlockPos) / biome.getTemperature(pos) API——1.7.10 源码树中 net.minecraft.util.math.BlockPos 零命中,对应方法签名是 (int x, int y, int z)。
  3. 条件判定用的是 canSpawnLightningBolt()(是否生成闪电), 不是原条目写的 canRain()。

证据:worldgen/SaltpeterGenerator.java:30,33-66、worldgen/WorldGenSaltpeter.java:21-44。

基本信息

属性 值
类型 矿石生成器(不是生物群系)
事件分流类 SaltpeterGenerator(监听 OreGenEvent.Post)
单点放置类 WorldGenSaltpeter(继承 WorldGenerator)
矿石方块 BlockOre.getBlock() + metadata EnumOre.SALTPETER.ordinal()
附带方块 硝石下方会放置 BlockWorldLogic 方块(WorldGenSaltpeter.java:37-40)
事件类型 EVENT_TYPE(TerrainGen.generateOre 参数)

WorldGenSaltpeter.generate()(WorldGenSaltpeter.java:32-44)

public boolean generate(World world, Random rand, int x, int y, int z) {
    if (isReplaceable(world, rand, x, y, z)) {
        world.setBlock(x, y, z, minableBlock, minableBlockMeta, 2);
        Block worldLogic = BlockWorldLogic.getBlock();
        if (worldLogic != null)
            world.setBlock(x, 0, z, worldLogic, 0, 2);   // 注意:y 固定为 0
    }
    return true;
}

1.7.10 的矿石是单一注册名 + metadata 变体(BlockOre + EnumOre 序号), 不是 1.12.2 的 IBlockState 体系。

生成流程(generate(),SaltpeterGenerator.java:33-52)

  1. 取当前区块的 worldX / worldZ。
  2. TerrainGen.generateOre(world, rand, saltpeter, worldX, worldZ, EVENT_TYPE) 判定本区块是否属于该矿的事件类型;不通过则跳过。
  3. canGen() 判定生物群系条件;不通过则跳过。
  4. 在区块内随机取 x、z(各 rand.nextInt(16))。
  5. y = world.getTopSolidOrLiquidBlock(x, z) - 1 - (rand.nextInt(100) == 0 ? 0 : 1) ——即地表下方 1 格;100 分之 1 的概率只挖 0 格(即紧贴地表)。
  6. 调用 saltpeter.generate(world, rand, x, y, z)。

原条目声称「Y = 50 ~ 100」的硬性高度区间与「每区块 64 次尝试」—— 这两个数字在 1.7.10 的 SaltpeterGenerator 中不存在,已删除。

canGen() 条件(SaltpeterGenerator.java:54-66)

BiomeGenBase biome = world.getBiomeGenForCoords(x + 16, z + 16);
if (!BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.SANDY)) return false;
if (!BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.DRY))    return false;
if (biome.canSpawnLightningBolt())                                      return false;
return biome.temperature >= 1.5f && biome.rainfall <= 0.1f;
条件 要求 1.7.10 API
群系类型 SANDY BiomeDictionary.isBiomeOfType
群系类型 DRY BiomeDictionary.isBiomeOfType
闪电 不能生成闪电 biome.canSpawnLightningBolt()
温度 >= 1.5f biome.temperature(字段)
降雨量 <= 0.1f biome.rainfall(字段)

注意:1.7.10 不限制维度。canGen() 中没有 world.provider.getDimension() != 0 的判断, 原条目「仅主世界」的说法在 1.7.10 中无法核实。

典型适合生物群系

沙漠(Desert)、沙漠丘陵(Desert Hills)、热带草原(Savanna)、Mesa(恶地)等 干燥炎热、降雨量极低且不打雷的沙质群系。

相关条目

浏览全部模组