Exemple #1
0
        public virtual bool StartGameManually(LobbyUserExtension user)
        {
            var member = GetMember(user);

            if (!Config.EnableManualStart)
            {
                SendChatMessage(member, "You cannot start the game manually", true);
                return(false);
            }

            // If not game maester
            if (GameMaster != member)
            {
                SendChatMessage(member, "You're not the master of this game", true);
                return(false);
            }

            if (State != Packets.Lobbies.LobbyState.Preparations)
            {
                SendChatMessage(member, "Invalid lobby state", true);
                return(false);
            }

            if (IsDestroyed)
            {
                SendChatMessage(member, "Lobby is destroyed", true);
                return(false);
            }

            if (Members.Values.Any(m => !m.IsReady && m != _gameMaster))
            {
                SendChatMessage(member, "Not all players are ready", true);
                return(false);
            }

            if (Members.Count < MinPlayers)
            {
                SendChatMessage(
                    member,
                    string.Format("Not enough players. Need {0} more ", (MinPlayers - Members.Count)),
                    true);
                return(false);
            }

            var lackingTeam = Teams.Values.FirstOrDefault(t => t.MinPlayers > t.PlayerCount);

            if (lackingTeam != null)
            {
                var msg = string.Format("Team {0} does not have enough players", lackingTeam.Name);
                SendChatMessage(member, msg, true);
                return(false);
            }

            return(StartGame());
        }
Exemple #2
0
        public void RemovePlayer(LobbyUserExtension playerExt)
        {
            var username = TryGetUsername(playerExt.Peer);

            LobbyMember member;

            Members.TryGetValue(username, out member);

            // If this player was never in the lobby
            if (member == null)
            {
                return;
            }

            Members.Remove(username);
            MembersByPeerId.Remove(playerExt.Peer.Id);

            if (playerExt.CurrentLobby == this)
            {
                playerExt.CurrentLobby = null;
            }

            // Remove member from it's current team
            if (member.Team != null)
            {
                member.Team.RemoveMember(member);
            }

            // Change the game master
            if (GameMaster == member)
            {
                PickNewGameMaster();
            }


            // Unsubscribe
            playerExt.Peer.Disconnected -= OnPeerDisconnected;
            Unsubscribe(playerExt.Peer);

            // Notify player himself that he's removed
            playerExt.Peer.SendMessage((short)OpCodes.LeftLobby, Id);

            OnPlayerRemoved(member);

            PlayerRemoved?.Invoke(member);
        }
Exemple #3
0
        public virtual bool SetProperty(LobbyUserExtension setter, string key, string value)
        {
            if (!Config.AllowPlayersChangeLobbyProperties)
            {
                return(false);
            }

            if (Config.EnableGameMasters)
            {
                MembersByPeerId.TryGetValue(setter.Peer.Id, out var member);

                if (GameMaster != member)
                {
                    return(false);
                }
            }

            return(SetProperty(key, value));
        }
Exemple #4
0
        public LobbyDataPacket GenerateLobbyData(LobbyUserExtension user)
        {
            var info = new LobbyDataPacket
            {
                LobbyType       = Type ?? "",
                GameMaster      = GameMaster != null ? GameMaster.Username : "",
                LobbyName       = Name,
                LobbyId         = Id,
                LobbyProperties = Properties,
                Players         = Members.Values
                                  .ToDictionary(m => m.Username, GenerateMemberData),
                Teams               = Teams.Values.ToDictionary(t => t.Name, t => t.GenerateData()),
                Controls            = Controls,
                LobbyState          = State,
                MaxPlayers          = MaxPlayers,
                EnableTeamSwitching = Config.EnableTeamSwitching,
                EnableReadySystem   = Config.EnableReadySystem,
                EnableManualStart   = Config.EnableManualStart,
                CurrentUserUsername = TryGetUsername(user.Peer)
            };

            return(info);
        }
Exemple #5
0
 /// <summary>
 /// This will be called before adding a player to lobby.
 /// Override it to add custom checks for bans and etc.
 /// </summary>
 protected virtual bool IsPlayerAllowed(string username, LobbyUserExtension user)
 {
     return(true);
 }
Exemple #6
0
 protected virtual LobbyMember CreateMember(string username, LobbyUserExtension extension)
 {
     return(new LobbyMember(username, extension));
 }
Exemple #7
0
        public LobbyMember GetMember(LobbyUserExtension playerExt)
        {
            MembersByPeerId.TryGetValue(playerExt.Peer.Id, out var member);

            return(member);
        }
Exemple #8
0
        public bool AddPlayer(LobbyUserExtension playerExt, out string error)
        {
            error = null;

            if (playerExt.CurrentLobby != null)
            {
                error = "You're already in a lobby";
                return(false);
            }

            var username = TryGetUsername(playerExt.Peer);

            if (username == null)
            {
                error = "Invalid username";
                return(false);
            }

            if (Members.ContainsKey(username))
            {
                error = "Already in the lobby";
                return(false);
            }

            if (IsDestroyed)
            {
                error = "Lobby is destroyed";
                return(false);
            }

            if (!IsPlayerAllowed(username, playerExt))
            {
                error = "You're not allowed";
                return(false);
            }

            if (Members.Values.Count >= MaxPlayers)
            {
                error = "Lobby is full";
                return(false);
            }

            if (!Config.AllowJoiningWhenGameIsLive && State != Packets.Lobbies.LobbyState.Preparations)
            {
                error = "Game is already in progress";
                return(false);
            }

            // Create an "instance" of the member
            var member = CreateMember(username, playerExt);

            // Add it to a team
            var team = PickTeamForPlayer(member);

            if (team == null)
            {
                error = "Invalid lobby team";
                return(false);
            }

            if (!team.AddMember(member))
            {
                error = "Not allowed to join a team";
                return(false);
            }

            Members[member.Username]           = member;
            MembersByPeerId[playerExt.Peer.Id] = member;

            // Set this lobby as player's current lobby
            playerExt.CurrentLobby = this;

            if (GameMaster == null)
            {
                PickNewGameMaster(false);
            }

            Subscribe(playerExt.Peer);

            playerExt.Peer.Disconnected += OnPeerDisconnected;

            OnPlayerAdded(member);

            if (PlayerAdded != null)
            {
                PlayerAdded.Invoke(member);
            }


            return(true);
        }