升级黑名单(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 仍继续加载。
相关条目
- Iron Chest 方块 - 升级流程的宿主方块
- ItemIronChest - 箱子物品形态
- 全部 17 个升级器物品条目
- 箱子类型开关 · 透明箱子渲染 · 猫与箱子行为 - 其余配置项