loading_mode 三种加载模式

XML 文件的 loading_mode 属性决定该文件如何改写战利品表。取值来自枚举 dmillerw.tml.data.LootLoadingMode(LootLoadingMode.java:6-11),只有三个值:

枚举值 语义 源码
OVERRIDE 用该文件的整张表替换目标分类的原版表 ChestLootLoader.java:138-144
ADD 把文件内每一条物品追加到目标分类 ChestLootLoader.java:145-148
REMOVE 按 ItemStack 从目标分类中删除匹配项 ChestLootLoader.java:149-152

解析与默认值

XMLDataBridge.parseToChestLootCat 用 LootLoadingMode.valueOf() 解析字符串, 解析失败(含未提供该属性导致 mLoading_mode == null 的情况)时回退到 OVERRIDE 并打一条 warning(XMLDataBridge.java:47-56)。

关键行为差异

  • OVERRIDE 只认第一份。loadFiles 遍历目录里的 XML(顺序取决于 File.listFiles), 同一个 category 再次以 OVERRIDE 出现时,只打 logOverrideError 警告并丢弃, 后面的文件不生效(ChestLootLoader.java:139-144)
  • ADD / REMOVE 可叠加多份。它们分别收集到 toAdd / toRemove 两个 SetMultimap,在所有文件解析完后统一应用(ChestLootLoader.java:167-175)
  • OVERRIDE 的表是直接 putAll 进原始 map(ChestLootLoader.java:160-162), 绕过 ChestGenHooks.addItem,因此覆盖后原版物品彻底消失
  • ADD 走 ChestGenHooks.getInfo(key).addItem(...),REMOVE 走 .removeItem(...), 两者作用在被覆盖之后的表上(ChestLootLoader.java:167-175)

数量缺省值

每条 loot 先过 ChestLootItem.checkCountValues()(ChestLootLoader.java:134-136): count_min 与 count_max 都为 -1 → 两者设为 1;只有一个为 -1 → 用另一个的值补齐 (ChestLootItem.java:32-43)。

⚠️ ChestLootCategory 也有同名同逻辑的 checkCountValues()(ChestLootCategory.java:46-57), 但 loadFiles 从未调用它——分类级的 count_min / count_max 直接取 XML 原值, 不做 -1 归一化。