垃圾组合并机制(TrashGroup Merge)
基本信息
| 属性 | 值 |
|---|---|
| 垃圾组 ID | 0(约定俗成,代码里 createLootGroup 不给 TrashGroup 赋值,int 默认即 0) |
| 控制开关 | <LootGroup> 的 CombineTrashGroup(boolean)与 TrashGroup(int) |
| 合并位置 | LootGroupsHandler.getMergedGroupFromID |
机制
战利品袋每次开启都会把本组的 <Loot> 列表和垃圾组的 <Loot> 列表拼在一起再抽。目的是压低高级档位里每一件具体物品的相对概率——抽到垃圾时玩家感觉"不值",从而让好东西显得更稀有。
运行时流程(getMergedGroupFromID(groupID, fortuneLevel)):
- 若
!CombineTrashGroup→ 直接返回本组,不做任何事 - 若
AllowFortuneBags && 时运等级 == 3→ 也直接返回本组(完全不带垃圾) - 否则复制一份本组
LootGroup,把垃圾组每条<Loot>复制追加到末尾,每条用copyDrop(drop, fortuneLevel)按当前时运等级重算权重 updateMaxWeight()重算总权重- 结果按
"组ID-时运等级"缓存进_mBufferedLootGroups,同组同时运等级下只合并一次(并shuffleLoot()打乱顺序,避免玩家靠位置记忆定位掉落) - 配置 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 上。
相关条目
- 战利品组等级体系 -
CombineTrashGroup/TrashGroup字段定义 - 掉落条目规则 - Chance 权重算法
- 时运附魔效果 - 垃圾权重的逐级削减与 F3 特例
- AllowFortuneBags 配置项 - 关闭时运后 F3 袋不再特殊
- 战利品袋预览界面 - 预览只含本组战利品