using System; using System.Collections.Generic; using System.Linq; namespace ET.Server { /// /// 黄冈晃晃 玩家操作动作吃、碰、杠、胡、过 /// [MessageHandler(SceneType.Game)] public class C2G_HGHHOperationHandler : AMRpcHandler { protected override async ETTask Run(Session session, C2G_HGHHOperation request, G2C_HGHHOperation response, Action reply) { Player player = session.GetComponent().GetMyPlayer(); if (player == null) { response.Error = ErrorCode.ERR_OperationError; response.Message = "玩家不存在或离线..."; reply(); return; } // 玩家是否进入房间 if (player.RoomId <= 0) { response.Error = ErrorCode.ERR_OperationError; response.Message = "玩家不在房间,不可操作..."; reply(); return; } Scene scene = session.DomainScene(); // 房间是否能找到 Room room = scene.GetComponent().Get(player.RoomId); if (room == null) { response.Error = ErrorCode.ERR_OperationError; response.Message = "请求的房间不存在或已解散..."; reply(); return; } // 玩家房间是否已开始 HGHuangHuangComponent hgHuangHuangComponent = room.GetComponent(); if (hgHuangHuangComponent != null && hgHuangHuangComponent.State != 2) { response.Error = ErrorCode.ERR_OperationError; response.Message = "房间不在游戏中,不可操作..."; reply(); return; } // 玩家状态 if (player.State != 2) { response.Error = ErrorCode.ERR_OperationError; response.Message = "玩家不在游戏中,不可操作..."; reply(); return; } if (request.OpType is < 0 or > 5) { response.Error = ErrorCode.ERR_ParameterError; response.Message = "参数错误..."; reply(); return; } if (request.OpType != 5 && (request.Card <= 0 || !HGHHConst.Values.Contains(request.Card))) { response.Error = ErrorCode.ERR_OperationError; response.Message = "牌值错误..."; reply(); return; } // 判断玩家是否可操作 if (!hgHuangHuangComponent.OperableList.Contains(player.Id)) { response.Error = ErrorCode.ERR_OperationError; response.Message = "不可操作..."; reply(); return; } using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.PlayerOperation, player.Id)) { switch (request.OpType) { case (int)OperationType.CHI: hgHuangHuangComponent.Chi(room, player, request.Card); break; case (int)OperationType.PENG: hgHuangHuangComponent.Peng(room, player); break; case (int)OperationType.GANG: hgHuangHuangComponent.Gang(room, player, request.Card); break; case (int)OperationType.HU: hgHuangHuangComponent.Hu(room, player); break; case (int)OperationType.GUO: hgHuangHuangComponent.Guo(room, player); break; } } // 返回 reply(); await ETTask.CompletedTask; } } }