using System; namespace ET.Server { [MessageHandler(SceneType.Gate)] public class C2G_LoginGateHandler : MessageHandler { protected override async ETTask Run(Session session, C2G_LoginGate request, G2C_LoginGate response) { Scene root = session.Root(); string account = root.GetComponent().Get(request.Key); if (account == null) { response.Error = ErrorCore.ERR_ConnectGateKeyError; response.Message = "Gate key验证失败!"; return; } session.RemoveComponent(); PlayerComponent playerComponent = root.GetComponent(); Player player = playerComponent.GetByAccount(account); if (player == null) { player = playerComponent.AddChild(account); playerComponent.Add(player); PlayerSessionComponent playerSessionComponent = player.AddComponent(); playerSessionComponent.AddComponent(MailBoxType.GateSession); await playerSessionComponent.AddLocation(LocationType.GateSession); player.AddComponent(MailBoxType.UnOrderedMessage); await player.AddLocation(LocationType.Player); session.AddComponent().Player = player; playerSessionComponent.Session = session; } else { // 判断是否在战斗 PlayerRoomComponent playerRoomComponent = player.GetComponent(); if (playerRoomComponent.RoomActorId != default) { CheckRoom(player, session).Coroutine(); } else { PlayerSessionComponent playerSessionComponent = player.GetComponent(); playerSessionComponent.Session = session; } } response.PlayerId = player.Id; await ETTask.CompletedTask; } private static async ETTask CheckRoom(Player player, Session session) { Fiber fiber = player.Fiber(); await fiber.WaitFrameFinish(); using Room2G_Reconnect room2GateReconnect = await fiber.Root.GetComponent().Call( player.GetComponent().RoomActorId, new G2Room_Reconnect() { PlayerId = player.Id }) as Room2G_Reconnect; G2C_Reconnect g2CReconnect = new() { StartTime = room2GateReconnect.StartTime, Frame = room2GateReconnect.Frame }; g2CReconnect.UnitInfos.AddRange(room2GateReconnect.UnitInfos); session.Send(g2CReconnect); session.AddComponent().Player = player; player.GetComponent().Session = session; } } }