战利品袋(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):

  1. q = MinItems;若 MaxItems > MinItems 则 q = rand.nextInt(MaxItems) + 1(即 1~MaxItems)
  2. 循环 q 次:按权重 nextDouble() * MaxWeight 抽中一条 Drop
  3. 该 Drop 若带 ItemGroup,则把同组内全部 Drop 一并纳入候选
  4. 每个候选经 isDropAllowedForPlayer 检查 LimitedDropCount 是否已用尽
  5. RandomAmount="true" 时数量取 nextInt(Amount)+1,否则为 Amount
  6. 超出单叠上限的按 getMaxStackSize() 拆叠
  7. 以 EntityItem 掉落在玩家脚下,delayBeforeCanPickup = 0(可立即拾取)
  8. 播放音效 enhancedlootbags:lootbag_open(音量 0.75,音调 1.0)
  9. 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))。因此标签页里出现"同一个袋子出现两次、其中一次名字是紫色的"是正常现象。

相关条目