掉落条目规则(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。

相关条目