掉落条目规则(Drop Entry)
基本信息
| 属性 | 值 |
|---|---|
| 配置载体 | LootBags.xml 中 <LootGroup> 的 <Loot> 子元素 |
| 内存类 | LootGroups.LootGroup.Drop(core/serializer/LootGroups.java) |
| 条目数上限 | 无限制(README:“There is no limit in how many items you can add to a group”) |
Drop 字段完整对照表
| XML 属性 | 类型 | 含义 | 取值约束 | 实际效果 |
|---|---|---|---|---|
Identifier |
string | 掉落唯一标识 | 必须唯一 | 每玩家限额的计数键;运行时用 UUID.randomUUID() 生成 |
ItemName |
string | 物品 MC 记法 | modid:itemname:meta,meta 为 :0 时可省略 |
解析失败 → 整份配置拒绝加载 |
Amount |
int | 产出数量 | 指令校验 1~64 | 固定产出量 |
RandomAmount |
bool | 数量是否随机 | true / false | true 时实际数量 = nextInt(Amount)+1,即 1~Amount |
Chance |
int | 权重 | 指令校验 1~255 | 不是百分比,是相对权重;见下方权重算法 |
LimitedDropCount |
int | 每玩家终身上限 | 指令校验 0~255,0 = 不限 | 见下方限额机制 |
ItemGroup |
string | 捆绑组名 | 空字符串 = 单独掉落 | 同名条目一起掉,见下方捆绑机制 |
NBTTag |
string | NBT(JSON 记法) | 空 = 无 NBT;非法则整份配置拒绝加载 | 直接 JsonToNBT 应用到产出物品上 |
权重(Chance)不是概率
抽取算法在 ItemLootBag.getRandomLootItems:
tRnd = EnhancedLootBags.Rnd.nextDouble() * pGrp.getMaxWeight();
for (Drop tDr : pGrp.getDrops()) {
tRnd -= tDr.getChance();
if (tRnd <= 0.0D) { tSelectedDrop = tDr; break; }
}
MaxWeight = 组内所有 <Loot> 的 Chance 之和。因此单条掉落的中奖率 = 自身 Chance / 全组 Chance 总和 × 100%。
⚠️ 重要:MaxWeight 的计算只遍历本组的 <Loot> 列表。如果该组设置了 CombineTrashGroup="true",垃圾组是在运行时被复制追加到列表末尾后才重算 updateMaxWeight() 的,所以"含垃圾的实际概率"必须把垃圾组的权重也算进分母。README 也提醒:“In order to calculate the rarity of your specific item, you have to add both the generic group 0 and your own groups weight-chances.”
源码给出的百分比计算在 LootGroupsHandler.calcPercentageFromWeight,直接除以 (本组 MaxWeight + 垃圾组经时运削减后的权重),保留两位小数,并同时算出时运 0/1/2/3 四个版本写进预览界面的 NBT。
LimitedDropCount:每玩家终身限额
这是本 mod 最接近"白名单/过滤"的机制,但它作用在服务端掉落侧,不是玩家给袋子设过滤。
| 环节 | 行为 |
|---|---|
| 计数键 | String.format("%s_%s_%s", 玩家 UUID, 组 ID, 掉落 Identifier) |
| 存储 | 世界存档根目录的 LootBags.dat(YAMCore PersistedDataBase,命名空间 LootBagStorage) |
| 判定 | getDropCount(...) >= LimitedDropCount → 该条目被排除,不进入产出 |
| 计数时机 | 在 isDropAllowedForPlayer(..., pUpdateDropCount = true) 通过时 +1,即"摇中并发放时"才计数 |
LimitedDropCount = 0 |
不限量,且 updateDropCount 会打 warn 日志 |
| 随机源 | 静态 EnhancedLootBags.Rnd(PreInit 时以 System.currentTimeMillis() 播种) |
Identifier 一旦在真实环境使用过就绝不能改——改了等于换了一个计数键,所有玩家已有的领取进度归零(README 两处明确警告)。
ItemGroup:捆绑掉落
| 情况 | 行为 |
|---|---|
ItemGroup 为空 |
该条目是独立掉落(getItemGroupDrops 只返回它自己) |
ItemGroup 非空且匹配 |
摇中其中任意一条,同组内全部条目一起进产出(getItemGroupDrops 遍历全组 equalsIgnoreCase 匹配) |
| 同组某条已超限额 | 该条被 isDropAllowedForPlayer 剔除,其余照掉 |
| 同名组一个都没匹配上 | 兜底只返回被摇中的那条 |
README 举例:5 种碎片(Thaumcraft:ItemShard:1~5)都标 ItemGroup="basicshards"、Chance=25,则五片碎片作为一组、组总权重 125,摇中即一次掉齐 5 片(每片 8 个)。
⚠️ 捆绑绕过 MaxItems 上限(LootGroupsFactory.createDrop 的 Javadoc 明确写了 “Note: This bypasses the maxItem amount”)。所以配了 ItemGroup 的档位实际产出量可能远超 MaxItems。
相关条目
- 战利品组等级体系 - 组级属性与样例配置
- 战利品袋(LootBag) - 抽取流程全貌
- 垃圾组合并机制 - 垃圾组如何改变权重分母
- 时运附魔效果 - 垃圾权重的时运削减
- /lootbags 指令 -
addloot/addinventory生成条目的参数