/lootbags 指令

基本信息

属性 值
指令名 /lootbags
别名 /lbag
实现类 server/LootBagCommand.java(ICommand)
注册时机 FMLServerStartingEvent(pEvent.registerServerCommand)
权限 OP 且 创造模式(见下)
指令用法提示 getCommandUsage() 固定返回 “Check the readme for usage”
Tab 补全 未实现(addTabCompletionOptions 返回 null)

权限判定

canCommandSenderUseCommand 的三种情况:

发送者 是否放行
服务端控制台(MinecraftServer) ✅ 放行
玩家(EntityPlayerMP) ⚠️ 必须同时是 OP 且创造模式(tPlayerOpped && tIncreative)
命令方块 / 其它 ❌ 拒绝

无参数执行时只打印 “Check the readme for usage”(SendHelpToPlayer),不给子命令列表。

子命令完整枚举

/lootbags reload

属性 值
参数 无
作用 从磁盘重新加载 LootBags.xml,成功则向全服所有客户端广播新的组列表
权限 需 OP + 创造模式(在 processCommand 里没有额外校验,权限只在命令入口判定)
客户端同步 ✅ 有(sendClientUpdate() → LootBagClientSyncMessage 广播)

行为细节:

  • 重新校验配置(VerifyConfig);校验失败则不替换内存中的组列表,并提示失败
  • 成功后清空 _mBufferedLootGroups 合并缓存(组间 trash 关系可能已变)
  • 广播给客户端的是不含 <Loot> 子元素的精简 XML(LootGroupsFactory.copy(..., false)),即只同步组 ID / 名称 / 稀有度 / 数量范围 / trash 开关 / 图标,战利品内容不同步(客户端靠自己的 LootBags.xml 显示 Nei 详情)

⚠️ 源码 bug:processCommand 中 reload 的成功与失败两条分支都输出同一句 “Reload successful”,只是失败那条走 SendError。即失败时也会看到这句话,只是显示为错误色。

/lootbags addloot <LootGroupID> [Amount Chance LimitedDropCount RandomAmount]

属性 值
必填参数 <LootGroupID>
可选参数 <Amount> <Chance> <LimitedDropCount> <RandomAmount>,必须 4 个一起给(pArgs.length == 6,凑不齐就当没给,全部用默认值)
作用 把手持物品加入指定组的战利品列表
前置 必须手持物品,否则提示 “Pickup an item first”
标识符 自动生成 UUID.randomUUID().toString() 作为 Identifier
NBT 若手持物有 stackTagCompound,会原样写入 NBTTag 字段
客户端同步 ❌ 无(只 SaveLootGroups() 写盘)

默认值(不给可选参数时):Amount=1、Chance=100、LimitedDropCount=0、RandomAmount=0。

参数校验(任一不合法则整条指令拒绝,只提示 “Some flags are wrong. Make sure to read the readme”):

参数 合法范围 校验代码
LootGroupID 0 ~ 32767 tGroupID < 0 || tGroupID > 32767
Amount 1 ~ 64 tAmount < 1 || tAmount > 64
Chance 1 ~ 255 tChance < 1 || tChance > 255
LimitedDropCount 0 ~ 无实际上限 ⚠️ 源码写的是 tLimitedDropCount < 0 || tChance > 255,上界误用了 tChance,所以 LimitedDropCount 的上界实际没被检查(README 声称 0~255)
RandomAmount 0 或 1 tRandomAmount < 0 || tRandomAmount > 1

组 ID 不存在时提示 “LootGroup ID %d is unknown”。

/lootbags addinventory <LootGroupID> [Amount Chance LimitedDropCount RandomAmount]

与 addloot 完全同参同校验,唯一区别是把玩家主背包全部物品逐个加入:

属性 值
作用 遍历 tEp.inventory.mainInventory,每个非空物品生成一条 Drop
标识符 每个物品各自一个 UUID.randomUUID()
存盘 在循环内部每加一条就 SaveLootGroups() 一次(addloot 是在循环外只存一次)
客户端同步 ❌ 无

README 对此的吐槽:“Pretty obvious what it does; It dumps your entire inventory into loot-group <groupID>. No excuses anymore for ‘This takes so much time’”。

/lootbags addgroup <LootGroupID> [Rarity MinItems MaxItems]

属性 值
必填参数 <LootGroupID>
可选参数 <Rarity> <MinItems> <MaxItems>,必须 3 个一起给(pArgs.length == 5)
作用 创建一个新的空组
客户端同步 ❌ 无(README 明确警告:“even if the command to add groups will work on a server, the client’s won’t get notified about that change, and thus the new lootbags won’t be available”)

新组固定属性(createLootGroup 硬编码,不可用指令调整):

属性 值
GroupName "Unnamed group <ID>"
CombineTrashGroup true(createLootGroup(..., true))
TrashGroup 0(int 默认值)
LootbagIcon 无(用默认贴图)
MinItems / MaxItems / Rarity 不给参数时为 1 / 1 / common

参数校验:

参数 合法范围
LootGroupID 0 ~ 32767
Rarity 0 ~ 3(EnumRarity.values().length),越界拒绝
MinItems ≥ 1,且必须 ≤ MaxItems
MaxItems ≥ 1

组 ID 已被占用时提示 “LootGroup ID %d is already in use”。

与手动改文件的关系

README 明确建议:优先在服务端改 LootBags.xml 然后 /lbag reload,这条路径会把新组、删除的组都推送给客户端。直接用 addgroup 新建组则不会通知客户端,客户端看不到新档位。

addloot / addinventory 往已有组里加物品同样不通知客户端,README 提示会导致客户端与服务端不同步(客户端的 Nei 显示会滞后)。

相关条目