//投票超时处理 public static void RoomVoteOverTime(this MatchRoom matchRoom) { //超时默认结果为同意 matchRoom.VoteDissolveResult.Result = VoteResultType.Consent; //广播投票的消息 matchRoom.BroadcastActorMessage(matchRoom.VoteDissolveResult); //通知游戏服 房间解散 销毁游戏服的房间 游戏服会通知匹配服的 ActorHelp.SendeActor(matchRoom.GameServeRoomActorId, new Actor_RoomDissolve()); }
//玩家投票解散房间 public static void PlayerVoteDissolveRoom(this MatchRoom matchRoom, long userId, bool isConsent) { if (!matchRoom.IsVoteDissolveIn)//不是投票中收到投票消息 不予理会 { return; } VoteInfo voteInfo = new VoteInfo(); voteInfo.UserId = userId; voteInfo.IsConsent = isConsent; matchRoom.VoteDissolveResult.VoteInfos.Add(voteInfo); matchRoom.VoteDissolveResult.Result = VoteResultType.BeingVote; if (!isConsent) { //一个人不同意 直接不解散 matchRoom.VoteDissolveResult.Result = VoteResultType.NoConsent; } else { //检测是否所有人都同意 if (matchRoom.VoteDissolveResult.VoteInfos.Count == matchRoom.PlayerInfoDic.Count) { matchRoom.VoteDissolveResult.Result = VoteResultType.Consent; } } //广播投票的消息 matchRoom.BroadcastActorMessage(matchRoom.VoteDissolveResult); if (matchRoom.VoteDissolveResult.Result != VoteResultType.BeingVote)//如果结论不是投票中 就表示已经投票结束 { if (MatchRoomComponent.Ins.VoteInRooms.Contains(matchRoom)) { MatchRoomComponent.Ins.VoteInRooms.Remove(matchRoom);//把自己房间 从投票超时房间里面移除 } if (matchRoom.VoteDissolveResult.Result == VoteResultType.NoConsent) { //让游戏服的房间开始游戏 ActorHelp.SendeActor(matchRoom.GameServeRoomActorId, new Actor_PauseRoomGame() { IsPause = false }); } else if (matchRoom.VoteDissolveResult.Result == VoteResultType.Consent) { //通知游戏服 房间解散 销毁游戏服的房间 游戏服会通知匹配服的 ActorHelp.SendeActor(matchRoom.GameServeRoomActorId, new Actor_RoomDissolve()); } matchRoom.IsVoteDissolveIn = false; //改变投票状态 matchRoom.VoteDissolveResult = null; //清空投票信息 } }
//玩家上线 public static void PlayerOnLine(this MatchRoom matchRoom, long userId, long sessionActorId) { MatchPlayerInfo playerInfo = matchRoom.GetPlayerInfo(userId); if (playerInfo == null) { Log.Error(matchRoom.RoomId + "房间没有玩家" + userId); } playerInfo.SessionActorId = sessionActorId; playerInfo.User.GetComponent <UserGateActorIdComponent>().ActorId = sessionActorId; playerInfo.User.IsOnLine = true; matchRoom.BroadcastActorMessage(new Actor_UserOnLine() { UserId = userId }); }
//玩家下线 public static void PlayerOffline(this MatchRoom matchRoom, long userId) { for (int i = 0; i < matchRoom.PlayerInfoDic.Count; i++) { if (matchRoom.PlayerInfoDic[i].User.UserId == userId) { matchRoom.PlayerInfoDic[i].User.IsOnLine = false; matchRoom.PlayerInfoDic[i].SessionActorId = 0; matchRoom.PlayerInfoDic[i].User.GetComponent <UserGateActorIdComponent>().ActorId = 0; break; } } matchRoom.BroadcastActorMessage(new Actor_UserOffline() { UserId = userId }); }
//玩家加入房间 public static bool UserJoinRoom(this MatchRoom matchRoom, User user, long sessionActorId) { for (int i = 0; i < matchRoom.RoomConfig.GameNumber; i++) { if (!matchRoom.PlayerInfoDic.ContainsKey(i)) { MatchPlayerInfo matchPlayerInfo = MatchPlayerInfoFactory.Create(user, sessionActorId, i); matchRoom.BroadcastActorMessage(new Actor_OtherJoinRoom() { PlayerInfo = matchPlayerInfo }); //广播其他玩家加入房间信息 matchRoom.PlayerInfoDic[i] = matchPlayerInfo; return(true); } } return(false); }
//玩家退出房间 public static bool UserOutRoom(this MatchRoom matchRoom, long userId) { if (matchRoom.RoomType == RoomType.Match) { return(true);//随机匹配房间无法退出 只能等待游戏结束 回复成功让玩家回到大厅 } //如果正在游戏接发起投票解散房间 if (matchRoom.IsGameBeing) { matchRoom.RommEnterVoteDissolve(userId);//开始投票 return(false); } matchRoom.intData = -1; //如果是房卡 并且还没开始 就退出房间 foreach (var player in matchRoom.PlayerInfoDic) { if (player.Value.User.UserId == userId) { matchRoom.intData = player.Key; matchRoom.PlayerInfoDic.Remove(player.Key); matchRoom.BroadcastActorMessage(new Actor_OtherOutRoom() { UserId = userId }); break; } } //如果是房主退出房间 直接移除房间 if (matchRoom.intData == 0) { Game.Scene.GetComponent <MatchRoomComponent>().RemoveRoom(matchRoom.RoomId); } else if (matchRoom.intData == -1) { Log.Error("退出房间玩家不在房间中"); } return(true); }