2026-08-28 管理与召唤更新
give/take、离线与全服批处理、Tab 补全及领地保护内安全召唤。
适用版本:0.26.12-SNAPSHOT
本次更新加入管理员跨玩家宠物发放与收走指令,并修复 Residence 等领地禁止生物生成时,宠物无法出现却可能残留名字的问题。
1. 宠物 give / take 指令
新增:
/lipet give <玩家|-all> <宠物类型> [宠物名称]
/lipet take <玩家|-all> <宠物名称|UUID|宠物类型|-all>
示例:
/lipet give Steve wolf 小狼
/lipet take Steve 小狼
/lipet take Steve wolf
/lipet give -all cat
/lipet take -all cat
/lipet take Steve -all
- 玩家名称支持不区分大小写匹配,目标可以离线,但必须仍有 Bukkit 玩家档案。
- 完整 UUID 可直接定位数据库玩家,即使本地
playerdata已被清理也可使用。 - 第一个
-all包含服务器全部已知离线玩家与当前在线玩家,并按 UUID 去重。 give的宠物类型必须存在且已启用;省略名称时使用类型默认显示名。- 每名玩家对同一宠物类型仍只能拥有一只;已有同类型或同名宠物时安全跳过。
take支持宠物名称、宠物 UUID、宠物类型 ID;第二个参数使用-all时收走该目标的全部宠物。- 收走已召唤宠物时会清理活动会话、实体、ModelEngine 模型和双行名牌;已收回或离线玩家的宠物直接从持久化数据删除。
- 全服操作在后台逐个玩家、逐只宠物执行,避免瞬间向 SQLite / MySQL 提交大量并发写入。
- 单个目标失败不会中断后续玩家;完成后报告玩家总数、命中、删除、跳过和失败数量。
- Tab 补全包含
-all、服务器已知玩家名、宠物类型和当前已缓存的宠物名称。
权限:
lipet.admin.pet.give
lipet.admin.pet.take
两项权限默认仅 OP 拥有,并已加入 lipet.admin 子权限。全部反馈文本位于 messages.yml,可使用 MiniMessage 自定义。
2. Residence / 领地保护内召唤
旧流程在调用世界生成后才写入宠物标记。Residence 等插件会先把 CUSTOM 生物生成事件取消,LiPet 因而无法在事件阶段识别这是自己的宠物;后续流程还可能继续创建 TextDisplay,最终表现为只有名字、没有宠物实体。
新流程:
- 使用 Bukkit
World#spawn的生成前回调写入宠物 UUID 与宠物类型 PDC。 - 使用
CreatureSpawnEvent.SpawnReason.CUSTOM触发标准 Bukkit 生成事件。 - LiPet 在
HIGHEST优先级检查事件,只对已取消且带 LiPet 标记的实体解除取消。 - 普通生物、刷怪笼生物、其他插件实体和没有 LiPet 标记的
CUSTOM实体仍然遵守领地保护。 - 生成返回后再次检查实体是否有效且存活;失败时立即回滚,不挂载模型、不启用 AI,也不创建宠物名牌。
plugin.yml 已将 Residence 声明为软依赖,用于稳定加载顺序。未安装 Residence 时不影响 LiPet 启动。
3. 升级步骤
- 停服并备份
plugins/LiPet/与 SQLite / MySQL 数据。 - 删除旧 LiPet Jar,只保留
LiPet-0.26.12-SNAPSHOT.jar。 - 启动服务器,等待
messages.yml自动补齐新指令文本。 - 给管理组按需授予
lipet.admin.pet.give与lipet.admin.pet.take。 - 执行
/lipet give <测试玩家> wolf 测试宠物,确认目标仓库出现宠物。 - 依次使用名称、类型 ID 和 UUID 执行
/lipet take,确认只删除匹配宠物。 - 在 Residence 禁止生物生成的领地内召唤宠物,确认实体、模型、AI 和双行名牌同时出现。
4. 验证范围
- 默认兼容构建与
-Ppaper-26.2Profile 各执行 91 项自动测试,结果均为 0 失败、0 错误、0 跳过。覆盖发放、同类型跳过、按类型收走、全部收走、重叠指令串行化、类型/名称冲突保护、失败后继续、离线玩家、UUID 去重、Tab 数据源、事件优先级与资源描述符。 - 同一成品已在 Paper 26.1.2 Build 70 与 Paper 26.2 Build 111 启动并加载
LiPet 0.26.12-SNAPSHOT,完成/lipet status、第二页中文帮助、离线 UUID 发放、按类型收回及安全关闭探针。 - Paper 26.2 额外连续提交“发放狼、发放猫、按类型收回狼、收回全部宠物”,两个收回操作均依次成功删除 1 只宠物,确认同一玩家的查询与删除已整体串行化。
- 测试服没有真实登录过的离线玩家档案,因此首参数
-all的在线/离线合并、UUID 去重与批处理由自动测试覆盖;任意完整离线 UUID 的真实 SQLite 发放与收回已经过两套服务端验证。 - Residence 的监听顺序、仅放行 LiPet 标记实体和生成失败不创建名牌已由单元测试及事件边界检查覆盖;本地没有可用的 Residence 领地与在线玩家,本轮未进行真实领地内召唤操作。
- 成品使用 Java 21 字节码(class major 65),共 300 个业务 class,外部依赖 class 数为 0;SQLite、MiniMessage、Vault、PlaceholderAPI 与 Residence 均未打入 Jar。
- 最终成品大小为
642992字节,SHA-256:FF852317D2C15DE1CF3FC7F94F1D2C1CCFA9787852D35E6B4D397E53893E8656。