Переглянути джерело

【bug】解决牌局中一些bug

johnclot69 3 днів тому
батько
коміт
ca110b214b

+ 1 - 0
DotNet/Hotfix/Helper/ProtoHelper.cs

@@ -52,6 +52,7 @@ namespace ET.Server
                 info.OpId = opPlayer?.Id ?? -1;
                 info.OpPos = opPlayer?.Pos ?? -1;
                 info.CurDisCard = hghhComponent.DisCard;
+                info.CurDisCardSex = player.Sex;
             }
             // 本人信息
             info.MyInfo = PlayerInfoToProto(room, player, true);

+ 2 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_HGHHOperationHandler.cs

@@ -69,7 +69,8 @@ namespace ET.Server
                 return;
             }
             
-            if (request.OpType != 5 && (request.Card <= 0 || !HGHHConst.Values.Contains(request.Card)))
+            if ((request.OpType == (int)OperationType.CHI || request.OpType == (int)OperationType.GANG)
+                && (request.Card <= 0 || !HGHHConst.Values.Contains(request.Card)))
             {
                 response.Error = ErrorCode.ERR_OperationError;
                 response.Message = "牌值错误...";

+ 116 - 41
DotNet/Hotfix/Scenes/Game/Room/HGHHComponentSystem.cs

@@ -42,14 +42,7 @@ namespace ET.Server
                 self.Difen = 1;
                 
                 // 初始化牌库
-                for (int i = 0; i < 4; i++)
-                {
-                    foreach (int value in HGHHConst.Values)
-                    {
-                        self.CardList.Add(value);
-                    }
-                    RandomGenerator.Shuffle(self.CardList);
-                }
+                self.InitCardList();
             }
         }
     
@@ -87,7 +80,7 @@ namespace ET.Server
                 {
                     case 0:
                         // 等待状态
-                        Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 房间人数:{room.Players.Count}, 状态:检测是否可开局...");
+                        Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 房间人数:{room.Players.Count}, 当前局数:{self.CurrentRound}, 状态:检测是否可开局...");
                         if (self.CheckReadyStart(room))
                         {
                             self.State = 1;
@@ -110,7 +103,7 @@ namespace ET.Server
                                 self.Start(room);
                                 self.Flag = true;
                                 self.Time = 0;
-                                Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 房间人数:{room.Players.Count}, 状态:开局...VS动画...");
+                                Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 房间人数:{room.Players.Count}, 当前局数:{self.CurrentRound}, 状态:开局...VS动画...");
                             }
                         }
                         else
@@ -172,14 +165,25 @@ namespace ET.Server
                         {
                             self.Flag = true;
                             self.Time = 0;
-                            Log.Debug($"游戏结束: 黄冈晃晃-房间号:{room.RoomId}, 房间人数:{room.Players.Count}");
+                            Log.Debug($"游戏结束: 黄冈晃晃-房间号:{room.RoomId}, 房间人数:{room.Players.Count}, 当前局数:{self.CurrentRound}");
                         }
                         else
                         {
-                            // todo 超时删除房间
-                            if (self.Time >= 60)
+                            // 小于最大局数,切等待状态
+                            if (self.CurrentRound < room.MaxRound)
+                            {
+                                self.ClearRoom();
+                                self.State = 0;
+                                self.Flag = false;
+                                self.Time = 0;
+                            }
+                            else
                             {
-                                room.Dispose();
+                                // todo 超时删除房间
+                                if (self.Time >= 60)
+                                {
+                                    room.Dispose();
+                                }
                             }
                         }
                         break;
@@ -189,6 +193,23 @@ namespace ET.Server
             }
         }
 
+        /// <summary>
+        /// 初始化牌库
+        /// </summary>
+        /// <param name="self"></param>
+        private static void InitCardList(this HGHHComponent self)
+        {
+            // 初始化牌库
+            for (int i = 0; i < 4; i++)
+            {
+                foreach (int value in HGHHConst.Values)
+                {
+                    self.CardList.Add(value);
+                }
+                RandomGenerator.Shuffle(self.CardList);
+            }
+        }
+
         /// <summary>
         /// 检测是否可开始 3秒倒计时开始
         /// </summary>
@@ -288,16 +309,16 @@ namespace ET.Server
             self.CardList.RemoveAt(0);
             // 当前摸的牌
             self.DrawCard = card;
-            drawCardPlayer.Act = new int[5];
             drawCardPlayer.ActInfo.Clear();
             // 吃,碰,杠,胡,过
+            int[] act = new int[5];
             bool hasAct = false;
             // 检测摸牌人动作, 校验摸牌是否胡
             Struct.HuRes huRes = HGHHHelper.CheckHu(drawCardPlayer.RemainCards);
             if (huRes.Type != HGHHConst.HU_DEFAULT)
             {
                 hasAct = true;
-                drawCardPlayer.Act[3] = 1;
+                act[3] = 1;
                 self.CanHuIds.Add(drawCardPlayer.Id);
                 if (!self.OperableList.Contains(drawCardPlayer.Id))
                 {
@@ -306,26 +327,35 @@ namespace ET.Server
             }
             // todo 玩家听牌状态不允许杠
             // 检测摸牌人动作, 校验摸牌是否杠
-            List<Struct.Kezi> gang = HGHHHelper.IsDrawGang(drawCardPlayer);
-            if (gang is { Count: > 0 })
+            List<Struct.Kezi> gangs = HGHHHelper.IsDrawGang(drawCardPlayer);
+            if (gangs is { Count: > 0 })
             {
                 hasAct = true;
-                drawCardPlayer.Act[2] = 1;
-                if (!self.OperableList.Contains(drawCardPlayer.Id))
+                act[2] = 1;
+                foreach (Struct.Kezi kezi in gangs.Where(kezi => kezi is { Card: >= 0 }))
                 {
-                    self.OperableList.Add(drawCardPlayer.Id);
-                }
-                if (!self.CanPgIds.Contains(drawCardPlayer.Id))
-                {
-                    self.CanPgIds.Add(drawCardPlayer.Id);
+                    drawCardPlayer.ActInfo.Add(new Struct.Kezi(kezi.Type, kezi.Card, kezi.PlayerId));
                 }
             }
             // 过牌
-            drawCardPlayer.Act[4] = hasAct? 1 : 0;
+            act[4] = hasAct? 1 : 0;
             if (drawCardPlayer.HuCards.Any(_card => _card > 0 && _card == self.DrawCard))
             {
-                drawCardPlayer.Act[4] = 0;
+                act[4] = 0;
+            }
+            
+            if (act[2] == 1 || act[1] == 1 || act[0] == 1) {
+                // 加入可操作玩家list
+                if (!self.OperableList.Contains(drawCardPlayer.Id)) {
+                    self.OperableList.Add(drawCardPlayer.Id);
+                }
+                // 加入可碰杠玩家集合
+                if (!self.CanPgIds.Contains(drawCardPlayer.Id)) {
+                    self.CanPgIds.Add(drawCardPlayer.Id);
+                }
             }
+            // 设置玩家动作
+            drawCardPlayer.Act = act;
             
             // 设置当前操作玩家
             self.CurrentPlayer = drawCardPlayer;
@@ -338,7 +368,7 @@ namespace ET.Server
             // 推送摸牌广播
             foreach (Player player in room.GetAllPlayers().Values.Where(player => player != null))
             {
-                RoomInfo info = ProtoHelper.RoomToProto(room, player, drawCardPlayer);
+                RoomInfo info = ProtoHelper.RoomToProto(room, player, self.CurrentPlayer);
                 info.Time = 30;
                 MessageHelper.SendToClient(player, new G2C_HGHHDrawCardPush(){info = info});
             }
@@ -555,13 +585,15 @@ namespace ET.Server
                     Player tmpPlayer = room.GetPlayer(id);
                     if (tmpPlayer != null)
                     {
-                        self.CurrentPlayer = self.Players[tmpPlayer.Pos];
+                        // 设置操作玩家
+                        self.CurrentPlayer = tmpPlayer;
+                        // 摸牌
+                        self.Flag = true;
                     }
                 }
                     
                 // 重置时间和流程标记
-                self.Time = 0;
-                self.Flag = false;
+                self.Time = 30;
                     
                 // 给出牌人广播
                 RoomInfo info = ProtoHelper.RoomToProto(room, player, self.CurrentPlayer);
@@ -664,6 +696,7 @@ namespace ET.Server
                 
             // 重置摸牌人
             self.DrawCardPlayer = player;
+            self.CurrentPlayer = player;
             self.PengPlayer = player;
             
             self.OperableList.Clear();
@@ -677,7 +710,7 @@ namespace ET.Server
             // 广播
             foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
             {
-                RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                 info.Time = 30;
                 MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.CHI});
             }
@@ -745,6 +778,7 @@ namespace ET.Server
                 
             // 重置摸牌人
             self.DrawCardPlayer = player;
+            self.CurrentPlayer = player;
             self.PengPlayer = player;
                 
             self.OperableList.Clear();
@@ -758,7 +792,7 @@ namespace ET.Server
             // 广播
             foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
             {
-                RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                 info.Time = 30;
                 MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.PENG});
             }
@@ -940,7 +974,7 @@ namespace ET.Server
                     Player tmpPlayer = room.GetPlayer(self.CanHuIds.First());
                     if (tmpPlayer != null)
                     {
-                        self.CurrentPlayer = self.Players[tmpPlayer.Pos];
+                        self.CurrentPlayer = tmpPlayer;
                     }
 
                     // flag = false;
@@ -950,7 +984,7 @@ namespace ET.Server
             // 广播
             foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
             {
-                RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                 info.Time = 30;
                 MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.GANG});
             }
@@ -969,9 +1003,14 @@ namespace ET.Server
                 Struct.HuRes res = HGHHHelper.CheckHuType(player.KeZi, player.RemainCards, self.DrawCard);
                 if (res.Type != HGHHConst.HU_DEFAULT)
                 {
+                    if (!self.ClickHuIds.Contains(player.Id))
+                    {
+                        self.ClickHuIds.Add(player.Id);
+                    }
+                    // self.ClickHuIds.Remove(player.Id);
                     self.OperableList.Remove(player.Id);
                     self.CanHuIds.Remove(player.Id);
-                    self.ClickHuIds.Remove(player.Id);
+                    
                     // 将摸的牌从手牌中移除
                     player.RemainCards = CardHelper.Remove(player.RemainCards, self.DrawCard);
                     
@@ -980,7 +1019,7 @@ namespace ET.Server
                     // 广播
                     foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
                     {
-                        RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                        RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                         info.Time = 30;
                         MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.HU});
                     }
@@ -1040,7 +1079,7 @@ namespace ET.Server
             // 广播
             foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
             {
-                RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                 info.Time = 30;
                 MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.HU});
             }
@@ -1172,7 +1211,7 @@ namespace ET.Server
                             // 广播过
                             foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
                             {
-                                RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                                RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                                 info.Time = 30;
                                 MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.GUO});
                             }
@@ -1230,7 +1269,7 @@ namespace ET.Server
                             // 广播过
                             foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
                             {
-                                RoomInfo info = ProtoHelper.RoomToProto(room, p, player);
+                                RoomInfo info = ProtoHelper.RoomToProto(room, p, self.CurrentPlayer);
                                 info.Time = 30;
                                 MessageHelper.SendToClient(p, new G2C_HGHHOperationPush(){info = info, OpType = (int)OperationType.GUO});
                             }
@@ -1339,7 +1378,8 @@ namespace ET.Server
                     }
                     break;
                 case (int)HGHHConst.Result.ZIMO:
-                    if (self.ClickHuIds.Count > 0 && self.OperableList.Count <= 0)
+                    if (self.ClickHuIds.Count > 0)
+                    // if (self.ClickHuIds.Count > 0 && self.OperableList.Count <= 0)
                     {
                         Player winPlayer = room.GetAllPlayers()[self.ClickHuIds.First()];
                         if (winPlayer != null)
@@ -1550,5 +1590,40 @@ namespace ET.Server
             }
             Log.Info($"牌局结束...roomId={room.RoomId}");
         }
+
+        /// <summary>
+        /// 清理桌子信息
+        /// </summary>
+        /// <param name="self"></param>
+        private static void ClearRoom(this HGHHComponent self)
+        {
+            foreach (Player player in self.Players)
+            {
+                player.State = 0;
+                player.RemainCards = Array.Empty<int>();
+                player.DisCards = Array.Empty<int>();
+                player.KeZi.Clear();
+                player.Act = new int[5];;
+                player.ActInfo.Clear();
+                player.HuCards.Clear();
+            }
+            Log.Debug($"清理玩家数据...");
+            
+            self.ZhuangPos = 0;
+            self.GangType = -1;
+            self.AdmitDefeatList.Clear();
+            self.CanPgIds.Clear();
+            self.GangHuIds.Clear();
+            self.CanHuIds.Clear();
+            self.OperableList.Clear();
+            self.ClickHuIds.Clear();
+            self.HuResult = -1;
+            self.CardList.Clear();
+            self.UpdateTime = 0;
+            Log.Debug($"清理桌子数据...");
+            
+            // 初始化牌库
+            self.InitCardList();
+        }
     }
 }

+ 2 - 0
DotNet/Hotfix/Scenes/Game/Room/RoomSystem.cs

@@ -17,6 +17,8 @@ namespace ET.Server
                 self.MaxNum = 2;
                 self.Type = 1;
                 self.OwnerId = owner.Id;
+                // todo 暂时8局先测试
+                self.MaxRound = 8;
                 self.CreateTime = TimeHelper.ServerNow();
                 // 添加房间玩家集合
                 self.Players.Add(owner.Id, owner);

+ 2 - 0
DotNet/Model/Scenes/Game/Room/Room.cs

@@ -18,6 +18,8 @@ namespace ET.Server
         public int Type { get; set; }
         /** 房主playerId **/
         public long OwnerId { get; set; }
+        /** 房间最大局数 **/
+        public int MaxRound { get; set; }
         /** 创建时间 **/
         public long CreateTime { get; set; }
     }

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Client/Generate/Message/CommonProto_CS_10001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f98098da3541a834d8e4dd2ca59effa5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: