using System; using System.Net; using System.Net.Sockets; namespace ET.Client { public static class LoginHelper { public static async ETTask<int> Login(string ip, int port, string roomToken) { Scene clientScene = ClientSceneManagerComponent.Instance.Get( 1 ); if( clientScene == null ) { Log.Error( "Not found client scene" ); return ErrorCode.ERR_SystemError; } try { // 创建一个ETModel层的Session clientScene.RemoveComponent<RouterAddressComponent>(); clientScene.RemoveComponent<NetClientComponent>(); clientScene.RemoveComponent<SessionComponent>(); // 获取路由跟realmDispatcher地址 var routerAddressComponent = clientScene.AddComponent<RouterAddressComponent, string, int>(ip, port); await routerAddressComponent.Init(); clientScene.AddComponent<NetClientComponent, AddressFamily, NetworkProtocol>( routerAddressComponent.RouterManagerIPAddress.AddressFamily, NetworkProtocol.KCP ); //如果有多个软路由地址,则通过roomid弄点花样模拟随机获取一个地址 IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(roomToken ?? "1"); // 登陆验证 R2C_Login r2CLogin; using (Session session = clientScene.GetComponent<NetClientComponent>().Create(realmAddress)) // using (Session session = await RouterHelper.CreateRouterSession(clientScene, realmAddress)) { r2CLogin = (R2C_Login)await session.Call(new C2R_Login() ); } if (r2CLogin.Error != ErrorCode.ERR_Success) { Log.Error($"登陆验证错误...errCode={r2CLogin.Error}"); return r2CLogin.Error; } // 创建一个gate Session,并且保存到SessionComponent中 Session gateSession = clientScene.GetComponent<NetClientComponent>().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address[0])); // Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address[0])); // 登陆gate G2C_LoginGame g2CLoginGate = (G2C_LoginGame)await gateSession.Call(new C2G_LoginGame() { Token = roomToken ?? "" }); if (g2CLoginGate.Error != ErrorCode.ERR_Success) { Log.Error($"登陆game错误...errCode={g2CLoginGate.Error}"); return g2CLoginGate.Error; } // 保存账号信息 gateSession.AddComponent<PingComponent>(); clientScene.AddComponent<SessionComponent>().Session = gateSession; var player = clientScene.GetComponent<PlayerComponent>(); player.PlayerId = g2CLoginGate.Player.id; var ret = (G2C_BindPlayer)await gateSession.Call(new C2G_BindPlayer() { PlayerId = player.PlayerId }); EnterMapHelper.EnterMapAsync(clientScene, ret.Player, ret.Player.instanceId).Coroutine(); } catch (Exception e) { Log.Error($"登陆出错...{e.Message}"); return ErrorCode.ERR_LoginError; } return ErrorCode.ERR_Success; } } }