LoginHelper.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. namespace ET.Client
  5. {
  6. public static class LoginHelper
  7. {
  8. public static async ETTask<int> Login(string ip, int port, string roomToken)
  9. {
  10. Scene clientScene = ClientSceneManagerComponent.Instance.Get( 1 );
  11. if( clientScene == null )
  12. {
  13. Log.Error( "Not found client scene" );
  14. return ErrorCode.ERR_SystemError;
  15. }
  16. try
  17. {
  18. // 创建一个ETModel层的Session
  19. clientScene.RemoveComponent<RouterAddressComponent>();
  20. clientScene.RemoveComponent<NetClientComponent>();
  21. clientScene.RemoveComponent<SessionComponent>();
  22. // 获取路由跟realmDispatcher地址
  23. var routerAddressComponent = clientScene.AddComponent<RouterAddressComponent, string, int>(ip, port);
  24. await routerAddressComponent.Init();
  25. clientScene.AddComponent<NetClientComponent, AddressFamily, NetworkProtocol>(
  26. routerAddressComponent.RouterManagerIPAddress.AddressFamily,
  27. NetworkProtocol.KCP
  28. );
  29. //如果有多个软路由地址,则通过roomid弄点花样模拟随机获取一个地址
  30. IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(roomToken);
  31. // 登陆验证
  32. R2C_Login r2CLogin;
  33. using (Session session = clientScene.GetComponent<NetClientComponent>().Create(realmAddress))
  34. // using (Session session = await RouterHelper.CreateRouterSession(clientScene, realmAddress))
  35. {
  36. r2CLogin = (R2C_Login)await session.Call(new C2R_Login() );
  37. }
  38. if (r2CLogin.Error != ErrorCode.ERR_Success)
  39. {
  40. Log.Debug($"登陆验证错误...errCode={r2CLogin.Error}");
  41. return r2CLogin.Error;
  42. }
  43. // 创建一个gate Session,并且保存到SessionComponent中
  44. Session gateSession = clientScene.GetComponent<NetClientComponent>().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));
  45. // Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));
  46. // 登陆gate
  47. G2C_LoginGame g2CLoginGate = (G2C_LoginGame)await gateSession.Call(new C2G_LoginGame() { Token = roomToken });
  48. if (g2CLoginGate.Error != ErrorCode.ERR_Success)
  49. {
  50. Log.Debug($"登陆game错误...errCode={g2CLoginGate.Error}");
  51. return g2CLoginGate.Error;
  52. }
  53. // 保存账号信息
  54. gateSession.AddComponent<PingComponent>();
  55. clientScene.AddComponent<SessionComponent>().Session = gateSession;
  56. var player = clientScene.GetComponent<PlayerComponent>();
  57. //player.Token = r2CLogin.Token;
  58. //var player = g2CLoginGate.Players[0];
  59. //TODO:选角进入
  60. //使用简化流程直接进入游戏
  61. var ret = (G2C_BindPlayer)await gateSession.Call(new C2G_BindPlayer() { PlayerId = g2CLoginGate.Player.id });
  62. await EventSystem.Instance.PublishWait(EventType.LoginFinish.Clone(ret.Player));
  63. EnterMapHelper.EnterMapAsync(clientScene, ret.Player, ret.Player.instanceId).Coroutine();
  64. }
  65. catch (Exception e)
  66. {
  67. Log.Error($"登陆出错...{e.Message}");
  68. return ErrorCode.ERR_LoginError;
  69. }
  70. return ErrorCode.ERR_Success;
  71. }
  72. }
  73. }