挖掘等级系统 Harvest Levels

本 mod 最大的平衡改动:把「挖掘等级」从原版 Tinkers’ 的 6 档扩展为 0~9 共 10 档,并在每一档之间插入新的材料门槛。这是所有其他机制(材料重平衡、镐的等级提升、钻石修饰符改写)的基础。

  • 常量定义:iguanaman.iguanatweakstconstruct.util.HarvestLevels
  • 应用逻辑:iguanaman.iguanatweakstconstruct.harvestlevels.HarvestLevelTweaks
  • 模块:HarvestLevelTweaks(脉冲 HarvestLevelTweaks)

10 档等级常量

常量 值 名称(非 vanilla 模式) vanilla 模式下的值
_0_stone 0 石头(§7) 0
_1_flint 1 铜(§6) 1
_2_copper 2 铁(§8) 1
_3_iron 3 锡(§f) 2
_4_bronze 4 红石(§c) 2
_5_diamond 5 黑曜石(§d) 2
_6_obsidian 6 阿迪特(§4) 3
_7_ardite 7 钴(§3) 4
_8_cobalt 8 玛玉灵(§5) 4
_9_manyullym 9 玛玉灵+(§5§d) 5

max 初始为 9;adjustToVanillaLevels() 会把 flint~manyullyn 全部压缩到 1~5 并把 max 改为 5。updateHarvestLevelNames() 覆写 tconstruct.library.util.HarvestLevels.harvestLevelNames。

注意 _1_flint~_4_bronze 的名称是故意错位的:常量名叫 flint 实际显示「铜」。这样原版 5 个材料等级就能落在 10 档里的 5 个「非 0」位置上,让黑曜石→阿迪特→钴→玛玉灵之间插入新门槛。

原版方块重设(modifyVanillaBlocks)

先 new ForgeHooks() 触发其静态初始化,否则 ForgeHooks.initTools() 会在之后覆盖本 mod 的改动(源码注释明确说明)。

方块 工具类 等级
iron_ore / iron_block / iron_bars / lapis_ore / lapis_block pickaxe 2 铜
gold_ore / gold_block / redstone_ore / lit_redstone_ore pickaxe 3 铁
diamond_ore / diamond_block / emerald_ore / emerald_block pickaxe 4 青铜
obsidian / enchanting_table pickaxe 5 钻石

源码注释:// yes, diamond requires diamond level. good thing there's bronze/steel ;)——原版钻石矿被提到青铜级,逼迫玩家先造青铜或钢镐。

OreDict 等级表(modifyOredictBlocks)

遍历 oreDictPrefixes = { "ore", "denseore", "oreNether", "denseoreNether", "block", "stone", "brick", "orePoor" },与 allOreDicLevels 的每一格做前缀拼接后查 OreDict。

通用表 oreDictLevels:

等级 材料后缀
0 石 (空)
1 燧石 Copper, Coal, Tetrahedrite, Aluminum, Aluminium, NaturalAluminum, AluminumBrass, Shard, Bauxite, Zinc
2 铜 Iron, Pyrite, Silver, Lapis
3 铁 Tin, Cassiterite, Gold, Lead, Redstone, Steel, Galena, Nickel, Invar, Electrum, Sphalerite, Osmium
4 青铜 Diamond, Emerald, Ruby, Sapphire, Amethyst, Cinnabar, GreenSapphire, BlackGranite, RedGranite, Manganese
5 钻石 Obsidian, Tungstate, Sodalite, Quartz, CertusQuartz, SkyStone
6 黑曜石 Ardite, Uranium, Olivine, Sheldonite, Platinum, Yellorite
7 阿迪特 Cobalt, Iridium, Cooperite, Titanium
8 钴 Manyullyn
9 玛玉灵 (空)

Metallurgy 专用表另有三组:oreDictLevelsMetallurgyFantasy、oreDictLevelsMetallurgyNether、oreDictLevelsMetallurgyEnd,由 allOreDicLevels 统一聚合。

modifyBlock(stack, harvestLevel) 对 WILDCARD_VALUE 展开为 meta 0~15 全部设置;GravelOre 实例改设 "shovel" 而不是 "pickaxe"(源码注释 // gravelore gets shovel level instead of pickaxe.)。整个 setHarvestLevel 包在 try/catch(Exception) 里——注释解释为「exception can occur if stuff does weird things metadatas」。

工具等级重设(modifyTools)

遍历 Item.itemRegistry 所有物品,对每个 toolClass 调用 getUpdatedHarvestLevel(原等级):

原等级 映射到
1(石) 0(木级)——注释 // stone tool: nerfed to wood level
2(铁) 3(HarvestLevels._3_iron)
其余 见源码 getUpdatedHarvestLevel 的 switch

old <= 0 的(木/金)跳过不变。改动日志受 logMiningLevelChanges 控制。

混合等级方块的补充判定

override/ExtraHarvestLevelHandler 处理「同一方块部分 meta 需要工具、部分不需要」的漏洞:原版只按 block.getMaterial().isToolNotRequired() 一刀切。监听 PlayerEvent.BreakSpeed,若方块 harvestLevel > 0 但材质标为「不需要工具」,则手动用玩家手中物品的 getHarvestLevel(itemStack, tool) 校验;不满足就 event.setCanceled(true) 禁止破坏。

可覆盖

全部数值可由 覆盖模块 的 BlockOverride.cfg(分类 generaloredict / oredict / blocks_<toolclass>)与 MaterialOverride.cfg 改写。