LoginHelper.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 ?? "1");
  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.Error($"登陆验证错误...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.Error($"登陆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.PlayerId = g2CLoginGate.Player.id;
  58. var ret = (G2C_BindPlayer)await gateSession.Call(new C2G_BindPlayer() { PlayerId = player.PlayerId });
  59. EnterMapHelper.EnterMapAsync(clientScene, ret.Player, ret.Player.instanceId).Coroutine();
  60. }
  61. catch (Exception e)
  62. {
  63. Log.Error($"登陆出错...{e.Message}");
  64. return ErrorCode.ERR_LoginError;
  65. }
  66. return ErrorCode.ERR_Success;
  67. }
  68. }
  69. }