随机奖励修饰符 Random Bonuses
工具每次升级有几率白得一个 Tinkers’ Construct 修饰符。本条目是本 mod 最主要的玩法内容,共 18 种奖励 × 4 类工具的权重矩阵。
- 实现:
iguanaman.iguanatweakstconstruct.leveling.RandomBonuses - 总开关:
toolLevelingRandomBonuses(配置键RandomBonuses,默认true) - 触发等级:
randomBonusesAtlevels(配置键BonusesAtLevels,默认{2, 3, 4, 5, 6}) - 静态入口:
RandomBonuses.tryModifying(player, tool),每次调用先Modifiers +1
权重算法
1. 查出该工具类别对应的权重表(tool / weapon / bow / ammo)
2. 已在配置中被禁用的修饰符权重置 0(Config.deactivatedModifiers)
3. 若 randomBonusesAreUseful,则把不在「有用集合」里的修饰符剔除
4. 把各工具 NBT 中的 Extra<Modifier> 累计值 / 所需经验 * usageBonusWeight
加到对应权重上(默认 usageBonusWeight = 70)
5. 权重求和得 total,掷 [0, total) 的随机数,落在谁的区间就选谁
6. 全部不可用则丢弃,回到第 1 步重选
Extra<Modifier> 权重来自使用历史(见 经验与权重来源),中奖后立即 resetModifierExtraWeight 清零。
Config.completelyRandomBonuses(CompletelyRandomBonuses,默认 false)为 true 时所有权重视为相等且禁用「有用」过滤。
完整权重矩阵
行为 18 种奖励,列为 4 类工具。「—」表示不在有用集合内(usefulBonuses=true 时永不会抽到)。
| 枚举 | 修饰符键 | 工具 | 武器 | 弓 | 弹药 | 道具 |
|---|---|---|---|---|---|---|
REDSTONE |
Redstone |
45 | 0 | 100 | 0 | — |
LAPIS |
LuckLooting |
40 | 75 | 60 | 75 | — |
AUTOSMELT |
Autosmelt |
3 | — | — | — | — |
SILKTOUCH |
SilkTouch |
2 | — | — | — | — |
DIAMOND |
Diamond |
30 | — | — | — | — |
EMERALD |
Emerald |
35 | — | — | — | — |
REPAIR |
Repair |
50 | 55 | 55 | 65 | — |
REINFORCED |
Reinforced |
77 | — | 65 | — | — |
ATTACK |
Attack |
— | 110 | — | 100 | — |
BLAZE |
Fiery |
— | 45 | — | 45 | — |
SMITE |
Smite |
— | 40 | — | — | — |
BANE |
BaneOfArthropods |
— | 40 | — | — | — |
BEHEADING |
Beheading |
— | 50 | — | — | — |
LIFESTEAL |
LifeSteal |
— | 30 | — | — | — |
KNOCKBACK |
Knockback |
— | 50 | 50 | 50 | — |
STONEBOUND |
Stonebound |
5 | — | — | — | — |
JAGGED |
Jagged |
— | 5 | — | — | — |
CRITICAL |
Critical |
— | 2 | 0 | 0 | — |
| 权重合计 | 321 | 619 | 469 | 556 |
枚举常量名与实际修饰符键不一致是刻意的:源码注释
!!! DO NOT CHANGE THESE !!! They're used for NBTTags and Configs. Changing them would break compatibility。例如LAPIS在游戏内叫「幸运」(LuckLooting)、BLAZE叫「火焰(Fiery)、BANE叫「蜘蛛杀手」(BaneOfArthropods)。
各奖励的实际给予物
addGenericModifier 统一处理:取 modifier.stacks 作为材料(部分被覆写),modifier.addMatchingEffect(tool) 先加效果,再循环 modifier.modify() 施加。
| 奖励 | 消耗物 | 次数 | 聊天消息键 | 颜色 |
|---|---|---|---|---|
Redstone |
红石粉 ×1 | 50 | message.levelup.redstone |
§4 |
LuckLooting |
蓝色染料(meta 4) ×1 | 100 | message.levelup.lapis |
§9 |
Autosmelt |
(熔岩修饰符自带配方) | 1 | message.levelup.autosmelt |
§4 |
SilkTouch |
(丝触修饰符自带配方) | 1 | message.levelup.silktouch |
§e |
Diamond |
(钻石修饰符自带配方) | 1 | message.levelup.diamond |
§b |
Emerald |
(绿宝石修饰符自带配方) | 1 | message.levelup.emerald |
§2 |
Repair |
(修复修饰符自带配方) | 1 | message.levelup.repair |
§e |
Reinforced |
(强化修饰符自带配方) | 1 | message.levelup.reinforced |
§b |
Attack |
(攻击修饰符自带配方) | 1 | message.levelup.attack |
§c |
Fiery |
烈焰之火 ×1 | 1 | message.levelup.blaze |
§6 |
Smite |
僵尸之心 ×1 | 1 | message.levelup.smite |
§c |
BaneOfArthropods |
蜘蛛眼 ×1 | 1 | message.levelup.bane |
§2 |
Beheading |
恶魂之泪 ×1 | 1 | message.levelup.beheading |
§b |
LifeSteal |
吸血鬼的血液 ×1 | 1 | message.levelup.lifesteal |
§4 |
Knockback |
活塞 ×1 | 1 | message.levelup.knockback |
§7 |
Jagged / Stonebound |
见 Shoddy 修饰符 | 1 | message.levelup.jagged / .stonebound |
§c / §b |
Critical |
见 暴击修饰符 | 1 | message.levelup.critical |
§d |
Redstone 奖励带一条特判:若工具带 windup trait,实际施加的是 Windup 修饰符(ModWindup,key = "Windup"),聊天消息仍是 message.levelup.redstone。modCache 初始化时专门为此扫描 ModifyBuilder.instance.itemModifiers。
Flux 奖励有 addFluxModifier 实现但不在枚举中,注释写着 debateable if i'll ever use this——当前版本无法被抽中。
经验与权重来源
LevelingEventHandler 在造成伤害时按目标类型累积 Extra<Modifier>:
| 触发条件 | 累积的修饰符 | 累积量 |
|---|---|---|
| 挖方块掉落物 | LAPIS |
xp + 5 |
| 挖普通方块 | REDSTONE |
+1 /次 |
| 造成伤害(非爬行者) | ATTACK |
xp |
| 击中蜘蛛(附魔) | BANE |
max(1, xp / 2) |
| 击中烈焰人 | BLAZE |
max(1, xp / 2) |
| 击中僵尸 | SMITE |
max(1, xp / 2) |
| 击中凋灵骷髅/猪灵 | LIFESTEAL |
max(1, xp / 2) + 2 |
| 击中末影人 | BEHEADING |
max(1, xp / 2) + 3 |
| 击退 | KNOCKBACK |
xp + 2 |
源码头部注释里还留有更多设计意图但未实现的条目(Autosmelt 靠挖岩浆中的方块、注释里带 :D)。
覆盖机制
全部 18×4 权重与「有用」标记都可被 覆盖模块的 BonusModifierOverride.cfg 改写,分类为 ToolWeights / WeaponWeights / BowWeights / AmmoWeights / UsefulToolBonuses / UsefulWeaponBonuses / UsefulBowBonuses / UsefulAmmoBonuses / UsageBonus:bonusWeight。
此外每个修饰符在主配置 RandomBonuses 分类下有独立开关 allow<修饰符键>(默认全 true),置 false 即永久禁用。