using Fantasy; using Fantasy.Async; using Fantasy.Network; using NB.Chat; using NB.Game; namespace NB.Gate; public static class GateLoginHelper { #region 上线 /// /// 网关通知其他服务器上线 /// /// public static async FTask Online(GateUnit gateUnit) { if (gateUnit == null) { return ErrorCode.ErrArgs; } Session session = gateUnit.Session; if (session == null) { return ErrorCode.ErrArgs; } var gateUnitSessionComponent = session.GetComponent(); if (gateUnitSessionComponent == null) { gateUnitSessionComponent = session.AddComponent(); } var routeComponent = session.GetComponent(); if (routeComponent == null) { routeComponent = session.AddComponent(); } gateUnitSessionComponent.AccountID = gateUnit.AccountID; gateUnitSessionComponent.SessionId = session.RuntimeId; //安排游戏服务器,并通知进入 var (gameRouteId, roleSimpleInfo) = await GameSceneHelper.Online(session.Scene, gateUnit.AccountID, session.RuntimeId); if (gameRouteId <= 0 || roleSimpleInfo == null) { return ErrorCode.OnlineSceneFailed; } Log.Info($"连接游戏服成功,gameRouteId:{gameRouteId}"); routeComponent.AddAddress(RouteType.GameRoute, gameRouteId); gateUnit.GameSceneRouteId = gameRouteId; //安排进入的聊天服 var (chatRouteId, sceneRouteId) = await SocialSceneHelper.Online(session.Scene, roleSimpleInfo, session.RuntimeId); if (chatRouteId <= 0) { return ErrorCode.OnlineSceneFailed; } routeComponent.AddAddress(RouteType.SocialRoute, chatRouteId); gateUnit.ChatSceneRouteId = sceneRouteId; Log.Info($"连接聊天服成功,gameRouteId:{gameRouteId}"); return ErrorCode.Successful; } #endregion #region 下线 /// /// 网关通知其他服务器下线 /// /// /// public static async FTask Offline(GateUnit gateUnit, long sessionId) { //通知服务器下线 Log.Info($"断线的session id={sessionId} ChatSceneRouteId={gateUnit.ChatSceneRouteId}"); await GameSceneHelper.Offline(gateUnit.Scene, gateUnit.AccountID, sessionId); await SocialSceneHelper.Offline(gateUnit.Scene, gateUnit.AccountID, sessionId, gateUnit.ChatSceneRouteId); return ErrorCode.Successful; } #endregion }