耳内有灰:
Bug 1: Client.SaveFog() 发送数据到服务器后,没有更新 Client.fogData 缓存,导致重入游戏时 proactive merge 用的是过期数据。Bug 2: 退出游戏重新进入时,Client.fogData / Client.fogDataLoaded 没有被重置,也没有重新向服务器请求迷雾数据(因为 CLIENT_READY 只发送一次)。在 Client.SaveFog() 中,保存后同步更新 Client.fogData,保持缓存最新增加 Client.ResetFogCache() 方法,在 MainGame.Reset() 时清除缓存,确保下次重入时能正确走 callback 路径在 MainGame.Reset() 中调用 ResetFogCache()增加 Client.RequestFogReload() 方法,在重入游戏时重新向服务器请求迷雾数据修复 1: Client.SaveFog() — 保存后更新缓存修复 2: 在 MainGame.Reset() 中调用 ResetFogCache(),并在 _setupGameUI 中请求服务端重新发送迷雾数据。正确的策略是:不清除缓存,让 proactive merge 使用 SaveFog 更新后的缓存数据。这样重入时缓存里就是最新的已保存数据。失败链路:首次进入 → 服务器发 FOG_LOADED({}) → Client.fogData = {}, fogDataLoaded = true玩家探索 → Reveal() → saveDirty = true保存 → Client.SaveFog(serializedData) → 发给服务器 → 但 Client.fogData 仍是 {}退出菜单 → Reset() → gs.fogOfWar = nil重入 → 新空白迷雾 → proactive merge 检查 Client.fogData(仍是 {})→ fd.w 是 nil → 跳过反序列化 → 全黑!修复后的正确链路:首次进入 → 服务器发 FOG_LOADED({}) → Client.fogData = {}, fogDataLoaded = true玩家探索 → Reveal() → saveDirty = true保存 → Client.SaveFog(serializedData) → 发给服务器 → Client.fogData = serializedData ✓退出菜单 → Reset() → gs.fogOfWar = nil(缓存保留)重入 → 新空白迷雾 → proactive merge 检查 Client.fogData(有 w, h, rows)→ 反序列化成功 ✓核心改动就一行:在 Client.SaveFog() 中保存后同步更新 Client.fogData。修复总结:迷雾持久化失败的根本原因是 Client.SaveFog() 发送数据到服务器后,没有同步更新本地缓存 Client.fogData。导致重入游戏时,proactive merge 读到的仍是初始空数据 {}(fd.w 为 nil),跳过了反序列化,迷雾全黑。修复方案(scripts/network/Client.lua):在 SaveFog() 中添加一行 Client.fogData = fogData,确保每次保存后本地缓存与服务器数据同步。重入游戏时 proactive merge 即可使用最新的探索数据恢复迷雾。
已经到底了




