战利品组等级体系(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,然后回落到样例配置继续运行,服务器可正常开服。

相关条目