升级黑名单(blocklistUpgrades)

基本信息

属性 值
键名 blocklistUpgrades
配置段 config/ironchest.cfg 的 general 段
类型 String 列表(cfg.getStringList(...))
默认值 new String[] {}(空列表)
字段 IronChest.blocklistUpgrades(public static String[])
源码描述 “Disallowed upgrades. All upgrades listed here will not be registred and no recipes will be generated for it.\nExample: IRON:GOLD”

语法

每项格式为 SOURCE:TARGET,两个都是 IronChestType / ChestChangerType 里的枚举常量名(全大写):

blocklistUpgrades=<SOURCE>:<TARGET>

判定实现(IronChestType.java:134):

public boolean allowUpgradeFrom(IronChestType typ) {
    var name = typ.name() + ":" + this.name();
    for (String blocked : IronChest.blocklistUpgrades) {
        if (blocked.equals(name)) return false;
    }
    return true;
}

[!IMPORTANT] 拼接顺序是 typ.name() + ":" + this.name(),即「来源:目标」。所以禁止"铁→金"要写 IRON:GOLD,不是 GOLD:IRON。比较用 String.equals,大小写敏感、全大写。

作用面:同时干掉升级器与配方

allowUpgradeFrom 被 4 处调用,覆盖两条独立路径:

调用点 作用
ChestChangerType.isAllowed() → buildItems() 升级器物品不注册(GameRegistry.registerItem 不执行)
ChestChangerType.isAllowed() → generateRecipes() 升级器的合成配方不生成
IronChestType.getRegistredChestsByTier() 内的 parentMaterial.allowUpgradeFrom(typ) 箱子自身配方的 P(前一级箱子)候选项被剔除
ChestChangerType.addRecipes() 未直接调用,但由 generateRecipes() 的 isAllowed() 门控 升级器配方

第 3 条是本配置项最容易被忽略的效果:把 IRON:GOLD 加进黑名单后,Gold Chest 的 recipeUpgradeOneTier(8 金锭围 tier 3 箱子)在遍历 tier 3 候选时会把来源判为非法。

完整示例

若配置:

S=IRON:GOLD

则:

结果 说明
Iron to Gold Chest Upgrade 不存在 升级器物品未注册
该升级器无合成配方 generateRecipes() 里 isAllowed() 为 false
Gold Chest 的 recipeUpgradeOneTier 失去来源 getRegistredChestsByTier(GOLD, 3, 0) 仍返回 tier 3 箱子——见下方注意

[!WARNING] 第 3 条的判定方向容易读反:getRegistredChestsByTier(parentMaterial, tier, resistance) 内部对每个候选源箱子 typ 调 parentMaterial.allowUpgradeFrom(typ),即用目标箱子的 allowUpgradeFrom(候选源)。所以想禁止"钢→金"的配方路径要写 STEEL:GOLD(GOLD.allowUpgradeFrom(STEEL) 才会命中),这与禁止升级器物品是同一项配置——ChestChangerType.STEELGOLD.isAllowed() 内部正是 target.allowUpgradeFrom(source)。

不受本配置影响的东西

事项 说明
箱子方块本身 blocklistUpgrades 不阻止任何箱子存在,只阻止"升级"路径
箱子的 recipeDirect 走 getRegistredChestsByTier(typ, typ.tier, ...),候选是同 tier 箱子,判定同样会经过 allowUpgradeFrom;把 DIAMOND:OBSIDIAN 加进去可剔除黑曜石作为钻石箱子直做配方的中心
已放置箱子的实际内容 不影响已存档世界的箱子实体与物品
missingMapping 旧名重映射 由 箱子类型开关 的 isEnabled() 决定,与黑名单无关

全部 17 条可屏蔽项

ChestChangerType 的 17 个常量(写入 SOURCE:TARGET):

常量 写法 含义
WOODIRON WOOD:IRON 原版木箱 → 铁箱
WOODCOPPER WOOD:COPPER 原版木箱 → 铜箱
COPPERIRON COPPER:IRON 铜箱 → 铁箱
IRONGOLD IRON:GOLD 铁箱 → 金箱
IRONSTEEL IRON:STEEL 铁箱 → 钢箱
IRONSILVER IRON:SILVER 铁箱 → 银箱
COPPERSTEEL COPPER:STEEL 铜箱 → 钢箱
COPPERSILVER COPPER:SILVER 铜箱 → 银箱
STEELGOLD STEEL:GOLD 钢箱 → 金箱
SILVERGOLD SILVER:GOLD 银箱 → 金箱
GOLDDIAMOND GOLD:DIAMOND 金箱 → 钻石箱
DIAMONDCRYSTAL DIAMOND:CRYSTAL 钻石箱 → 水晶箱
DIAMONDOBSIDIAN DIAMOND:OBSIDIAN 钻石箱 → 黑曜石箱
DIAMONDDARKSTEEL DIAMOND:DARKSTEEL 钻石箱 → 玄钢箱
CRYSTALDARKSTEEL CRYSTAL:DARKSTEEL 水晶箱 → 玄钢箱
OBSIDIANNETHERITE OBSIDIAN:NETHERITE 黑曜石箱 → 下界合金箱
OBSIDIANDARKSTEEL OBSIDIAN:DARKSTEEL 黑曜石箱 → 玄钢箱

SOURCE 也可以是 WOOD(哨兵枚举,用于屏蔽"原版木箱→某箱"的升级器)。

数值

数值 默认值
列表长度 0
可屏蔽的升级器数 17
读取时机 IronChest.preInit(ChestChangerType.buildItems(cfg) 紧随其后调用)
保存时机 if (cfg.hasChanged()) cfg.save()(finally 块)

[!NOTE] blocklistUpgrades 的读取在 preInit 的 try 块内,而 ChestChangerType.buildItems(cfg) 在同一 try 块的最后一行。若前面的任何 cfg.get(...) 抛出异常,buildItems 会被跳过,17 个升级器一个都不会注册。异常会被 FMLLog.log(Level.ERROR, ...) 记录为 “IronChest has a problem loading its configuration”,但 mod 仍继续加载。

相关条目