示例#1
0
 public SEnterPlayerAckMessage(ulong accountId, string nickname, byte unk1, PlayerGameMode mode, int unk3)
 {
     AccountId      = accountId;
     Unk1           = unk1;
     PlayerGameMode = mode;
     Unk3           = unk3;
     Nickname       = nickname;
 }
示例#2
0
        public void ChangeMode(Player plr, PlayerGameMode mode)
        {
            if (mode == PlayerGameMode.Ignore)
            {
                return;
            }

            if (_players.TryGetValue(plr, out var currenTeamVal))
            {
                if (plr.RoomInfo.HasLoaded)
                {
                    throw new RoomException("Player is playing");
                }

                if (plr.RoomInfo.IsReady)
                {
                    plr.Session.SendAsync(new RoomChangeTeamFailAckMessage(ChangeTeamResult.AlreadyReady));
                    return;
                }

                if (!_teams.TryGetValue(currenTeamVal, out var currentTeam))
                {
                    throw new RoomException($"Player is in a room, but not inside a team");
                }

                switch (mode)
                {
                case PlayerGameMode.Normal:
                    if (currentTeam.NoSpectatorPlayers.Count() >= currentTeam.PlayerLimit)
                    {
                        plr.SendAsync(new RoomChangeTeamFailAckMessage(ChangeTeamResult.Full));
                        return;
                    }

                    break;

                case PlayerGameMode.Spectate:
                    if (currentTeam.Spectators.Count() >= currentTeam.SpectatorLimit)
                    {
                        plr.SendAsync(new RoomChangeTeamFailAckMessage(ChangeTeamResult.Full));
                        return;
                    }

                    break;

                default:
                    throw new RoomException($"Invalid mode {mode}");
                }

                plr.RoomInfo.Mode = mode;
                Broadcast(new RoomPlayModeChangeAckMessage(plr.Account.Id, mode));
            }
            else
            {
                throw new RoomException("Player is not inside this room");
            }
        }
        public void ChangeMode(Player plr, PlayerGameMode mode)
        {
            //using (_sync.Lock())
            {
                //if (plr.Room != Room)
                //throw new RoomException("Player is not inside this room");

                if (plr.RoomInfo.State != PlayerState.Lobby)
                {
                    throw new RoomException("Player is playing");
                }

                if (plr.RoomInfo.Mode == mode)
                {
                    throw new RoomException($"Already in mode {mode}");
                }

                if (plr.RoomInfo.Team == null)
                {
                    throw new RoomException("Player is not in a team");
                }

                if (plr.RoomInfo.IsReady)
                {
                    plr.Session.SendAsync(new RoomChangeTeamFailAckMessage(ChangeTeamResult.AlreadyReady));
                    throw new RoomException("Player is already ready");
                }

                var team = plr.RoomInfo.Team;
                switch (mode)
                {
                case PlayerGameMode.Normal:
                    if (team.Players.Count() >= team.PlayerLimit)
                    {
                        plr.Session.SendAsync(new RoomChangeTeamFailAckMessage(ChangeTeamResult.Full));
                        throw new TeamLimitReachedException();
                    }

                    break;

                case PlayerGameMode.Spectate:
                    if (team.Spectators.Count() >= team.SpectatorLimit)
                    {
                        plr.Session.SendAsync(new RoomChangeTeamFailAckMessage(ChangeTeamResult.Full));
                        throw new TeamLimitReachedException();
                    }

                    break;

                default:
                    throw new RoomException($"Invalid mode {mode}");
                }

                plr.RoomInfo.Mode = mode;
                Broadcast(new RoomPlayModeChangeAckMessage(plr.Account.Id, mode));
            }
        }
示例#4
0
        public TeamChangeModeError ChangeMode(Player plr, PlayerGameMode mode)
        {
            if (plr.Room != Room)
            {
                return(TeamChangeModeError.WrongRoom);
            }

            if (plr.State != PlayerState.Lobby)
            {
                return(TeamChangeModeError.PlayerIsPlaying);
            }

            if (plr.Mode == mode)
            {
                return(TeamChangeModeError.AlreadyInMode);
            }

            if (plr.Team == null)
            {
                return(TeamChangeModeError.NotInTeam);
            }

            if (plr.IsReady)
            {
                return(TeamChangeModeError.PlayerIsReady);
            }

            var team = plr.Team;

            switch (mode)
            {
            case PlayerGameMode.Normal:
                if (team.Players.Count(x => !x.IsInGMMode) >= team.PlayerLimit)
                {
                    return(TeamChangeModeError.Full);
                }

                break;

            case PlayerGameMode.Spectate:
                if (team.Spectators.Count(x => !x.IsInGMMode) >= team.SpectatorLimit)
                {
                    return(TeamChangeModeError.Full);
                }

                break;

            default:
                return(TeamChangeModeError.InvalidMode);
            }

            plr.Mode = mode;
            Broadcast(new SPlayerGameModeChangeAckMessage(plr.Account.Id, mode));
            return(TeamChangeModeError.OK);
        }
示例#5
0
 public SPlayerGameModeChangeAckMessage(ulong accountId, PlayerGameMode mode)
 {
     AccountId = accountId;
     Mode      = mode;
 }
示例#6
0
 public SChangeTeamAckMessage(ulong accountId, Team team, PlayerGameMode mode)
 {
     AccountId = accountId;
     Team      = team;
     Mode      = mode;
 }