凝矿兰权重表
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 主世界表 | 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):
- 把权重表转成
WeightedRandom.Item列表(私有StringRandomItem持有名字) WeightedRandom.getRandomItem(rand, values)按权重抽一个物品字典名OreDictionary.getOres(ore)取出该名字下的全部ItemStack- 遍历这些堆,跳过类名以
gregtech或gregapi开头的物品 - 返回第一个非 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,自动化装置必须持续提供可替换方块才能维持产出。