挖掘等级系统 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 改写。