/// <summary> /// 数据不同步的回调函数 /// </summary> /// <param name="gcNID">不同步的玩家ID</param> /// <param name="frame">不同步的帧</param> /// <param name="data1">正常数据</param> /// <param name="data2">异常数据</param> internal void OnOutOfSync(ulong gcNID, int frame, Google.Protobuf.ByteString data1, Google.Protobuf.ByteString data2) { BSUser user = BS.instance.userMgr.GetUser(gcNID); //发送不同步的数据 Protos.BS2GC_OutOfSync outOfSync = ProtoCreator.Q_BS2GC_OutOfSync(); outOfSync.Frame = frame; outOfSync.Data1 = data1; outOfSync.Data2 = data2; BS.instance.netSessionMgr.Send(user.gcSID, outOfSync); //通知CS玩家离开战场 Protos.BS2CS_KickUser kickUser = ProtoCreator.Q_BS2CS_KickUser(); kickUser.GcNID = gcNID; kickUser.Reason = Protos.BS2CS_KickUser.Types.Reason.OutOfSync; BS.instance.netSessionMgr.Send(SessionType.ServerB2CS, kickUser); //断开玩家连接 BS.instance.netSessionMgr.CloseSession(user.gcSID, "different snapshot crc32 value"); }
public void OnGCSessionClosed(NetSessionBase session, string reason) { ClientSession gcSession = ( ClientSession )session; gcSession.activeTime = 0; //检查玩家是否登陆了 BSUser user = BS.instance.userMgr.GetUser(gcSession.id); if (user != null) { if (reason != "battle_end") { //通知cs玩家断线 Protos.BS2CS_KickUser msg = ProtoCreator.Q_BS2CS_KickUser(); msg.Reason = Protos.BS2CS_KickUser.Types.Reason.Gclost; msg.GcNID = user.gcNID; BS.instance.netSessionMgr.Send(SessionType.ServerB2CS, msg); BS.instance.userMgr.OnDisconnect(user); } } }
/// <summary> /// BS通知玩家离开战场 /// </summary> public ErrorCode OnBs2CsKickUser(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.BS2CS_KickUser kickUser = (Protos.BS2CS_KickUser)message; CSUser user = CS.instance.battleStaging.GetUser(kickUser.GcNID); if (user != null) { Protos.CS2GS_KickGC.Types.EReason reason = Protos.CS2GS_KickGC.Types.EReason.OutOfSync; switch (kickUser.Reason) { case Protos.BS2CS_KickUser.Types.Reason.OutOfSync: reason = Protos.CS2GS_KickGC.Types.EReason.OutOfSync; break; case Protos.BS2CS_KickUser.Types.Reason.Gclost: reason = Protos.CS2GS_KickGC.Types.EReason.Bslost; break; } //踢下线 CS.instance.userMgr.KickUser(user, reason); } return(ErrorCode.Success); }