随机奖励修饰符 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 即永久禁用。