搜索

0.27.6 货币名称配置与热重载

宠物币、金币、点券名称配置,成功重载后重开双商城生效,失败保留旧名和原有结算规则。

更新日期:2026-08-31;对应成品:LiPet-0.27.6-SNAPSHOT.jar。

本版让宠物商城和宠物道具商城统一使用可配置的货币名称,并修复修改名称后执行 /lipet reload 仍显示旧名称的问题。PlayerPoints 默认显示“点券”,Vault 默认显示“金币”,内置货币默认显示“宠物币”。

配置货币名称

编辑服务器的 plugins/LiPet/config.yml。如果已有 currency 节点,只合并下方缺失子节点,保留自己的初始余额,不要再添加第二个同名根节点。

# 三种货币的显示设置;名称不会改变商店支付 ID 或真实扣款方式。
currency:
  # LiPet 内置货币,对应 shop.yml 的 INTERNAL。
  internal:
    # 非空单行文本,支持 MiniMessage;成功重载后同步商城、余额指令和奖励提示。
    display-name: "宠物币"
    # 首次创建内置货币账户的余额,范围大于等于 0;仅启动时读取。
    # 已有账户不会被重设,修改显示名称并重载也不会改变初始余额设置。
    initial-balance: 1000.0
  # Vault 经济货币,对应 shop.yml 的 VAULT;需要 Vault 和已挂钩的经济插件。
  vault:
    # 非空单行文本,支持 MiniMessage;默认“金币”,成功重载后用于两个商城。
    display-name: "金币"
  # PlayerPoints 点数,对应 shop.yml 的 PLAYERPOINTS;需要启用 PlayerPoints。
  playerpoints:
    # 非空单行文本,支持 MiniMessage;默认“点券”,可改成“积分”等自定义名称。
    display-name: "点券"

支付选择仍写在 shop.yml 的商品配置中:

# 合并到已有商品节点;这里只展示支付字段,不是可独立使用的完整商品。
# 提供器 ID 只能填写已支持的 INTERNAL、VAULT、PLAYERPOINTS,不要改为“点券”。
currency: "PLAYERPOINTS"
# 商品价格必须大于等于 0;使用 PlayerPoints 时必须为整数金额。
# 100.0 和 100.00 都表示整数 100,100.5 不适用于 PlayerPoints。
price: 100.0

例如 price: 100.0 的 PlayerPoints 商品默认显示 100.00 点券。把 currency.playerpoints.display-name 改成“积分”后显示 100.00 积分;本次仅改变货币文字,100.00 的数字格式、商品价格、玩家余额与实际扣款逻辑保持不变。

两个商城的默认 Lore 使用 <currency> 变量。管理员自定义 Lore 如果直接写了 PlayerPoints、Vault 或其他固定名称,需要把相应文字改成 <currency>,才能跟随名称配置变化。没有安装或启用对应经济插件时,改名不会使该货币变得可用;仍需通过 /lipet status 检查挂钩状态。

升级与生效步骤

  1. 停服并备份 plugins/LiPet/ 和数据库。
  2. 替换为 LiPet-0.27.6-SNAPSHOT.jar,确保目录中只保留一个 LiPet 插件 Jar。
  3. 启动服务器,执行 /lipet status 确認当前版本与经济插件状态。首次换 Jar 必须重启一次,旧版 /lipet reload 不会加载新代码。
  4. 修改 config.yml 的三个 currency.*.display-name 中需要调整的名称。
  5. 执行 /lipet reload,等待明确的成功提示。
  6. 关闭已经打开的商城,再分别执行 /lipet shop、/lipet itemshop 检查名称。已打开的菜单不会自动重绘。

完成首次升级后,只修改货币名称无需再次重启服务器;成功重载并重新打开菜单即可。

重载与旧配置保护

名称由独立快照集中管理,已有货币提供器和注册表通过动态读取取得最新名称,无需重建余额账户、奖励服务或商店服务。

  • 候选配置先完整校验;数据库结果为无需切换(NO_CHANGE)或切换成功(SWITCHED)后,才统一发布新的名称快照。
  • 配置无效、重载异常或数据库切换失败时保留已经生效的名称,不会提前显示尚未成功加载的新名称。
  • 并发重载请求被拒绝时不会发布该请求中的候选名称;正在执行的那一次仍按自己的成功或失败结果处理。
  • 旧配置仅补缺失节点与中文注释,不覆盖已有自定义名称、注释、商品价格或 shop.yml 的支付 ID。
  • server.id、服务器群组与 currency.internal.initial-balance 继续按启动时读取;本次名称热重载不扩大这些配置的生效范围。
  • 内置货币名称成功更新后,使用该名称的余额指令与奖励提示也同步更新;数据库中的余额和结算精度不变。

验证结果

  • 默认构建与 Paper 26.2 API Profile 各 216 项测试通过,失败、错误、跳过均为 0。
  • 同一最终 Jar 在隔离的 Paper 26.1.2 与 Paper 26.2 Build 111 + PlayerPoints 3.3.5 环境完成服务端 GUI 探针,两个服务端均输出默认名称、重载和支付检查通过,并安全关闭。
  • 探针通过实际 PetGuiService 创建两个商城的物品栏,检查商品 ItemStack Lore 默认包含 100.00 点券。执行真实 /lipet reload、数据库保持不变后,同一 GUI 服务及货币注册表生成的 Lore 改为“星光点券”,内置货币名称同步改为“伙伴币”。
  • 重载前后 server.id、server.group 和启动时的初始余额配置保持不变;自定义配置注释保留。
  • 实际 PlayerPoints 网关先建立 100 点测试余额,再通过生产货币 Provider 扣除 40 点,余额核对为 60;探针结束后已清理测试余额。
  • 成品 SHA-256:8E8EB3093CFADE993F57FBEFE0D3C69BAE1D76AE47FEF0B303FE482807F035EF。

以上 GUI 验证检查的是服务端生成的真实物品栏与 Lore,不是玩家进服后的真人客户端视觉测试。本轮实际支付探针覆盖 PlayerPoints;不能把该结果表述为 Vault 经济插件或所有客户端界面的实测。