战利品袋(LootBag)
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | enhancedlootbags:lootbag |
| 注册类 | ItemLootBag(core/items/ItemLootBag.java) |
| 最大堆叠 | 64(继承 Item 默认值,setMaxDamage(0) 未改堆叠) |
| 耐久度 | 无(setMaxDamage(0)) |
| 附魔适用 | 是(isBookEnchantable 返回 true,getItemEnchantability = 15) |
| 子类型 | 是(setHasSubtypes(true),metadata = LootGroup ID) |
| 创造标签页 | itemGroup.ELBTab = “Enhanced LootBags” / 「增强战利品袋」 |
⚠️ 全 mod 只注册了这一个物品。源码里没有
ModBlocks/ModItems之类的方块与物品注册类,唯一一次注册发生在LootGroupsHandler.registerBagItem():new ItemLootBag(this)→GameRegistry.registerItem(mLootBagItem, "lootbag")。
功能
战利品袋是一个消耗品:右键使用一次即在玩家脚下随机生成一堆战利品,然后自身减少 1 个。
它没有方块形态、没有 TileEntity、不是 IInventory,因此:
- 不能被漏斗 / 管道抽取或塞入物品
- 袋子本身不存储任何物品,"抽取"就是右键消耗
- 没有升级槽、没有过滤器槽
袋子的全部差异都来自 metadata(物品伤害值),它直接等于 LootBags.xml 中的 LootGroup GroupMetaID:
public ItemStack createLootBagItemStack() {
return new ItemStack(LootGroupsHandler.getLootBagItem(), 1, getGroupID());
}
所以 enhancedlootbags:lootbag:0 与 enhancedlootbags:lootbag:14 是同一个物品类型,但触发的是两组完全不同的战利品表。"等级"不是代码写死的,而是配置驱动的——详见 战利品组等级体系。
名称、图标与稀有度
| 来源 | 行为 |
|---|---|
| 名称模板 | enhancedlootbags.string.lootbag_templatename = LootBag (%s) / 「战利品袋(%s)」 |
| metadata = 0 | 内层名称取 enhancedlootbags.string.default = “Default” / 「默认」 |
| metadata ≠ 0 | 内层名称取该组的 GroupName,经 StatCollector.translateToLocal 本地化;查不到 key 时退回原始 GroupName |
| 组不存在 | 名称内层显示 Error |
| 默认图标 | enhancedlootbags:lootbag_generic |
| 单组图标 | 该组配置了 LootbagIcon 属性时改用对应贴图(Optional<String>,未配置则用默认图) |
| 稀有度 | getRarity 返回该组 Rarity 属性对应的 EnumRarity;组不存在时返回 common |
LootbagIcon 意味着同一种物品在不同组下贴图可以不同——即"外观分档"。但本 fork 的 assets/enhancedlootbags/textures/items/ 下只打包了 lootbag_generic.png 一张物品贴图,没有任何分档贴图,图标差异完全依赖整合包/服务端的 LootBags.xml 是否指定了指向其它 mod 资源的 LootbagIcon 路径。
使用方式
| 使用方式 | 触发条件 | 使用效果 | 条件/限制 |
|---|---|---|---|
| 快捷栏右键 | 生存 / 创造模式,普通右键(未潜行) | 按当前组的权重表抽取 MinItems~MaxItems 叠战利品,生成在玩家坐标处 |
消耗 1 个袋子;组不存在时不消耗并提示 “This LootBag seems to be damaged, sorry about that” |
| 潜行 + 右键 | 仅创造模式(capabilities.isCreativeMode && isSneaking()) |
打开战利品预览 GUI,列出该组全部可能掉落 | 不消耗袋子;生存模式潜行右键无效 |
| 附魔 | 袋子可被附魔书附魔,可附 时运 III | 降低垃圾组(TrashGroup)掉落权重,见下 | 仅对 CombineTrashGroup="true" 的组有效 |
抽取过程(onItemRightClick → getRandomLootItems):
q = MinItems;若MaxItems > MinItems则q = rand.nextInt(MaxItems) + 1(即 1~MaxItems)- 循环
q次:按权重nextDouble() * MaxWeight抽中一条Drop - 该
Drop若带ItemGroup,则把同组内全部Drop一并纳入候选 - 每个候选经
isDropAllowedForPlayer检查LimitedDropCount是否已用尽 RandomAmount="true"时数量取nextInt(Amount)+1,否则为Amount- 超出单叠上限的按
getMaxStackSize()拆叠 - 以
EntityItem掉落在玩家脚下,delayBeforeCanPickup = 0(可立即拾取) - 播放音效
enhancedlootbags:lootbag_open(音量 0.75,音调 1.0) pStack.stackSize -= 1
抽取失败不消耗袋子:单次开启最多重试 10 轮(tMaxRuns < 10),10 轮内一次都没摇出任何物品时,提示 enhancedlootbags.string.try_again = “That didn’t work. Please try again!” 并提前 return,不扣数量。
数值
| 属性 | 值 | 来源 |
|---|---|---|
| 可附魔值 | 15 | getItemEnchantability() |
| 抽取重试上限 | 10 轮/次开启 | tMaxRuns < 10 |
| 音效音量 / 音调 | 0.75 / 1.0 | playSoundAtEntity |
| 组 ID 合法范围 | 0 ~ 32767 | LootBagCommand 校验 tGroupID < 0 || tGroupID > 32767 |
| 数量合法范围 | 1 ~ 64 | LootBagCommand 校验 |
| 权重合法范围 | 1 ~ 255 | LootBagCommand 校验 |
| 时运等级 | 0 ~ 3(FortuneLevel 枚举 LV0/LV1/LV2/LV3) |
LootGroupsHandler.FortuneLevel |
合成配方
本 mod 不注册任何合成配方。 源码中无 GameRegistry.addRecipe / addShapelessRecipe 调用,袋子的获取方式完全由整合包或服务端发放(README 提到 v1.1.22 后 GroupID 0 的袋子从 NEI 隐藏但仍可在创造模式取得)。
创造模式标签页内容
getSubItems 会为每一个 LootGroup 生成一个条目;若该组 CombineTrashGroup=true 且配置项 AllowFortuneBags=true,再额外生成一个已附时运 III 的副本(s2.addEnchantment(Enchantment.fortune, 3))。因此标签页里出现"同一个袋子出现两次、其中一次名字是紫色的"是正常现象。
相关条目
- 战利品组等级体系 - 袋子的 metadata 与 LootGroup 的完整对应关系
- 掉落条目规则 - 单条战利品的 Chance / Amount / LimitedDropCount 等字段
- 垃圾组合并机制 -
CombineTrashGroup与TrashGroup如何改变抽取范围 - 战利品袋预览界面 - 创造模式潜行右键打开的 108 格只读界面
- 时运附魔效果 - 时运 I/II/III 对垃圾掉落的削减
- AllowFortuneBags 配置项 - 关闭后时运完全失效
- /lootbags 指令 - 服务端增删组与战利品的指令