/// <summary> /// LS通知CS有客户端登录成功 /// </summary> public ErrorCode OnLs2CsGclogin(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.LS2CS_GCLogin gcLogin = (Protos.LS2CS_GCLogin)message; CSUser user = CS.instance.userMgr.CreateUser(gcLogin); Protos.CS2LS_GCLoginRet gcLoginRet = ProtoCreator.R_LS2CS_GCLogin(gcLogin.Opts.Pid); gcLoginRet.Result = user != null ? Protos.CS2LS_GCLoginRet.Types.EResult.Success : Protos.CS2LS_GCLoginRet.Types.EResult.Failed; session.Send(gcLoginRet); return(ErrorCode.Success); }
/// <summary> /// 客户端与GS断开连接 /// </summary> public ErrorCode OnGs2CsGclost(NetSessionBase session, IMessage message) { Protos.GS2CS_GCLost request = (Protos.GS2CS_GCLost)message; ulong gcNID = request.SessionID; CSUser user = CS.instance.userMgr.GetUser(gcNID); if (user != null) { CS.instance.userMgr.Offline(user); CS.instance.userMgr.DestroyUser(user); } return(ErrorCode.Success); }
public ErrorCode OnGc2BsRequestFrameActions(NetSessionBase session, Google.Protobuf.IMessage message) { BSUser user = BS.instance.userMgr.GetUser(session.id); if (user != null) { Protos.GC2BS_RequestFrameActions request = (Protos.GC2BS_RequestFrameActions)message; Protos.BS2GC_RequestFrameActionsRet ret = ProtoCreator.R_GC2BS_RequestFrameActions(request.Opts.Pid); BS.instance.battleMgr.HandleRequestFrameActions(user.battle, request.From, request.To, ret); BS.instance.netSessionMgr.Send(user.gcSID, ret); } return(ErrorCode.Success); }
public ErrorCode OnGC2GSAskLogin(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.GC2GS_AskLogin login = (Protos.GC2GS_AskLogin)message; Protos.GS2CS_GCAskLogin gcAskLogin = ProtoCreator.Q_GS2CS_GCAskLogin(); gcAskLogin.SessionID = login.SessionID; Logger.Log($"client:{gcAskLogin.SessionID} ask login"); //向CS请求客户端登陆 GS.instance.netSessionMgr.Send(SessionType.ServerG2CS, gcAskLogin, RPCEntry.Pop(OnCS2GSAskLoginRet, session.id, login)); return(ErrorCode.Success); }
/// <summary> /// 客户端请求查询英雄 /// </summary> public ErrorCode OnGc2CsQueryChampions(NetSessionBase session, IMessage message) { Protos.GC2CS_QueryChampions request = (Protos.GC2CS_QueryChampions)message; ulong gcNID = request.Opts.Transid; CSUser user = CS.instance.userMgr.GetUser(gcNID); if (user != null) { Protos.CS2GC_QueryChampionsRet response = ProtoCreator.R_GC2CS_QueryChampions(request.Opts.Pid); response.Cids.AddRange(user.champions); user.Send(response); } return(ErrorCode.Success); }
/// <summary> /// 玩家请求取消匹配 /// </summary> public ErrorCode OnGc2CsCancelMatch(NetSessionBase session, IMessage message) { Protos.GC2CS_CancelMatch request = (Protos.GC2CS_CancelMatch)message; ulong gcNID = request.Opts.Transid; CSUser user = CS.instance.userMgr.GetUser(gcNID); if (!CS.instance.matchMgr.Leave(user)) { return(ErrorCode.Failed); } return(ErrorCode.Success); }
public void OnCSSessionClosed(NetSessionBase session) { uint[] gcSIDs = GS.instance.userMgr.GetClients(); //广播到客户端CS丢失 Protos.GS2GC_CSLost csLost = ProtoCreator.Q_GS2GC_CSLost(); GS.instance.netSessionMgr.Broadcast(gcSIDs, csLost); //断开所有客户端 foreach (uint gcSID in gcSIDs) { GS.instance.netSessionMgr.CloseSession(gcSID, "CS Closed"); } //清空客户端信息 GS.instance.userMgr.ClearClients(); }
private static void OnGSAskPingRet(NetSessionBase session, IMessage message, object[] args) { if (message == null) { return; } long currTime = TimeUtils.utcTime; Protos.G_AskPingRet askPingRet = (Protos.G_AskPingRet)message; long lag = ( long )((currTime - askPingRet.Stime) * 0.5); long timeDiff = askPingRet.Time + lag - currTime; Logger.Log($"cs ping ret, lag:{lag}, timediff:{timeDiff}"); }
public void ReportStateToCS(NetSessionBase session) { Protos.BS2CS_ReportState reportState = ProtoCreator.Q_BS2CS_ReportState(); BSConfig config = BS.instance.config; reportState.BsInfo = new Protos.BSInfo { Id = config.id, Ip = config.externalIP, Port = config.externalPort, State = (Protos.BSInfo.Types.State)BS.instance.state }; session.Send(reportState); }
/// <summary> /// GS请求CS,验证GC登陆的合法性 /// </summary> public ErrorCode OnGs2CsGcaskLogin(NetSessionBase session, IMessage message) { Protos.GS2CS_GCAskLogin request = (Protos.GS2CS_GCAskLogin)message; Protos.CS2GS_GCLoginRet response = ProtoCreator.R_GS2CS_GCAskLogin(request.Opts.Pid); //创建玩家并上线 CSUser user = CS.instance.userMgr.Online(request.SessionID, session.id, session.logicID); if (user == null) { //非法登陆 response.Result = Protos.CS2GS_GCLoginRet.Types.EResult.IllegalLogin; } else { response.UserInfo = new Protos.G_UserInfo { Ukey = user.ukey, GcNID = user.gcNID, OpenID = user.openID, Nickname = user.nickname, Avatar = user.avatar, Gender = user.gender, Rank = user.rank, Money = user.money, Diamoned = user.diamoned, Exp = user.exp, }; response.UserInfo.Champions.AddRange(user.champions); //检查玩家是否在战场 if (user.isInBattle) { //检查是否存在BS信息(可能当玩家上线时,BS已丢失) //这里理应不会成功断言,因为BS丢失时会把玩家从战场暂存器里移除 INetSession bsSession = CS.instance.netSessionMgr.GetSession(user.bsSID); System.Diagnostics.Debug.Assert(bsSession != null, $"can not find BS:{user.bsSID}"); CS.instance.lIDToBSInfos.TryGetValue((( BattleSession )bsSession).logicID, out BSInfo bsInfo); System.Diagnostics.Debug.Assert(bsInfo != null, $"can not find BS:{( ( BattleSession )bsSession ).logicID}"); response.GcState = Protos.CS2GS_GCLoginRet.Types.EGCCState.Battle; response.GcNID = user.ukey | ( ulong )bsInfo.lid << 32; response.BsIP = bsInfo.ip; response.BsPort = bsInfo.port; } response.Result = Protos.CS2GS_GCLoginRet.Types.EResult.Success; } session.Send(response); return(ErrorCode.Success); }
/// <summary> /// 处理cs通知开始战斗 /// </summary> public ErrorCode OnCs2BsBattleInfo(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.CS2BS_BattleInfo battleInfo = (Protos.CS2BS_BattleInfo)message; BS.instance.battleMgr.CreateBattle(battleInfo, (bid, success) => { Protos.BS2CS_BattleInfoRet battleInfoRet = ProtoCreator.R_CS2BS_BattleInfo(battleInfo.Opts.Pid); battleInfoRet.Bid = bid; battleInfoRet.Result = success ? Protos.Global.Types.ECommon.Success : Protos.Global.Types.ECommon.Failed; session.Send(battleInfoRet); }); return(ErrorCode.Success); }
public void OnGSSessionClosed(NetSessionBase session) { //更新GS列表 CS.instance.lIDToGSInfos.Remove(session.logicID); CS.instance.UpdateAppropriateGSInfo(); //踢出所有连接到该GS的玩家 CS.instance.userMgr.OnGSDisconnect(session.logicID); //通知LS有GS断开连接了 Protos.CS2LS_GSLost message = ProtoCreator.Q_CS2LS_GSLost(); message.Gsid = session.logicID; CS.instance.netSessionMgr.Send(SessionType.ServerLS, message); session.logicID = 0; }
public void ReportStateToCS(NetSessionBase session) { Protos.GS2CS_ReportState reportState = ProtoCreator.Q_GS2CS_ReportState(); GSConfig config = GS.instance.config; reportState.GsInfo = new Protos.GSInfo { Id = config.gsID, Name = config.name, Ip = config.externalIP, Port = config.externalPort, Password = config.password, State = (Protos.GSInfo.Types.State)GS.instance.state }; session.Send(reportState); }
/// <summary> /// 玩家请求离开房间 /// </summary> public ErrorCode OnGc2CsLeaveRoom(NetSessionBase session, IMessage message) { Protos.GC2CS_LeaveRoom request = (Protos.GC2CS_LeaveRoom)message; ulong gcNID = request.Opts.Transid; CSUser user = CS.instance.userMgr.GetUser(gcNID); if (user != null) { if (!CS.instance.roomMgr.Leave(user)) { return(ErrorCode.Failed); } } return(ErrorCode.Success); }
public ErrorCode OnECs2GsKickGc(NetSessionBase session, IMessage message) { Protos.CS2GS_KickGC kickGC = (Protos.CS2GS_KickGC)message; //可能在收到消息前,客户端就断开了,这里必须容错 if (GS.instance.userMgr.GetSID(kickGC.GcNID, out uint sid_)) { //通知客户端被踢下线 Protos.GS2GC_Kick kick = ProtoCreator.Q_GS2GC_Kick(); kick.Reason = kickGC.Reason; GS.instance.netSessionMgr.Send(sid_, kick); //强制断开客户端 GS.instance.netSessionMgr.CloseSession(sid_, "CS Kick"); } return(ErrorCode.Success); }
public ErrorCode OnCs2DbUpdateRank(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.CS2DB_UpdateRank request = (Protos.CS2DB_UpdateRank)message; //combine id string ids = string.Empty; int count = request.Gains.Count; for (int i = 0; i < count; i++) { Protos.CS2DB_Gain gain = request.Gains[i]; if (i < count - 1) { ids += $"{gain.Ukey},"; } else { ids += gain.Ukey; } } string money = "money = CASE id "; string diamoned = "diamoned = CASE id "; string exp = "exp = CASE id "; string ranking = "ranking = CASE id "; for (int i = 0; i < count; i++) { Protos.CS2DB_Gain gain = request.Gains[i]; money += $"WHEN {gain.Ukey} THEN {gain.Money} "; diamoned += $"WHEN {gain.Ukey} THEN {gain.Diamoned} "; exp += $"WHEN {gain.Ukey} THEN {gain.Exp} "; ranking += $"WHEN {gain.Ukey} THEN {gain.Rank} "; } //update command string str = "UPDATE account_user SET "; str += money + "END, "; str += diamoned + "END, "; str += exp + "END, "; str += ranking + "END "; str += $"WHERE id IN ({ids})"; ErrorCode errorCode = DB.instance.accountDB.SqlExecNonQuery(str, out _, out uint _); return(ErrorCode.Success); }
private static void OnCS2GSAskLoginRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args) { uint sid = ( uint )args[0]; Protos.GC2GS_AskLogin login = (Protos.GC2GS_AskLogin)args[1]; Protos.CS2GS_GCLoginRet csLoginRet = (Protos.CS2GS_GCLoginRet)message; Protos.GS2GC_LoginRet gsLoginRet = ProtoCreator.R_GC2GS_AskLogin(login.Opts.Pid); switch (csLoginRet.Result) { case Protos.CS2GS_GCLoginRet.Types.EResult.Success: //检测客户端是否断线了 ClientSession gcSession = GS.instance.netSessionMgr.GetSession(sid) as ClientSession; if (gcSession == null) { //通知CS客户端断开了 Protos.GS2CS_GCLost gcLost = ProtoCreator.Q_GS2CS_GCLost(); gcLost.SessionID = login.SessionID; GS.instance.netSessionMgr.Send(SessionType.ServerG2CS, gcLost); return; } //添加到管理器 GS.instance.userMgr.AddClient(login.SessionID, sid); //设置该Session为受信任的连接 gcSession.accredited = true; gsLoginRet.Result = Protos.GS2GC_LoginRet.Types.EResult.Success; gsLoginRet.GcNID = csLoginRet.GcNID; gsLoginRet.GcState = (Protos.GS2GC_LoginRet.Types.EGCCState)csLoginRet.GcState; gsLoginRet.UserInfo = csLoginRet.UserInfo; gsLoginRet.BsIP = csLoginRet.BsIP; gsLoginRet.BsPort = csLoginRet.BsPort; gsLoginRet.Defs = Defs.binary; GS.instance.netSessionMgr.Send(sid, gsLoginRet); break; case Protos.CS2GS_GCLoginRet.Types.EResult.IllegalLogin: gsLoginRet.Result = Protos.GS2GC_LoginRet.Types.EResult.SessionExpire; GS.instance.netSessionMgr.Send(sid, gsLoginRet); GS.instance.netSessionMgr.CloseSession(sid, "client login failed"); break; } }
public ErrorCode OnLs2DbQueryAccount(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.LS2DB_QueryAccount queryUser = (Protos.LS2DB_QueryAccount)message; Protos.DB2LS_QueryAccountRet queryUserRet = ProtoCreator.R_LS2DB_QueryAccount(queryUser.Opts.Pid); ErrorCode errorCode = DB.instance.accountDB.SqlExecQuery($"select id from account_user where uname=\'{queryUser.Name}\'", dataReader => { if (dataReader.HasRows) { return(ErrorCode.UsernameExists); } return(ErrorCode.Success); }); queryUserRet.Result = errorCode == ErrorCode.Success ? Protos.Global.Types.ECommon.Success : Protos.Global.Types.ECommon.Failed; session.Send(queryUserRet); return(ErrorCode.Success); }
public ErrorCode OnGc2LsAskSmartLogin(NetSessionBase session, Google.Protobuf.IMessage message) { uint sid = session.id; string remote = session.connection.remoteEndPoint.ToString(); Protos.GC2LS_AskSmartLogin login = (Protos.GC2LS_AskSmartLogin)message; Protos.LS2GC_AskLoginRet gcLoginRet = ProtoCreator.R_GC2LS_AskLogin(login.Opts.Pid); Logger.Log($"GC {login.Id}, {session.connection.remoteEndPoint} ask login"); //检测用户名的合法性 if (!CheckUsername(login.Id)) { gcLoginRet.Result = Protos.LS2GC_AskLoginRet.Types.EResult.InvalidUname; session.Send(gcLoginRet); session.Close(true, "login failed"); return(ErrorCode.Success); } LoginContext context = new LoginContext(); context.id = login.Id; context.channel = login.Channel; context.browser = login.Browser; context.platform = login.Platform; //查询数据库 //若查询失败则自动注册 Protos.LS2DB_QueryLogin queryLogin = ProtoCreator.Q_LS2DB_QueryLogin(); queryLogin.Name = login.Id; queryLogin.Nickname = login.Id; queryLogin.VertPwd = false; queryLogin.Time = TimeUtils.utcTime; queryLogin.Ip = remote; queryLogin.Channel = login.Channel; queryLogin.Browser = login.Browser; queryLogin.Platform = login.Platform; queryLogin.Money = LS.instance.config.initMoney; queryLogin.Diamoned = LS.instance.config.initDiamoned; queryLogin.Rank = LS.instance.config.initRank; LS.instance.netSessionMgr.Send(SessionType.ServerL2DB, queryLogin, RPCEntry.Pop(OnSmartQueryLoginRet, gcLoginRet, sid, context)); return(ErrorCode.Success); }
/// <summary> /// DB返回查询登陆结果 /// </summary> private static void OnSmartQueryLoginRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args) { Protos.LS2GC_AskLoginRet gcLoginRet = (Protos.LS2GC_AskLoginRet)args[0]; uint sid = ( uint )args[1]; LoginContext context = ( LoginContext )args[2]; Protos.DB2LS_QueryLoginRet queryLoginRet = (Protos.DB2LS_QueryLoginRet)message; //如果查询成功 if (queryLoginRet.Result == Protos.Global.Types.ECommon.Success) { gcLoginRet.Result = Protos.LS2GC_AskLoginRet.Types.EResult.Success; //写入redis缓存 if (LS.instance.redisWrapper.IsConnected) { LS.instance.redisWrapper.HashSet("unames", context.id, string.Empty); } context.ukey = queryLoginRet.Ukey; context.channel = queryLoginRet.Channel; context.browser = queryLoginRet.Browser; context.platform = queryLoginRet.Platform; context.unionID = queryLoginRet.UnionID; context.nickname = queryLoginRet.Nickname; context.avatar = queryLoginRet.Avatar; context.gender = ( byte )queryLoginRet.Gender; context.money = queryLoginRet.Money; context.diamoned = queryLoginRet.Diamoned; context.rank = queryLoginRet.Rank; context.exp = queryLoginRet.Exp; context.champions = queryLoginRet.Champions; context.actorID = queryLoginRet.ActorID; HandleLoginSuccess(gcLoginRet, sid, context); } else { Logger.Error($"smart register occurs an error:{queryLoginRet.Result}"); gcLoginRet.Result = Protos.LS2GC_AskLoginRet.Types.EResult.Failed; //通知客户端登陆失败 LS.instance.netSessionMgr.Send(sid, gcLoginRet); LS.instance.netSessionMgr.CloseSession(sid, "login failed"); } }
private ErrorCode BStateReportHandler(NetSessionBase session, Protos.BSInfo BSInfoRecv) { session.logicID = BSInfoRecv.Id; bool hasRecord = CS.instance.lIDToBSInfos.TryGetValue(session.logicID, out BSInfo gsInfo); if (!hasRecord) { gsInfo = new BSInfo(); CS.instance.lIDToBSInfos[session.logicID] = gsInfo; } //更新BS信息 gsInfo.lid = session.logicID; gsInfo.sessionID = session.id; gsInfo.ip = BSInfoRecv.Ip; gsInfo.port = BSInfoRecv.Port; gsInfo.state = (BSInfo.State)BSInfoRecv.State; //Logger.Log( $"report from BS:{gsInfo}" ); return(ErrorCode.Success); }
public ErrorCode OnGc2BsRequestSnapShot(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.GC2BS_RequestSnapshot request = (Protos.GC2BS_RequestSnapshot)message; Protos.BS2GC_RequestSnapshotRet ret = ProtoCreator.R_GC2BS_RequestSnapshot(request.Opts.Pid); BSUser user = BS.instance.userMgr.GetUser(session.id); if (user == null) { ret.Result = Protos.BS2GC_RequestSnapshotRet.Types.EResult.InvalidUser; } else { BS.instance.battleMgr.HandleRequestSnapshot(user.battle, request, ret); } BS.instance.netSessionMgr.Send(session.id, ret); return(ErrorCode.Success); }
/// <summary> /// 玩家请求查询排行榜 /// </summary> public ErrorCode OnGc2CsQueryRanking(NetSessionBase session, IMessage message) { Protos.GC2CS_QueryRanking request = (Protos.GC2CS_QueryRanking)message; ulong gcNID = request.Opts.Transid; CSUser user = CS.instance.userMgr.GetUser(gcNID); if (user != null) { Protos.CS2GC_QueryRankingRet resp = ProtoCreator.R_GC2CS_QueryRanking(request.Opts.Pid); Protos.CS2DB_QueryRanking queryRanking = ProtoCreator.Q_CS2DB_QueryRanking(); queryRanking.SortType = (Protos.CS2DB_QueryRanking.Types.SortType)request.SortType; queryRanking.From = request.From; queryRanking.Count = request.Count; CS.instance.netSessionMgr.Send(SessionType.ServerC2DB, queryRanking, RPCEntry.Pop(OnQueryRankingRet, user, resp)); } return(ErrorCode.Success); }
/// <summary> /// 处理回应 /// </summary> private void OnBattleInfoRet(NetSessionBase session_, Google.Protobuf.IMessage ret, object[] args) { BattleUser[] users = ( BattleUser[] )args[0]; BattleUser[][] tUsers = ( BattleUser[][] )args[1]; string bsIP = ( string )args[2]; int bsPort = ( int )args[3]; uint bsSID = ( uint )args[4]; uint bsLID = ( uint )args[5]; Protos.BS2CS_BattleInfoRet battleInfoRet = (Protos.BS2CS_BattleInfoRet)ret; //检查是否成功创建战场 if (battleInfoRet.Result != Protos.Global.Types.ECommon.Success) { this.NotifyGCEnterBattleFailed(users, Protos.CS2GC_EnterBattle.Types.Result.BattleCreateFailed); return; } Logger.Log($"battle:{battleInfoRet.Bid} created"); CS.instance.battleStaging.OnBattleCreated(bsLID, battleInfoRet.Bid); //把所有玩家移动到战场暂存器里 int count = users.Length; for (int i = 0; i < count; i++) { BattleUser matchUser = users[i]; CSUser user = CS.instance.userMgr.GetUser(matchUser.id); CS.instance.battleStaging.Add(user, bsLID, bsSID, battleInfoRet.Bid); } //广播给玩家 Protos.CS2GC_EnterBattle enterBattle = ProtoCreator.Q_CS2GC_EnterBattle(); enterBattle.Ip = bsIP; enterBattle.Port = bsPort; for (int i = 0; i < count; i++) { BattleUser matchUser = users[i]; CSUser user = CS.instance.userMgr.GetUser(matchUser.id); enterBattle.GcNID = user.ukey | ( ulong )bsLID << 32; user.Send(enterBattle); } }
private static void OnQueryRankingRet(NetSessionBase session, IMessage message, object[] args) { CSUser user = ( CSUser )args[0]; Protos.CS2GC_QueryRankingRet resp = (Protos.CS2GC_QueryRankingRet)args[1]; Protos.DB2CS_QueryRankingRet result = (Protos.DB2CS_QueryRankingRet)message; foreach (Protos.DB2CS_RankingInfo rankingInfoResult in result.RankingInfos) { Protos.CS2GC_RankingInfo rankingInfo = new Protos.CS2GC_RankingInfo(); rankingInfo.Ukey = rankingInfoResult.Ukey; rankingInfo.Name = rankingInfoResult.Name; rankingInfo.Avatar = rankingInfoResult.Avatar; rankingInfo.Gender = rankingInfoResult.Gender; rankingInfo.LastLoginTime = rankingInfoResult.LastLoginTime; rankingInfo.Rank = rankingInfoResult.Rank; rankingInfo.Exp = rankingInfoResult.Exp; resp.RankingInfos.Add(rankingInfo); } user.Send(resp); }
public ErrorCode OnCs2DbBuyChampion(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.CS2DB_BuyChampion request = (Protos.CS2DB_BuyChampion)message; Protos.DB2CS_BuyChampionRet resp = ProtoCreator.R_CS2DB_BuyChampion(request.Opts.Pid); string cids = string.Join('|', request.Cids); string str = $"UPDATE account_user SET money={request.Money},diamoned={request.Diamoned},champions={cids} where id={request.Ukey}"; ErrorCode errorCode = DB.instance.accountDB.SqlExecNonQuery(str, out _, out uint _); switch (errorCode) { case ErrorCode.Success: request.Result = Protos.Global.Types.ECommon.Success; break; default: request.Result = Protos.Global.Types.ECommon.Failed; break; } session.Send(resp); return(ErrorCode.Success); }
/// <summary> /// 玩家请求开始匹配 /// </summary> public ErrorCode OnGc2CsBeginMatch(NetSessionBase session, IMessage message) { Protos.GC2CS_BeginMatch request = (Protos.GC2CS_BeginMatch)message; Protos.CS2GC_BeginMatchRet response = ProtoCreator.R_GC2CS_BeginMatch(request.Opts.Pid); ulong gcNID = request.Opts.Transid; CSUser user = CS.instance.userMgr.GetUser(gcNID); if (user.isInBattle) { response.Result = Protos.CS2GC_BeginMatchRet.Types.EResult.UserInBattle; } else { response.Result = CS.instance.matchMgr.Join(request.Mode, user) ? Protos.CS2GC_BeginMatchRet.Types.EResult.Success : Protos.CS2GC_BeginMatchRet.Types.EResult.Failed; } user.Send(response); return(ErrorCode.Success); }
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); } } }
private void OnCSBattleEndRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args) { Battle battle = ( Battle )args[0]; int count = battle.numChampions; for (int i = 0; i < count; i++) { Champion champion = battle.GetChampionAt(i); if (champion.user.isOnline) { //断开玩家连接 BS.instance.netSessionMgr.CloseSession(champion.user.gcSID, "battle_end"); //玩家下线 BS.instance.userMgr.Offline(champion.user); } //销毁玩家 BS.instance.userMgr.DestroyUser(champion.user); } this._finishBattles.Remove(battle); Logger.Log($"battle:{battle.id} destroied"); POOL.Push(battle); }
/// <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); }