using System; using NLog; using NLog.LayoutRenderers; namespace ET { [FriendClass(typeof(SessionStateComponent))] [FriendClass(typeof(SessionPlayerComponent))] [FriendClass(typeof(GateMapComponent))] public class C2G_EnterGameHandler: AMRpcHandler { protected override async ETTask Run(Session session, C2G_EnterGame request, G2C_EnterGame response, Action reply) { Scene domainScene = session.DomainScene(); if (domainScene.SceneType != SceneType.Gate) { Log.Error($"请求的Scene错误,当前场景为:{session.DomainScene().SceneType}"); session.Dispose(); return; } if (session.GetComponent() != null) { response.Error = ErrorCode.ERR_RequestRepeadtedly; reply(); return; } var sessionPlayerComponent = session.GetComponent(); if (null == sessionPlayerComponent) { response.Error = ErrorCode.ERR_SessionPlayerError; reply(); return; } Player player = Game.EventSystem.Get(sessionPlayerComponent.PlayerInstanceId) as Player; if (player == null || player.IsDisposed) { response.Error = ErrorCode.ERR_NonePlayerError; reply(); return; } long instanceId = session.InstanceId; using (session.AddComponent()) { using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.LoginGate, player.AccountId.GetHashCode())) { if (instanceId != session.InstanceId || player.IsDisposed) { response.Error = ErrorCode.ERR_SessionPlayerError; reply(); return; } var sessionStateComp = session.GetComponent(); if (sessionStateComp != null && sessionStateComp.State == SessionState.Game) { response.Error = ErrorCode.ERR_SessionStateError; reply(); return; } if (player.PlayerState == PlayerState.Game) { try { IActorResponse reqEnter = await MessageHelper.CallLocationActor(player.UnitId, new G2M_RequestEnterGameState()); if (reqEnter.Error == ErrorCode.ERR_Success) { reply(); return; } Log.Error("二次登入失败 " + reqEnter.Error + "|" + reqEnter.Message); response.Error = ErrorCode.ERR_ReEnterGameError; await DisconnectHelper.KickPlayer(player, true); reply(); session?.Disconnect().Coroutine(); } catch (Exception e) { Log.Error("二次登入失败 " + e.ToString()); response.Error = ErrorCode.ERR_ReEnterGameError; await DisconnectHelper.KickPlayer(player, true); reply(); session?.Disconnect().Coroutine(); throw; } return; } try { GateMapComponent gateMapComponent = player.AddComponent(); gateMapComponent.Scene = await SceneFactory.Create(gateMapComponent, "GateMap", SceneType.Map); // 从数据库或者缓存中加载出Unit实体及相关组件 Unit unit = await UnitFactory.Create(gateMapComponent.Scene, player.UnitId); //unit.AddComponent(session.InstanceId); // 顶号操作时,session可能发生变化,所以要使用不变的player.InstanceId // 相应的消息分发方法也要有修改,在SessionStreamDispatcherSeverInner.cs的Dispatch方法中 unit.AddComponent(player.InstanceId); long unitId = unit.Id; response.UnitId = unitId; reply(); var index = 2;//RandomHelper.RandomNumber(1, 5); StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), "Game_"+index); Log.Debug("========================================index======{0}","Game_"+index); await TransferHelper.Transfer(unit, startSceneConfig.InstanceId, startSceneConfig.Name); player.UnitId = unitId; SessionStateComponent sessionStateComponent = session.GetComponent(); sessionStateComponent.State = SessionState.Game; player.PlayerState = PlayerState.Game; } catch (Exception e) { Log.Error($"角色进入游戏逻辑服出现问题 账号Id:{player.AccountId} 角色Id:{player.Id} 异常信息:{e.ToString()}"); response.Error = ErrorCode.ERR_EnterGameError; reply(); await DisconnectHelper.KickPlayer(player, true); session.Disconnect().Coroutine(); } } } } } }