local EventSystem = require('Event/EventSystem') local MultiReconnectManager = { HasKCPNeedReconnect = false, -- 收到KCP需要断线重连的协议 ,但收到下一条协议(连接kcp)前 } local private = { needWaitReconnectDone = false, -- 是否需要等待服务器告诉我重连kcp成功 [kcp 和 TCP 都会使用] isInBattleReconnect = false, } function MultiReconnectManager.Init() NetManager.RegisterMsgCB(MessageEnums.MessageB2CReplenishReconnectFrameData, private.OnB2CReplenishReconnectFrameData ) end -- 设置为true的地方: 1.正常流程的最后一步BattleBegin协议 2.断线重连收到二次补帧 function MultiReconnectManager.SetInBattleReconnect(inBattle) private.isInBattleReconnect = inBattle end function MultiReconnectManager.IsInBattle() return private.isInBattleReconnect end function MultiReconnectManager.SetNeedWaitReconnectDone(needWait) -- 一定是和kcpconnect一起使用 private.needWaitReconnectDone = needWait end function MultiReconnectManager.OnUpdate() if private.needWaitReconnectDone then if BattleExt.GetReconnectDone() then private.needWaitReconnectDone = false BattleExt.SetReconnectDone(false) if private.isInBattleReconnect or MultiplayManager.CurConnectType == LuaConst.SyncConnectType.TCPReconnectInBattle then private.InBattleReconnected() else--战斗外重连【一定是TCP】 TCPReconnectManager.OutBattleReconnect() end end end end -- 接收到二次补帧后,(数据存在C#) function private.OnB2CReplenishReconnectFrameData(msg) -- local count = BattleExt.ParseB2CReplenishReconnectFrameData(msg.frameData) local count = BattleExt.ParseBattleReconnectFrameData(msg.frameData, true) logging.crit(LTAG.CRIT, "KCP 4/4: 收到二次补帧; 总Framecount =" , BattleExt.GetServerMsgCount() , ",二次补帧数据量:" , count) EventSystem.Dispatch(EventID.BI_LevelMiddle,BIManager.BIType.SyncBattle,"[sync]ReplenishFrame" ,count) if not private.isInBattleReconnect then -- 即TCP战斗外的断线重连 LogicUpdateManager.SetServerReplenishFrame(KCPTransport.GetCurserverFrame()) -- 二次补帧数据也需要快进 。战斗内断线重连的不需要 LevelManager.EnterSyncLevel() end --在这可以断定断线重连重连接上来了 ,此时需要设置下次断线为战斗中 MultiReconnectManager.SetInBattleReconnect(true) MultiplayManager.CurConnectType = LuaConst.SyncConnectType.None end --战斗内重连[tcp和kcp] function private.InBattleReconnected() if MultiplayManager.CurConnectType == LuaConst.SyncConnectType.KCPReconnect then LogicUpdateManager.StartFightUpdate() --连接kcp成功后,发送二次补帧的offset ;如果网络好的话 ,这个帧数据应该很少的,基本是0 MultiplayManager.SendReconnectInitReady() logging.crit(LTAG.CRIT,"KCP 3/4: [战斗内] IP连接成功,请求二次补帧 Framecount =" , BattleExt.GetServerMsgCount()) elseif MultiplayManager.CurConnectType == LuaConst.SyncConnectType.TCPReconnectInBattle then MultiplayManager.SendReady() logging.crit(LTAG.CRIT,"TCP-in 2/3: [战斗内] IP连接成功,SendReady请求大补帧 Framecount =" , BattleExt.GetServerMsgCount()) end end return MultiReconnectManager