附魔要素定价
基本信息
| 属性 | 值 |
|---|---|
| 管理类 | thaumic.tinkerer.common.enchantment.core.EnchantmentManager |
| 初始化 | EnchantmentManager.initEnchantmentData(),调用点 TTCommonProxy.java:149 |
| 数据表 | Map<Integer, Map<Integer, EnchantmentData>> enchantmentData(EnchantmentManager.java:34),一级键为附魔 effectId,二级键为等级 |
| 数据行总数 | 41(vanilla=true 26 行 + vanilla=false 15 行,其中 14 个不同附魔 + 1 行重复) |
| 自定义 Aspect | 0 —— 本模组不定义任何 Aspect,只消费 Thaumcraft 的 Aspect 常量 |
Thaumic Tinkerer 为全部 26 个原版附魔重新指定了要素消耗,使附魔可以通过魔法机制参与定价;同一张表也承载本模组的 14 个自定义附魔。
数值:放大公式
每条注册只传入「1 级要素」,实际每级消耗由 registerExponentialCostData() 在 enchantment.getMinLevel()..getMaxLevel() 区间上展开(EnchantmentManager.java:303-312):
multiplier(i) = i * (1 + 0.2 * i)
cost(要素, 等级 i) = (int)(基础值 * multiplier(i))
MiscHelper.multiplyAspectList() 对每个要素做整数截断相乘(MiscHelper.java:65-72),并在 multiplier == 1 时直接返回原列表。
| 等级 i | multiplier | 计算式 |
|---|---|---|
| 1 | 1.2 | 1 × (1 + 0.2) |
| 2 | 2.8 | 2 × (1 + 0.4) |
| 3 | 4.8 | 3 × (1 + 0.6) |
| 4 | 7.2 | 4 × (1 + 0.8) |
| 5 | 10.0 | 5 × (1 + 1.0) |
注意:等级 1 的乘数是 1.2 而非 1.0,因此实际 1 级消耗 = 基础值 × 1.2 后截断,下表给出的是传入的基础值而非最终消耗。
原版附魔定价表(26 项)
以下为注册时传入的 1 级基础要素,行号指向 EnchantmentManager.java。
| # | 附魔 | 源码常量 | 1 级要素 | 源码行 |
|---|---|---|---|---|
| 1 | Protection | Enchantment.protection |
EARTH 10 + ENTROPY 7 | 41 |
| 2 | Fire Protection | Enchantment.fireProtection |
FIRE 10 + ENTROPY 3 + WATER 4 | 46 |
| 3 | Feather Falling | Enchantment.featherFalling |
AIR 16 + ORDER 5 | 51 |
| 4 | Blast Protection | Enchantment.blastProtection |
EARTH 5 + FIRE 5 + ENTROPY 8 | 56 |
| 5 | Projectile Protection | Enchantment.projectileProtection |
AIR 10 + ENTROPY 7 | 61 |
| 6 | Respiration | Enchantment.respiration |
WATER 10 + AIR 8 + ORDER 5 | 66 |
| 7 | Aqua Affinity | Enchantment.aquaAffinity |
WATER 25 + ORDER 20 + EARTH 5 | 71 |
| 8 | Thorns | Enchantment.thorns |
EARTH 10 + ENTROPY 12 | 76 |
| 9 | Sharpness | Enchantment.sharpness |
ORDER 10 | 82 |
| 10 | Smite | Enchantment.smite |
ORDER 5 + AIR 5 | 87 |
| 11 | Bane of Arthropods | Enchantment.baneOfArthropods |
ORDER 5 + FIRE 5 | 92 |
| 12 | Knockback | Enchantment.knockback |
ENTROPY 5 + AIR 10 | 97 |
| 13 | Fire Aspect | Enchantment.fireAspect |
FIRE 15 + EARTH 4 | 102 |
| 14 | Looting | Enchantment.looting |
AIR 10 + FIRE 10 + WATER 10 + EARTH 10 + ORDER 15 + ENTROPY 15 | 107 |
| 15 | Efficiency | Enchantment.efficiency |
ENTROPY 12 + EARTH 4 | 114 |
| 16 | Silk Touch | Enchantment.silkTouch |
ORDER 50 + EARTH 10 + ENTROPY 10 | 119 |
| 17 | Unbreaking | Enchantment.unbreaking |
ORDER 15 + WATER 8 + EARTH 8 | 124 |
| 18 | Fortune | Enchantment.fortune |
AIR 10 + FIRE 10 + WATER 10 + EARTH 10 + ORDER 15 + ENTROPY 15 | 129 |
| 19 | Power | Enchantment.power |
EARTH 5 + ORDER 10 | 136 |
| 20 | Punch | Enchantment.punch |
AIR 4 + EARTH 10 + ENTROPY 5 | 141 |
| 21 | Flame | Enchantment.flame |
ENTROPY 5 + FIRE 20 + EARTH 5 | 146 |
| 22 | Infinity | Enchantment.infinity |
ENTROPY 40 + ORDER 40 + EARTH 10 | 151 |
| 23 | Lure | Enchantment.field_151369_A |
WATER 20 + BEAST 20 | 157 |
| 24 | Luck of the Sea | Enchantment.field_151370_z |
ENTROPY 20 + WATER 20 | 162 |
| 25 | Haste | Config.enchHaste |
AIR 10 + ENTROPY 5 + EARTH 5 | 168 |
| 26 | Repair | Config.enchRepair |
WATER 20 + FIRE 20 + EARTH 20 + AIR 20 + ORDER 20 + ENTROPY 5 | 173 |
第 23、24 项使用 MCP 混淆名
field_151369_A/field_151370_z,分别对应 Lure 与 Luck of the Sea;第 25、26 项取自 Thaumcraft 的Config.enchHaste/Config.enchRepair,而非原版Enchantment字段。
附加数据
EnchantmentData(enchantment/core/EnchantmentData.java)每级携带 4 个字段:
| 字段 | 含义 |
|---|---|
texture |
图标 ResourceLocation |
vanilla |
是否原版附魔 |
aspects |
该等级要素消耗 |
research |
解锁所需研究键;vanilla=true 的 26 项全部传空字符串 |
canEnchantmentBeUsed(player, enchant)(EnchantmentManager.java:290-295)用 research 是否为空串来决定是否检查研究完成度 —— 因此原版附魔无需研究即可使用,而本模组附魔全部受研究门控(尽管其中 8 个共用了同一个键,见 自定义附魔)。
兼容性规则
registerCompatibilityRules()(EnchantmentManager.java:319-328)遍历 Enchantment.enchantmentsList 的笛卡尔积,凡是 canApplyTogether() 不对称的组合写入 rules(Multimap<Integer, IEnchantmentRule>)。规则实现在 enchantment/core/rule/BasicCompatibilityRule.java。
registerExtraRules()(EnchantmentManager.java:330)为空方法体,被 initEnchantmentData() 末行调用但不做任何事。