Saltpeter(硝石)生成
[!WARNING] 已订正(1.7.10 树) 原条目不是生物群系,而是矿石生成器;类名与 API 全部取自
mc-1.12.2:
- 类名错:1.7.10 的矿石事件分流类是
SaltpeterGenerator(不是GeneratorSaltpeter); 单点放置类是WorldGenSaltpeter(这个类名 1.7.10 确实存在,原条目此处无误)。- 原条目通篇使用 1.12.2 的
BlockPos/getTopSolidOrLiquidBlock(BlockPos)/biome.getTemperature(pos)API——1.7.10 源码树中net.minecraft.util.math.BlockPos零命中,对应方法签名是(int x, int y, int z)。- 条件判定用的是
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)
- 取当前区块的
worldX/worldZ。 TerrainGen.generateOre(world, rand, saltpeter, worldX, worldZ, EVENT_TYPE)判定本区块是否属于该矿的事件类型;不通过则跳过。canGen()判定生物群系条件;不通过则跳过。- 在区块内随机取
x、z(各rand.nextInt(16))。 y = world.getTopSolidOrLiquidBlock(x, z) - 1 - (rand.nextInt(100) == 0 ? 0 : 1)——即地表下方 1 格;100 分之 1 的概率只挖 0 格(即紧贴地表)。- 调用
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(恶地)等 干燥炎热、降雨量极低且不打雷的沙质群系。
相关条目
- Sulfur(硫磺)生成 - 1.7.10 中另一种自定义矿
- Ore Blocks