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)。
直接读字段声明会得出「默认不播放音效」的错误结论。