凝矿兰权重表

基本信息

属性 值 来源
主世界表 BotaniaAPI.oreWeights:43 项,权重总和 184755 api/BotaniaAPI.java:87,静态块 :128 起
下界表 BotaniaAPI.oreWeightsNether:24 项,权重总和 79130 api/BotaniaAPI.java:88
注册方法 BotaniaAPI.addOreWeight(ore, weight) / addOreWeightNether(ore, weight) BotaniaAPI.java:584、:598
消费方 SubTileOrechid(主世界)/ SubTileOrechidIgnem(下界) SubTileOrechid.java:124、:122
表内元素性质 物品字典名(oreXxx),不是物品 见下

这张表决定了「凝矿兰(Oreachid)每次凝结出什么矿石」的概率。共 67 个条目,是 Botania 中体量最大的单张数据表之一。

⚠️ 这不是世界生成表。Botania 没有注册任何 IWorldGenerator;oreWeight 里的 ore 字样指「矿石物品字典名」,与世界生成无关。真正影响凝矿兰落点的是 getCoordsToPut() 的方块扫描(见「落点」一节)。

两张表都由静态初始化器硬编码

两张表都写在 BotaniaAPI 的 static { } 块里(:129 起),不是循环、不是枚举、不是从附属模组动态收集。因此:

  • 条目数固定为 43 / 24,附属模组无法注册新权重
  • 每行都带 // 来源模组 注释,共覆盖 Vanilla、IC2、Thermal Expansion、Tinkers’ Construct、Thaumcraft、Ender IO、NuclearCraft / Big Reactors 等
  • 键是字符串,附属模组若用了未登记的 oreXxx 名字,凝矿兰永远抽不到它

对外只暴露 getOreWeight(String) / getOreWeightNether(String) 两个只读查询(BotaniaAPI.java:601-607),没有 public 的 addOreWeight,所以其他模组无法扩充这张表。

主世界表(43 项)

物品字典名 权重 来源模组(源码注释)
oreAluminum 3940 Tinkers’ Construct
oreAmber 2075 Thaumcraft
oreApatite 1595 Forestry
oreBlueTopaz 3195 Ars Magica
oreCertusQuartz 3975 Applied Energistics
oreChimerite 3970 Ars Magica
oreCinnabar 2585 Thaumcraft
oreCoal 46525 Vanilla
oreCopper 8325 IC2, Thermal Expansion, Tinkers’ Construct 等
oreDark 1350 EvilCraft
oreDarkIron 1700 Factorization(旧版本)
oreFzDarkIron 1700 Factorization(新版本)
oreDiamond 1265 Vanilla
oreEmerald 780 Vanilla
oreGalena 1000 Factorization
oreGold 2970 Vanilla
oreInfusedAir 925 Thaumcraft
oreInfusedEarth 925 Thaumcraft
oreInfusedEntropy 925 Thaumcraft
oreInfusedFire 925 Thaumcraft
oreInfusedOrder 925 Thaumcraft
oreInfusedWater 925 Thaumcraft
oreIron 20665 Vanilla
oreLapis 1285 Vanilla
oreLead 7985 IC2, Thermal Expansion, Factorization 等
oreMCropsEssence 3085 Magical Crops
oreMithril 8 Thermal Expansion
oreNickel 2275 Thermal Expansion
oreOlivine 1100 Project RED
orePlatinum 365 Thermal Expansion
oreRedstone 6885 Vanilla
oreRuby 1100 Project RED
oreSapphire 1100 Project RED
oreSilver 6300 Thermal Expansion, Factorization 等
oreSulfur 1105 Railcraft
oreTin 9450 IC2, Thermal Expansion 等
oreUranium 1337 IC2
oreVinteum 5925 Ars Magica
oreYellorite 3520 Big Reactors
oreZinc 6485 Flaxbeard’s Steam Power
oreMythril 6485 Simple Ores2
oreAdamantium 2275 Simple Ores2
oreTungsten 3520 Simple Tungsten

oreCoal 权重 46525 独占总量 184755 的 25.2%,oreIron(20665)11.2%,两者合计超过三分之一。oreMithril 只有 8 权重(0.004%),实际抽中概率极低。

oreDarkIron 与 oreFzDarkIron 是同一批物品的两个键(Factorization 新旧版本),各记 1700,等于把暗铁的有效概率翻倍。

下界表(24 项)

物品字典名 权重 来源模组(源码注释)
oreQuartz 19600 Vanilla
oreCobalt 500 Tinker’s Construct
oreArdite 500 Tinker’s Construct
oreFirestone 5 Railcraft
oreNetherCoal 17000 Nether Ores
oreNetherCopper 4700 Nether Ores
oreNetherDiamond 175 Nether Ores
oreNetherEssence 2460 Magical Crops
oreNetherGold 3635 Nether Ores
oreNetherIron 5790 Nether Ores
oreNetherLapis 3250 Nether Ores
oreNetherLead 2790 Nether Ores
oreNetherNickel 1790 Nether Ores
oreNetherPlatinum 170 Nether Ores
oreNetherRedstone 5600 Nether Ores
oreNetherSilver 1550 Nether Ores
oreNetherSteel 1690 Nether Ores
oreNetherTin 3750 Nether Ores
oreFyrite 1000 Netherrocks
oreAshstone 1000 Netherrocks
oreDragonstone 175 Netherrocks
oreArgonite 1000 Netherrocks
oreOnyx 500 SimpleOres 2
oreHaditeCoal 500 Hadite

下界表同样由 oreQuartz(19600)与 oreNetherCoal(17000)主导,两者占 79130 的 46.3%。oreFirestone 权重 5,是全表最低项(0.006%)。

表内 13 个 oreNetherXxx 全部来自 Nether Ores 模组 —— 下界表对这个模组依赖极重。

抽取与落点机制

SubTileOrechid.getOreToPut()(SubTileOrechid.java:69-96):

  1. 把权重表转成 WeightedRandom.Item 列表(私有 StringRandomItem 持有名字)
  2. WeightedRandom.getRandomItem(rand, values) 按权重抽一个物品字典名
  3. OreDictionary.getOres(ore) 取出该名字下的全部 ItemStack
  4. 遍历这些堆,跳过类名以 gregtech 或 gregapi 开头的物品
  5. 返回第一个非 GregTech 的堆

GregTech 是硬编码排除

第 4 步用字符串前缀判断而非接口或 modid:

String clname = item.getClass().getName();
if(clname.startsWith("gregtech") || clname.startsWith("gregapi"))
    continue;

源码在这段前有一整段开发者吐槽注释(SubTileOrechid.java:83-89)。效果是:装了 GregTech 且 GT 矿物注册进 oreXxx 时,凝矿兰会跳过它们抽下一个。这是唯一一处按类名而非 modid 做的排除,改包名就会失效。

递归重试没有上限

若某个字典名下的堆全部是 GregTech 物品,代码走到 return getOreToPut();(SubTileOrechid.java:96)无参数递归。表里没有重试计数器,理论上存在栈溢出的可能;在正常整合包里极难触发(需要某个 oreXxx 整个字典只有 GT 物品)。

落点范围

getCoordsToPut()(SubTileOrechid.java:99-117)在以花为中心的 RANGE × RANGE_Y × RANGE = 5 × 3 × 5 的盒子里扫描,取第一个满足 block.isReplaceableOreGen(world, x, y, z, source) 的方块(随机挑选,而非第一个):

花 RANGE RANGE_Y 源方块 getSourceBlock() 重量表 法力消耗 延迟
凝矿兰 orechid 5 3 Blocks.stone oreWeights(43 项) 17500(COST) 100(DELAY)
地狱凝矿兰 orechidIgnem 5 3 Blocks.netherrack oreWeightsNether(24 项) 20000(SubTileOrechidIgnem.COST) 同 100

常量在 SubTileOrechid.java:35-40。SubTileOrechidIgnem 只重写 5 个方法:消耗、重量表、源方块、canOperate()(仅 provider.isHellWorld,:25-28)、getColor()(0xAE3030,:46-48)。

⚠️ 安装 Garden of Glass(Botania.gardenOfGlassLoaded)后主世界凝矿兰的消耗与延迟被改写(SubTileOrechid.java:131-137):消耗 17500 → 700(COST_GOG),延迟 100 → 2(DELAY_GOG)。地狱凝矿兰没有对应的 GOG 常量,不受影响。

与挑战系统的关系

挑战 orechid「自动凝矿」要求凝矿兰完全自动化(ModChallenges)。由于本页的两张表都是硬编码的、且落点扫描依赖 isReplaceableOreGen,自动化装置必须持续提供可替换方块才能维持产出。

相关条目