using System; namespace ET { [FriendClass(typeof(SessionPlayerComponent))] public class L2G_DisconnectGateUnitHandler : AMActorRpcHandler { protected override async ETTask Run(Scene scene, L2G_DisconnectGateUnit request, G2L_DisconnectGateUnit response, Action reply) { long accountId = request.AccountId; using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.LoginGate, accountId.GetHashCode())) { PlayerComponent playerComponent = scene.GetComponent(); Player player = playerComponent.Get(accountId); if (player == null) { reply(); return; } scene.GetComponent().Remove(accountId); Session gateSession = Game.EventSystem.Get(player.SessionInstanceId) as Session; if (gateSession != null && !gateSession.IsDisposed) { var sessionPlayerComp = gateSession.GetComponent(); if (sessionPlayerComp != null) { sessionPlayerComp.IsLoginAgain = true; } gateSession.Send(new A2C_Disconnect() { Error = ErrorCode.ERR_OtherAccountLogin}); gateSession?.Disconnect().Coroutine(); } player.SessionInstanceId = 0; player.AddComponent(); } reply(); } } }