Backpack 配置

[!INFO] 实现类:de.eydamos.backpack.misc.ConfigurationBackpack(静态字段 + 静态 init(File)) 加载时机:Backpack.preInit 调用 ConfigurationBackpack.init(event.getSuggestedConfigurationFile())

全部配置项

配置文件由 Forge Configuration 生成,全部位于 CATEGORY_GENERAL(general)分类下。 每项读入后都做了范围钳制,越界即回落默认值。

键 类型 get() 默认 钳制范围 实际默认 说明
enderRecipe int 0 0…1 0 末位背包配方:0=末影箱,1=末影之眼
backpackSlotsS int 27 1…128 27 小包(tier 0)槽位数
backpackSlotsM int 36 1…128 36 中包(tier 1)槽位数
backpackSlotsL int 54 1…128 54 大包(tier 2)槽位数
maxBackpackAmount int 0 0…36 0 背包栏内可携带的背包数,0 = 无限
renderBackpackModel boolean true — true 渲染 3D 背包模型
openOnlyWornBackpacks boolean false — false 只允许打开穿戴槽里的背包
airshipModCompatibility boolean false — false 无色包配方中心改为箱子
disableBackpacks boolean false — false 禁止小背包配方
disableBigBackpacks boolean false — false 禁止大/中背包配方与升级配方
disableEnderBackpack boolean false — false 禁止末位背包配方
disableWorkbenchBackpack boolean false — false 禁止工作台背包配方
bigByUpgradeOnly boolean false — false 大包只能靠升级获得
disallowItems String[] {} — 空 禁入背包的物品,如 minecraft:dirt
forbiddenDimensions String[] {} — 空 禁用背包的维度 id,如 0
playSound boolean true — true 打开背包时播放音效
allowSoulbound boolean true false true 灵魂绑定背包死亡不掉落

⚠️ 缺陷 1:allowSoulbound 的双重默认值不一致

ALLOW_SOULBOUND = config.get(
        Configuration.CATEGORY_GENERAL, "allowSoulbound", true, getAllowSoulboundComment())
        .getBoolean(false);   // <-- get() 默认 true,getBoolean() 兜底 false

get(key, id, default, comment) 的第三个参数是默认值(true), 而 getBoolean(defaultValue) 的参数是读取失败时的兜底值(false)。

  • 首次生成配置文件时写入的是 true;
  • 若配置项缺失或解析失败,getBoolean(false) 返回 false。

两者在同一行里表达相反的意图。新建配置文件(正常路径)得到 true, 但手工删掉该行会得到 false —— 同一份代码两种默认值。

对比 playSound(get(..., true, ...).getBoolean(true))两者一致,可见 allowSoulbound 的 false 是笔误。

⚠️ 缺陷 2:槽位配置与 tooltip 硬编码值不一致

三个 backpackSlots* 配置确实被消费(BackpackSave.getSize:99-103), 但物品提示行里的槽位数是硬编码的 (ItemBackpackBase.addInformation:int slots = 36 + tier * 27; → 36/63/90)。

tier 配置默认 tooltip 显示 是否一致
0 27 36 ❌
1 36 63 ❌
2 54 90 ❌

默认配置下 tooltip 全部显示错误(多算 9 / 27 / 36 格)。 只有在服务器显式设为 36/63/90 时才吻合。 详见 背包。

槽位配置在 workbench 包上不生效

getSize 的工作台分支是硬编码的 return 9 / return 18, 完全不读 backpackSlots*。即 backpackSlotsS 改成 128 也不会让 工作台背包有 128 格。

disallowItems 与 forbiddenDimensions

两项都使用 getStringList() 读取,默认值数组是共享的空数组:

public static String[] DEFAULT_IDS = {};

⚠️ 该数组被两个配置项共用同一个引用(disallowItems 与 forbiddenDimensions 都以 DEFAULT_IDS 作默认值)。虽然 getStringList() 返回新列表、实际不会互相污染,但语义上这两个 含义完全不同的配置共享了一个具名常量,可读性较差。

加载与保存

public static void init(File configFile) {
    if (config == null) {
        config = new Configuration(configFile);
        loadConfiguration();
    }
}

init 用 config == null 做守卫,因此重复调用不会重载配置。 loadConfiguration() 结尾 if (config.hasChanged()) config.save();, 所有配置项都带注释块(############## 包裹),Forge 会原样写回配置文件。

未在配置中的两个静态字段

ConfigurationBackpack 另有两个不来自配置文件的字段:

字段 初值 含义
NEISupport false 运行时探测:NEI 反射注册成功后置 true
PLAY_OPEN_SOUND false 字段初值 false,但 loadConfiguration 中被 playSound 覆写为 true

即 PLAY_OPEN_SOUND 的声明初值 false 是误导性的, 实际生效值来自配置项 playSound(默认 true)。 直接读字段声明会得出「默认不播放音效」的错误结论。

相关条目