C2G_HGHHOperationHandler.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace ET.Server
  5. {
  6. /// <summary>
  7. /// 黄冈晃晃 玩家操作动作吃、碰、杠、胡、过
  8. /// </summary>
  9. [MessageHandler(SceneType.Game)]
  10. public class C2G_HGHHOperationHandler : AMRpcHandler<C2G_HGHHOperation, G2C_HGHHOperation>
  11. {
  12. protected override async ETTask Run(Session session, C2G_HGHHOperation request, G2C_HGHHOperation response, Action reply)
  13. {
  14. Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
  15. if (player == null)
  16. {
  17. response.Error = ErrorCode.ERR_OperationError;
  18. response.Message = "玩家不存在或离线...";
  19. reply();
  20. return;
  21. }
  22. // 玩家是否进入房间
  23. if (player.RoomId <= 0)
  24. {
  25. response.Error = ErrorCode.ERR_OperationError;
  26. response.Message = "玩家不在房间,不可操作...";
  27. reply();
  28. return;
  29. }
  30. Scene scene = session.DomainScene();
  31. // 房间是否能找到
  32. Room room = scene.GetComponent<GameRoomComponent>().Get(player.RoomId);
  33. if (room == null)
  34. {
  35. response.Error = ErrorCode.ERR_OperationError;
  36. response.Message = "请求的房间不存在或已解散...";
  37. reply();
  38. return;
  39. }
  40. // 玩家房间是否已开始
  41. HGHHComponent hghhComponent = room.GetComponent<HGHHComponent>();
  42. if (hghhComponent != null && hghhComponent.State != 2)
  43. {
  44. response.Error = ErrorCode.ERR_OperationError;
  45. response.Message = "房间不在游戏中,不可操作...";
  46. reply();
  47. return;
  48. }
  49. // 玩家状态
  50. if (player.State != 2)
  51. {
  52. response.Error = ErrorCode.ERR_OperationError;
  53. response.Message = "玩家不在游戏中,不可操作...";
  54. reply();
  55. return;
  56. }
  57. if (request.OpType is < 0 or > 5)
  58. {
  59. response.Error = ErrorCode.ERR_ParameterError;
  60. response.Message = "参数错误...";
  61. reply();
  62. return;
  63. }
  64. if ((request.OpType == (int)OperationType.CHI || request.OpType == (int)OperationType.GANG)
  65. && (request.Card <= 0 || !HGHHConst.Values.Contains(request.Card)))
  66. {
  67. response.Error = ErrorCode.ERR_OperationError;
  68. response.Message = "牌值错误...";
  69. reply();
  70. return;
  71. }
  72. // 判断玩家是否可操作
  73. if (!hghhComponent.OperableList.Contains(player.Id))
  74. {
  75. response.Error = ErrorCode.ERR_OperationError;
  76. response.Message = "不可操作...";
  77. reply();
  78. return;
  79. }
  80. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.PlayerOperation, player.Id))
  81. {
  82. switch (request.OpType)
  83. {
  84. case (int)OperationType.CHI:
  85. hghhComponent.Chi(room, player, request.Card);
  86. break;
  87. case (int)OperationType.PENG:
  88. hghhComponent.Peng(room, player);
  89. break;
  90. case (int)OperationType.GANG:
  91. hghhComponent.Gang(room, player, request.Card);
  92. break;
  93. case (int)OperationType.HU:
  94. hghhComponent.Hu(room, player);
  95. break;
  96. case (int)OperationType.GUO:
  97. hghhComponent.Guo(room, player);
  98. break;
  99. }
  100. }
  101. // 返回
  102. reply();
  103. await ETTask.CompletedTask;
  104. }
  105. }
  106. }