恢复健康值后,重进游戏健康值回到之前的值

05/11攻略
找到问题了。让我分析 doMarketBuyWithAccount 的逻辑:
服务端逻辑(Server.lua 第 1278-1354 行):
食物购买时正确修改了 stats.health(第 1312 行)
正确调用了 serverCloud:Set(userId, STATS_KEY, stats, ...) 保存
保存成功后,发送了 MARKET_BUY_RESULT 和 STATS_LOADED 两个事件
服务端看起来没问题。问题可能在客户端接收 MARKET_BUY_RESULT 时的处理。让我检查客户端的市场购买结果处理。
现在我理解了完整的逻辑。让我确认根本原因——如果用户先在客栈开始休息(设置了 restStart 和 restStartHP),然后去集市买了食物,会发生什么:
客栈休息开始:restStart = os.time(), restStartHP = 93(当时的 HP)
买食物:stats.health = min(100, 93+20) = 100,保存到云端 ✅
但 restStartHP 仍然是 93,食物购买代码没有清除 restStart / restStartHP
重新进入游戏:loadAndSendStats → applyRestHealing(stats) → 以 restStartHP = 93 为基础重新计算 HP → 覆盖了食物回的 100
这就是根因!食物购买时没有清除客栈休息状态字段。applyRestHealing 以 restStartHP(食物购买前记录的 HP 起点)为基准计算 HP,直接覆盖了食物已经恢复到的 100 点。
Bot Avatar
找到根因了。现在修复:在食物回血后,如果当前正在客栈休息中,需要更新 restStartHP 为新的 health 值(这样后续 applyRestHealing 不会往回算),或者如果 health 已满(100),直接结束休息。
构建成功。
根因分析:
食物购买确实在服务端正确地修改了 stats.health 并通过 serverCloud:Set 保存到了云端。但问题在于客栈休息状态的干扰:
玩家在客栈开始休息 → 服务端记录 restStart = 时间戳, restStartHP = 93(当时的 HP)
玩家买了食物 → stats.health = 100,但 restStart 和 restStartHP = 93 仍然存在
重新进入游戏 → loadAndSendStats 调用 applyRestHealing(stats) → 以 restStartHP = 93 为基准重新计算 HP → 覆盖了食物恢复的 100 点
修复内容(Server.lua doMarketBuyWithAccount):
食物回血后检查是否正在客栈休息中:
如果 HP 已满(≥100),直接结束休息(清除 restStart/restStartHP)
如果 HP 未满,更新休息起点(restStartHP 设为当前 HP,restStart 重置),避免 applyRestHealing 回退到食物前的旧值
1