[MD]
插件已从原来的双模式购买逻辑,重构为统一的“视线提示 + 蹲下左键打开批量购买 GUI”流程,版本保持为 1.5.0。
交互与性能
- 修复普通玩家打开购买界面反应慢、偶尔无法打开的问题。
- 管理员与普通玩家现在走相同的家具识别和 GUI 打开流程。
- 统一处理 CraftEngine 家具、自定义方块和直接家具实体交互。
- 加入交互冷却,避免一次点击被多个监听器重复处理。
- 增加玩家权限、商城区域、商品状态和线程归属检查。
- 完善 Folia/FoliaLib 调度,避免跨区域线程直接操作玩家或 GUI。
- 默认视线检测间隔调整为 2 ticks,降低提示延迟。
- Tooltip 可以关闭,但关闭后仍可通过蹲下左键购买。
GUI 全面重构
购买界面调整为 45 格布局,包含:
- 家具实物预览和家具 ID。
- 玩家当前余额与购买后余额。
- 商品单价。
- 当前购买数量。
- 订单总价。
- -10、-1、+1、+10 数量按钮。
- 五个数量快捷按钮,默认 1、8、16、32、64。
- 自动选择当前最大可购买数量。
- 取消和确认购买按钮。
- 余额不足、背包不足、商品失效等独立按钮状态。
- 价格变化后自动刷新订单,并要求玩家重新确认。
数量范围、初始数量、快捷数量和所有 GUI 槽位都可以通过 config.yml 调整。
批量购买系统
- 新增 PurchaseQuote 订单报价模型。
- 统一计算单价、数量、总价、余额和购买后余额。
- 同时计算余额最多可买数量、背包最多容纳数量及最终最大购买量。
- 支持一次购买多个家具。
- 超过单组堆叠上限时自动拆分物品堆。
- 下单前和确认时都会重新检查价格、余额、商品和背包容量。
- 防止同一玩家同时提交多个订单。
- API 和购买事件现在支持数量、单价与总价。
- 外部插件修改事件数量或价格后,会再次执行合法性验证。
交易安全
- 扣款前检查余额和订单参数。
- 使用模拟背包计算,避免付款后才发现放不下。
- 发货失败时恢复发货前的背包内容。
- 背包不足或发货失败时自动尝试退款。
- 对无效价格、非有限数值和异常事件参数进行拦截。
- 记录玩家、家具、数量、总价、货币和失败原因。
- 交易日志继续写入 transactions.log。
配置迁移
主配置版本升级至 v3,迁移功能经过完整加固:
- 启动时先检测配置版本,再执行新版校验。
- 修复 v2 的 gui.size: 27 在迁移前被误报为错误的问题。
- 迁移前按原始字节生成唯一时间戳备份。
- 空配置和 YAML 损坏配置也会先备份。
- 在临时文件中完成合并与校验。
- 校验通过后再原子替换正式 config.yml。
- 写入失败时旧配置保持不变。
- 保留经济、提示、音效、权限和自定义货币名称等有效值。
- 类型不匹配的旧值自动回退到新版默认值。
- 删除 interaction-mode 和旧版 GUI 按钮结构。
- 自动加入数量购买和新版 GUI 配置。
- 迁移后固定使用 45 格布局。
- 保留新版配置说明注释。
- 已是 v3 的配置不会重复迁移或重复生成备份。
你提供的实际 Folia 启动日志也确认 v2 到 v3 迁移成功,插件能够正常启用。
提示文本
购买成功提示现在会显示完整订单信息,例如:
[家具商城] 购买成功 | 长椅 x8 | 支付 200 金币 | 余额 800 金币
新增或完善的提示包括:
- 商城未开放。
- 没有使用权限。
- 不在商城区域。
- 商品已下架或失效。
- 背包无法容纳指定数量。
- 余额不足、当前余额和所差金额。
- 会话过期。
- 商品信息变化。
- 商品价格变化。
- 扣款失败。
- 发货失败及退款提示。
购买消息支持 {furniture}、{amount}、{unit_price}、{total}、{balance}、{shortfall} 和 {currency}。
旧版官方默认消息会在内存中自动升级,管理员自定义消息不会被覆盖。
注:如果实在有问题那就重新生成一下配置文件
[/MD]