protected override void Run(FiveStarRoom fiveStarRoom, Actor_UserRequestReconnectionRoom message) { try { FiveStarPlayer fiveStarPlayer = fiveStarRoom.GetPlayerInfoUserIdIn(message.UserId); if (fiveStarPlayer == null) { Log.Error("请求重连数据" + message.UserId + "不在房间中"); return; } fiveStarPlayer.User.IsOnLine = true; //状态改为在线 fiveStarPlayer.SetCollocation(false); //取消托管 if (fiveStarPlayer.FiveStarRoom.CurrRoomStateType == RoomStateType.ReadyIn) { fiveStarPlayer.Ready(); //如果未准备的状态上线 直接改变状态为准备 } Actor_FiveStar_Reconnection actorFiveStarReconnection = ReconnectionRoomDataFactory.Create(fiveStarRoom, message.UserId); fiveStarPlayer.User.GetComponent <UserGateActorIdComponent>().ActorId = message.UserActorId; fiveStarPlayer.SendGateStartGame(); //通知用户所在的网关服开始游戏 就是把 游戏服的对象id发过去 fiveStarPlayer.SendMessageUser(actorFiveStarReconnection); //发送重连数据 //补发最后一条可操作消息 if (fiveStarRoom.EndCanOperateAndCanChuMessage != null) { fiveStarPlayer.SendMessageUser(fiveStarRoom.EndCanOperateAndCanChuMessage); } ReconnectionRoomDataFactory.Dispose(actorFiveStarReconnection); } catch (Exception e) { Log.Error(e); throw; } }
//托管的默认操作 public static void CollocationAIOperate(this FiveStarPlayer fiveStarPlayer) { if (fiveStarPlayer.FiveStarRoom.CurrRoomStateType == RoomStateType.GameIn) { fiveStarPlayer.boolData = true; if (fiveStarPlayer.FiveStarRoom.IsDaPiaoBeing && (!fiveStarPlayer.IsAlreadyDaPiao)) //如果在打漂中 并且自己没有打漂就打漂 { if (fiveStarPlayer.IsAI) //如果是AI就随便漂 { fiveStarPlayer.DaPiao( RandomTool.Random(0, fiveStarPlayer.FiveStarRoom.RoomConfig.MaxPiaoNum + 1)); //随机打漂 } else { fiveStarPlayer.DaPiao(0); //默认是不漂 } } else if (fiveStarPlayer.IsCanPlayCard) //如果可以出牌 直接出 最后摸到的牌 { if (fiveStarPlayer.IsAI) //如果是AI出牌 保留手牌中有多张相同的 { fiveStarPlayer.Hands.Sort(); //手牌排序 fiveStarPlayer.intData = fiveStarPlayer.Hands.IndexOf(fiveStarPlayer.MoEndHand); //获取摸到的牌 首次出现的位置 if (fiveStarPlayer.intData < fiveStarPlayer.Hands.Count - 2 && fiveStarPlayer.Hands[fiveStarPlayer.intData + 1] == fiveStarPlayer.MoEndHand) { fiveStarPlayer.AICollcationPlayCard(fiveStarPlayer.Hands[fiveStarPlayer.Hands.Count - 1]); //摸到的牌有相同的 出牌组里最后一张牌 } else { fiveStarPlayer.AICollcationPlayCard(fiveStarPlayer.MoEndHand); //没有相同的出摸到的牌 } } else { fiveStarPlayer.AICollcationPlayCard(fiveStarPlayer.MoEndHand); //不是AI出牌直接出 最后摸到的牌 } } else if (fiveStarPlayer.FiveStarRoom.CanOperatePlayerIndex.Contains(fiveStarPlayer.SeatIndex) ) //如果玩家可操作索引列表里面有自己 则直接操作 { FiveStarOperateInfo fiveStarOperateInfo; if (fiveStarPlayer.canOperateLists.Contains(FiveStarOperateType.FangChongHu)) //如果可以胡 就胡 { fiveStarOperateInfo = FiveStarOperateInfoFactory.Create(0, FiveStarOperateType.FangChongHu, 0); } else { fiveStarOperateInfo = FiveStarOperateInfoFactory.Create(0, FiveStarOperateType.None, 0); //不能胡就放弃 } if (fiveStarPlayer.IsAI) //如果是AI 就是能碰就碰 能杠就杠 因为发的牌会做特殊手脚 { if (fiveStarPlayer.canOperateLists.Contains(FiveStarOperateType.Peng)) //如果可以胡 就胡 { fiveStarOperateInfo.OperateType = FiveStarOperateType.Peng; } else if (fiveStarPlayer.canOperateLists.Contains(FiveStarOperateType.MingGang)) { //杠牌 不仅需要传递 操作类型 还是传杠那张牌 之前记录亮了 foreach (var canGang in fiveStarPlayer.canGangCards) { fiveStarOperateInfo.Card = canGang.Key; fiveStarOperateInfo.OperateType = canGang.Value; } } } fiveStarPlayer.OperatePengGangHu(fiveStarOperateInfo); //执行操作 //不能销毁 fiveStarPlayer 因为多人操作会保留一段时间 } else { fiveStarPlayer.boolData = false; } if (fiveStarPlayer.boolData) { fiveStarPlayer.SetCollocation(true); //如果进行了 托管操作 就进入托管 } } }