C2G_JoinRoomHandler.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Drawing;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. namespace ET.Server
  6. {
  7. /// <summary>
  8. /// 加入房间
  9. /// </summary>
  10. [MessageHandler(SceneType.Game)]
  11. public class C2G_JoinRoomHandler : AMRpcHandler<C2G_JoinRoom, G2C_JoinRoom>
  12. {
  13. protected override async ETTask Run(Session session, C2G_JoinRoom request, G2C_JoinRoom response, Action reply)
  14. {
  15. Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
  16. if (player == null)
  17. {
  18. response.Error = ErrorCode.ERR_OperationError;
  19. response.Message = "玩家不存在或离线...";
  20. reply();
  21. return;
  22. }
  23. // 判断参数
  24. if (request.RoomId <= 0)
  25. {
  26. response.Error = ErrorCode.ERR_ParameterError;
  27. response.Message = "参数错误,房间号有误...";
  28. reply();
  29. return;
  30. }
  31. // 判断玩家是否在其他房间
  32. if (player.RoomId > 0 && request.RoomId != player.RoomId)
  33. {
  34. response.Error = ErrorCode.ERR_OperationError;
  35. response.Message = "玩家已在房间,不可加入其他房间...";
  36. reply();
  37. return;
  38. }
  39. Scene scene = session.DomainScene();
  40. // 请求的房间是否能找到
  41. Room room = scene.GetComponent<GameRoomComponent>().Get(request.RoomId);
  42. if (room == null)
  43. {
  44. response.Error = ErrorCode.ERR_OperationError;
  45. response.Message = "请求的房间不存在或已解散...";
  46. reply();
  47. return;
  48. }
  49. // todo 玩家是否可以观战,如果可以 下面的判断屏蔽
  50. // 房间人数是否已满
  51. if (room.PlayerIsMax())
  52. {
  53. response.Error = ErrorCode.ERR_OperationError;
  54. response.Message = "房间人数已满,不可进入...";
  55. reply();
  56. return;
  57. }
  58. // 房间状态是否可进入
  59. HGHuangHuangComponent hgHuangHuangComponent = room.GetComponent<HGHuangHuangComponent>();
  60. if (hgHuangHuangComponent != null && hgHuangHuangComponent.State != 0)
  61. {
  62. response.Error = ErrorCode.ERR_OperationError;
  63. response.Message = "房间已开始,不可进入...";
  64. reply();
  65. return;
  66. }
  67. // 是否已经在房间
  68. if (!room.GetAllPlayers().ContainsKey(player.Id))
  69. {
  70. // 加入玩家
  71. room.Add(player);
  72. // 绑定玩家房间
  73. player.RoomId = room.RoomId;
  74. }
  75. // 广播玩家加入房间
  76. foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
  77. {
  78. MessageHelper.SendToClient(p, new G2C_JoinRoomPush(){info = ProtoHelper.RoomToProto(room, p, null)});
  79. }
  80. reply();
  81. await ETTask.CompletedTask;
  82. }
  83. }
  84. }