挖掘等级提升 Mining Level Boost
本 mod 为 Tinkers’ 的镐(及锤)引入第二条独立的成长线:工具等级(Tool Leveling)之外,还有一条「挖掘等级」(HarvestLevel)需要靠 XP 或头颅提升。
- 模块:
ToolLeveling+PickLeveling(配置分类PickLeveling) - 实现:
leveling/LevelingLogic.levelUpMiningLevel/isBoosted/canBoostMiningLevel - 修饰符:
harvestlevels/modifiers/ModBonusMiningLevel、leveling/modifiers/ModMiningLevelBoost
前置扣减
LevelingLogic.addLevelingData 首次写入等级数据时执行 tag.setInteger("HarvestLevel", hlvl - 1)——所有工具的挖掘等级都被扣掉 1 档。因此即便是玛玉灵镐,刚造出来也只相当于阿迪特级,必须提升一次才回到设计等级。
HarvestLevelModified(TAG_IS_BOOSTED)初始为 false;canBoostMiningLevel(tags) 的判定是:
tags.hasKey("HarvestLevelModified") && !isBoosted(tags) && getHarvestLevel(tags) < HarvestLevels.max
即:已初始化、尚未提升过、且未达满级。
提升所需 XP
getRequiredXp(tool, tags, miningBoost = true) 走独立分支,基准同样 100f(弓 200 / 武器 140),最后追加:
if (harvestLevel >= _2_copper)
base *= pow(xpPerBoostLevelMultiplier, harvestLevel - _2_copper) // 默认 1.12^(等级-2)
if (harvestLevel == 0)
base /= xpPerBoostLevelMultiplier * xpPerBoostLevelMultiplier
base *= levelingPickaxeBoostXpPercentage / 100 // 默认 100
注意注释 // XP Multiplier applies to all tools, but not to "mining boost" XP.——材料 xpAmount 系数不作用于挖掘提升 XP。
提升后 tags.setBoolean("HarvestLevelModified", true) 且 tags.setInteger("HarvestLevel", 原值 + 1),HeadEXP 归零。
两条提升途径
途径一:XP 提升
Config.levelingPickaxeBoost(allowLevelingBoost,默认 true)控制镐能否通过使用获得挖掘 XP。
途径二:头颅修饰符
ModMiningLevelBoost 继承 ModBoolean,tag 为 "Mining Level Boost",effect = recipe[0].getDisplayName()。canModify 的三个门槛:
Config.mobHeadRequiresModifier为true时要求Modifiers > 0;- 不得已施加过(
tags.getBoolean(key)); tags.getInteger("HarvestLevel") < maxLvl且LevelingLogic.canBoostMiningLevel(tags)。
modify 调用 levelUpMiningLevel(tool, null, false),随后若 mobHeadRequiresModifier == false 就手动把 Modifiers 加回 1(因为父类 ModBoolean.modify 会扣掉一个修饰符)。
途径三:钻石/绿宝石修饰符改写
ModBonusMiningLevel(tag GemBoost)替换 Tinkers’ 原生的钻石/绿宝石挖掘等级提升逻辑,构造时带一个 parentTag("Diamond" 或 "Emerald")。
canModify 的判定链:
curLevel = LevelingLogic.getHarvestLevel(tags)
if (curLevel != _4_bronze && Config.diamondMinMiningLevelRequired) return false // 只允许青铜级
if (tags.getInteger("GemBoost") > 0 && !Config.diamondLevelBoostMultiple) return false // 不允许叠加
maxLevel = (parentTag == "Emerald" && !diamondMinMiningLevelRequired) ? _4_bronze : _5_diamond
if (!LevelingLogic.isBoosted(tags) && Config.pickaxeBoostRequired) maxLevel -= 1
if (curLevel >= maxLevel) return false
if (Modifiers <= 0 && !tags.getBoolean(parentTag)) return false
modify 写入 actualBoost = min(maxLevel - curLevel, Config.diamondLevelAddition)(默认 1),累加到 HarvestLevel 与 GemBoost 两个键。
关键设计:若未先完成挖掘等级提升就给钻石,「上界再减 1」,因此镐不会一步跳到黑曜石级——源码注释 // i.e., you boost it to diamond with a bunch of diamonds, then boost it with boostXP or a head, it'll have obsidian harvest level (mines ardite)。
gemBoostedLevel(input) 是供 UI 使用的显示值计算,处理旧版 Iguana 工具的兼容回退:
if (isBoosted && headLvl == _4_bronze && HarvestLevel == _5_diamond && (Emerald || Diamond)) return _5_diamond
if (!isBoosted && headLvl != 0) headLvl -= 1
if (tags.hasKey("GemBoost")) return max(headLvl, min(headLvl + GemBoost, max))
return headLvl
其中 isBoosted 的判定带一个重要例外:
boolean isBoosted = (LevelingLogic.isBoosted(tags)
|| !(input.getItem() instanceof Pickaxe || input.getItem() instanceof Hammer))
&& Config.pickaxeBoostRequired;
即非镐非锤的工具不需要先提升(注释:isBoosted returns false even if tool doesn't need boosting)。
替换部件时的惩罚
换镐头会扣掉挖掘提升进度,由 部件替换 配合配置 PickBoostXpPenality(默认 5)处理。