战利品组等级体系(LootGroup)
基本信息
| 属性 | 值 |
|---|---|
| 配置载体 | JAXB 序列化的 LootBags.xml(core/serializer/LootGroups.java) |
| 配置文件路径 | <config>/EnhancedLootBags/LootBags.xml |
| 内存类 | LootGroups(含 List<LootGroup>) |
| 组 ID 范围 | 0 ~ 32767 |
| 代码内建组数 | 0 个(见下) |
⚠️ 关键前提:本 mod 不在代码里定义任何"等级"
这是本条目最重要的事实,必须先说清楚,否则整个 wiki 会被误读:
- 源码里没有
ModBlocks/ModItems,也没有任何BasicLootBag/AdvancedLootBag之类的类。 - 战利品袋只有一个物品 ID:
enhancedlootbags:lootbag。所谓"等级"= 该物品的 metadata(伤害值) = 配置里的GroupMetaID。 - 本 fork 不附带任何
LootBags.xml(src/main/resources/下只有 lang、贴图、sounds.json、mcmod.info)。战利品表由整合包 / 服务端提供。 - 因此本条目无法给出"整合包里实际有哪几档袋子、各档多少格"的答案——那些数据不在本仓库里。真实档位数量 = 服务端
LootBags.xml中<LootGroup>元素的个数。
首次运行的样例配置(唯一可从源码确定的档位)
LootGroupsHandler.InitSampleConfig() 会在配置文件不存在时自动生成一份样例。它是源码中唯一能确定的两档战利品袋:
| 维度 | GroupID 0 | GroupID 1 |
|---|---|---|
GroupName |
Generic trash group |
Sample Item group |
Rarity |
0 = common(普通,白色) |
0 = common(普通,白色) |
MinItems |
1 | 1 |
MaxItems |
1 | 1 |
CombineTrashGroup |
false | true |
| 战利品 | minecraft:coal:1(煤炭)<br>Amount=5、RandomAmount=true、Chance=100、LimitedDropCount=0 |
minecraft:diamond(钻石)Amount=1、Chance=100、LimitedDropCount=5、带 NBT {display:{Lore:["Oh, shiny"]}}<br>minecraft:cake(蛋糕)Amount=1、Chance=100、LimitedDropCount=0 |
| 实际行为 | 只掉煤炭,每次 1~5 个 | 每次恰好 1 叠;摇到 2/3 概率是垃圾煤炭,1/3 概率是钻石或蛋糕 |
| 在 NEI 中 | 被隐藏(meta 0 特殊处理) | 正常显示 |
README 明确记载:“GroupID 0 is now the generic lootgroup. The lootbag with metaID 0 is hidden from NEI, but still available via creative menu. Every Item in this lootgroup will drop in all defined bags.”
这张表就是"战利品袋等级"的全部硬编码内容。 其它任何档位都来自整合包配置,本 mod 不预置。
LootGroup 属性完整对照表
LootGroups.LootGroup 上所有 JAXB 属性(即整合包可写的全部字段):
| XML 属性 | 类型 | 含义 | 默认/校验 | 影响什么 |
|---|---|---|---|---|
GroupMetaID |
int | 组唯一 ID | 必须唯一(VerifyConfig 查重);范围 0~32767 |
袋子物品的 metadata;进度记录键的一部分 |
GroupName |
string | 组显示名 | 必须唯一(VerifyConfig 查重) |
物品名内层文本;走 translateToLocal 本地化 |
Rarity |
int | EnumRarity 序号 |
合法 0~3,越界自动降级为 common(getGroupRarity) |
物品名颜色:0 白 / 1 黄 / 2 灰 / 3 粉紫 |
MinItems |
int | 单次开启最少叠数 | README 建议 1~16 | 抽取循环次数下界 |
MaxItems |
int | 单次开启最多叠数 | README 建议 1~16 | 抽取循环次数上界 |
CombineTrashGroup |
bool | 是否并入垃圾组 | createLootGroup 默认 true |
见垃圾组合并机制 |
TrashGroup |
int | 垃圾组 ID | createLootGroup 不赋值 → 保持 int 默认 0 |
合并时从哪一组取垃圾 |
LootbagIcon |
string | 该档专用图标路径 | 可选,包成 Optional<String>,为空则用 lootbag_generic |
物品贴图 |
<Loot> 子元素 |
— | 该档的战利品条目 | 数量不限 | 抽取池 |
Rarity 四档完整枚举(代码里唯一真正的"等级"枚举)
getGroupRarity() 直接用 EnumRarity.values()[Rarity] 索引,越界回落 common:
| Rarity 值 | 枚举 | 物品名颜色 | 典型用途(README 举例) |
|---|---|---|---|
| 0 | common |
白色 | 基础档、通用档 |
| 1 | uncommon |
黄色 | 中档 |
| 2 | rare |
灰色 | 稀有档 |
| 3 | epic |
粉紫色 | 传奇档,如 Legendary |
README 给的对照写法:
<LootGroup GroupMetaID="14" GroupName="Legendary" Rarity="3" MinItems="1" MaxItems="1" CombineTrashGroup="true"/>
<LootGroup GroupMetaID="15" GroupName="Legendary - Unique" Rarity="3" MinItems="1" MaxItems="1" CombineTrashGroup="false"/>
14 档 = 传奇(会掉垃圾),15 档 = 传奇·唯一(不掉垃圾)。这是"同样是 epic 稀有度,档位可以天差地别"的典型例子——
Rarity只管颜色,CombineTrashGroup才管内容。
⚠️ MinItems 的实际行为与文档不符
ItemLootBag.onItemRightClick 的真实逻辑:
int q = tGrp.getMinItems();
if (tGrp.getMaxItems() > tGrp.getMinItems()) q = pWorld.rand.nextInt(tGrp.getMaxItems()) + 1;
即:
MinItems == MaxItems→ 固定产出MinItems叠MinItems < MaxItems→MinItems被完全忽略,实际在1 ~ MaxItems之间随机
所以 MinItems="3" MaxItems="8" 并不是"至少 3 叠",而是"1~8 叠"。写 wiki 或写配置时不能按字面理解 MinItems。
槽位数:本 mod 没有"每档槽位"这个概念
这一点必须澄清,因为它是最容易被想当然编错的地方:
| 数值 | 值 | 来源 | 是否随档位变化 |
|---|---|---|---|
| 预览界面格子数 | 108(硬编码) | ContainerLootBag.FakeLootBagInventory.mSlotCount = 108 |
否,所有档位都是 108 |
| 预览界面布局 | 9 行 × 12 列 | GUI_ROWS = 9、GUI_COLUMNS = 12 |
否 |
| GUI 尺寸 | 238 × 256 | GuiLootBag.GUI_SizeX/GUI_SizeY |
否 |
| 掉落列表超出 108 条 | 截断并打警告日志 | createFakeInventoryFromID 的 else 分支 |
— |
| 单格堆叠上限 | 64 | getInventoryStackLimit() |
否 |
108 格是"预览界面"的格子数,不是袋子的存储容量。 战利品袋根本不能存东西——它是右键即消耗的消耗品,不存在"把物品放进袋子"这一步。108 格纯粹是创造模式下用来平铺展示该档全部可能掉落的画布,且这段代码里没有任何配置项能改它(mSlotCount 是 private final 字面量)。
组的校验与容错
LootGroupsHandler.VerifyConfig 在每次加载时校验(仅对本地配置文件生效,跳过服务器下发的数据):
| 检查项 | 失败后果 |
|---|---|
GroupMetaID 重复 |
记录 error,整个配置拒绝加载 |
GroupName 重复 |
记录 error,整个配置拒绝加载 |
组内无任何 <Loot> |
记录 error,自动塞入一个 minecraft:cookie 占位(cookiedropbecauseempty) |
ItemName 解析不到物品 |
记录 error,整个配置拒绝加载 |
NBTTag 不是合法 NBT |
记录 error,整个配置拒绝加载 |
配置文件损坏时(LoadConfig → ReloadLootGroups 失败):日志 warning + 往管理员上线错误提示里加一条 [LootBags] Config file not loaded due errors,然后回落到样例配置继续运行,服务器可正常开服。
相关条目
- 战利品袋(LootBag) - 唯一的物品,metadata 即组 ID
- 掉落条目规则 - 组内每条
<Loot>的字段语义与 LimitedDropCount - 垃圾组合并机制 -
CombineTrashGroup/TrashGroup改写抽取池 - 战利品袋预览界面 - 108 格只读展示界面
- 时运附魔效果 -
FortuneLevel枚举与权重削减 - AllowFortuneBags 配置项 - 关闭时运系统的唯一开关
- /lootbags 指令 - 运行时新增组与战利品