/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 显示会滞后)。
相关条目
- 战利品组等级体系 -
addgroup创建的组用到的全部属性 - 掉落条目规则 -
addloot各参数写入的字段语义 - AllowFortuneBags 配置项 - 唯一配置项