搜索

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,最终表现为只有名字、没有宠物实体。

新流程:

  1. 使用 Bukkit World#spawn 的生成前回调写入宠物 UUID 与宠物类型 PDC。
  2. 使用 CreatureSpawnEvent.SpawnReason.CUSTOM 触发标准 Bukkit 生成事件。
  3. LiPet 在 HIGHEST 优先级检查事件,只对已取消且带 LiPet 标记的实体解除取消。
  4. 普通生物、刷怪笼生物、其他插件实体和没有 LiPet 标记的 CUSTOM 实体仍然遵守领地保护。
  5. 生成返回后再次检查实体是否有效且存活;失败时立即回滚,不挂载模型、不启用 AI,也不创建宠物名牌。

plugin.yml 已将 Residence 声明为软依赖,用于稳定加载顺序。未安装 Residence 时不影响 LiPet 启动。

3. 升级步骤

  1. 停服并备份 plugins/LiPet/ 与 SQLite / MySQL 数据。
  2. 删除旧 LiPet Jar,只保留 LiPet-0.26.12-SNAPSHOT.jar。
  3. 启动服务器,等待 messages.yml 自动补齐新指令文本。
  4. 给管理组按需授予 lipet.admin.pet.give 与 lipet.admin.pet.take。
  5. 执行 /lipet give <测试玩家> wolf 测试宠物,确认目标仓库出现宠物。
  6. 依次使用名称、类型 ID 和 UUID 执行 /lipet take,确认只删除匹配宠物。
  7. 在 Residence 禁止生物生成的领地内召唤宠物,确认实体、模型、AI 和双行名牌同时出现。

4. 验证范围

  • 默认兼容构建与 -Ppaper-26.2 Profile 各执行 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。