垃圾组合并机制(TrashGroup Merge)

基本信息

属性 值
垃圾组 ID 0(约定俗成,代码里 createLootGroup 不给 TrashGroup 赋值,int 默认即 0)
控制开关 <LootGroup> 的 CombineTrashGroup(boolean)与 TrashGroup(int)
合并位置 LootGroupsHandler.getMergedGroupFromID

机制

战利品袋每次开启都会把本组的 <Loot> 列表和垃圾组的 <Loot> 列表拼在一起再抽。目的是压低高级档位里每一件具体物品的相对概率——抽到垃圾时玩家感觉"不值",从而让好东西显得更稀有。

运行时流程(getMergedGroupFromID(groupID, fortuneLevel)):

  1. 若 !CombineTrashGroup → 直接返回本组,不做任何事
  2. 若 AllowFortuneBags && 时运等级 == 3 → 也直接返回本组(完全不带垃圾)
  3. 否则复制一份本组 LootGroup,把垃圾组每条 <Loot> 复制追加到末尾,每条用 copyDrop(drop, fortuneLevel) 按当前时运等级重算权重
  4. updateMaxWeight() 重算总权重
  5. 结果按 "组ID-时运等级" 缓存进 _mBufferedLootGroups,同组同时运等级下只合并一次(并 shuffleLoot() 打乱顺序,避免玩家靠位置记忆定位掉落)
  6. 配置 reload 时缓存被整体清空(_mBufferedLootGroups.clear())

⚠️ getTrashWeight 里对组 0 做了特判:lootGroup.getGroupID() == 0 时返回 0,即垃圾组自己不会并入自己(这与样例配置里组 0 的 CombineTrashGroup="false" 是一致的)。

两档同稀有度的对比

README 官方给的对照,直接体现这个开关的意义:

属性 组 14 组 15
GroupName Legendary Legendary - Unique
Rarity 3(epic,粉紫名) 3(epic,粉紫名)
MinItems / MaxItems 1 / 1 1 / 1
CombineTrashGroup true false
实际抽取池 组 14 战利品 + 组 0 全部垃圾 仅组 15 自己的战利品
物品名颜色 一样 一样
物品名文本 一样 一样
预览界面内容 只显示本组战利品(不含垃圾) 只显示本组战利品
适用场景 常规奖励,玩家接受混入垃圾 唯一奖励/硬通货,绝不能出垃圾

结论:CombineTrashGroup 是本 mod 唯一的"内容档位开关",也是"Unique(唯一)袋"这一概念的来源。README 把它列为 v1.1.25 起的正式特性:“This is meant for ‘- unique’ bags; As they really should only contain unique loot, and given to players in special cases”。

预览界面看不到垃圾

createFakeInventoryFromID 只遍历本组 lg.getDrops(),不包含运行时合并进来的垃圾条目。所以创造模式潜行右键打开的预览界面里,看到的只有该档自己的战利品列表,垃圾是看不见的。这也是为什么 Nei 集成要在 drawExtras 里额外画一行 “Also has loot from: <垃圾组名>” 来提示玩家。

权重分母的正确算法

含垃圾的档位,物品实际概率:

该物品概率 = 自身 Chance / (本组全部 Chance 之和 + 垃圾组经时运削减后的 Chance 之和)

LootGroupsHandler.calcPercentageFromWeight 正是这个式子,且会同时算出时运 0/1/2/3 四个数值,格式化为 Drop % (F0/1/2/3): x | y | z | w 显示在预览界面的物品 tooltip 上。

相关条目