using System; using System.Net; using System.Net.Sockets; namespace ET.Client { public static class LoginHelper { public static async ETTask 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(); clientScene.RemoveComponent(); clientScene.RemoveComponent(); // 获取路由跟realmDispatcher地址 var routerAddressComponent = clientScene.AddComponent(ip, port); await routerAddressComponent.Init(); clientScene.AddComponent( routerAddressComponent.RouterManagerIPAddress.AddressFamily, NetworkProtocol.KCP ); //如果有多个软路由地址,则通过roomid弄点花样模拟随机获取一个地址 IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(roomToken ?? "1"); // 登陆验证 R2C_Login r2CLogin; using (Session session = clientScene.GetComponent().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().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(); clientScene.AddComponent().Session = gateSession; var player = clientScene.GetComponent(); //player.Token = r2CLogin.Token; //var player = g2CLoginGate.Players[0]; //TODO:选角进入 //使用简化流程直接进入游戏 var ret = (G2C_BindPlayer)await gateSession.Call(new C2G_BindPlayer() { PlayerId = g2CLoginGate.Player.id }); //await EventSystem.Instance.PublishWait(EventType.LoginFinish.Clone(ret.Player)); EnterMapHelper.EnterMapAsync(clientScene, ret.Player, ret.Player.instanceId).Coroutine(); } catch (Exception e) { Log.Error($"登陆出错...{e.Message}"); return ErrorCode.ERR_LoginError; } return ErrorCode.ERR_Success; } } }