Exemplo n.º 1
0
 void Players_AfterRemove(object sender, EventfulDictionary <string, Player> .DataChangedEventArgs e)
 {
     if (isHost)
     {
         SyncPlayerList();
     }
     UpdateUI(this, new EventArgs());
 }
Exemplo n.º 2
0
 void Players_AfterAdd(object sender, EventfulDictionary <string, Player> .DataChangedEventArgs e)
 {
     if (isHost)
     {
         if (!Whitelist.Contains(e.key))
         {
             Players.Remove(e.key); // This guy wasn't approved, so don't let him in!
             return;                // The remove event will trigger the other stuff for us
         }
         SyncPlayerList();
         if (CustomMod != null && CustomMod.Length > 0)
         {
             RaiseSendPlayerNotice(this, new SendMessageEventArgs(e.value.Name, GAME_CUSTOMMOD_CHECK + CustomMod));
         }
     }
     UpdateUI(this, new EventArgs());
 }
Exemplo n.º 3
0
        public virtual void ReceivePlayerNotice(string Nickname, string Message)
        {
            if (isHost)
            {
                if (Message.StartsWith(GAME_JOIN_REQUEST)) // A player wants to join the lobby
                {
                    if (Stage != GameStage.Lobby)          // Too late
                    {
                        SendPlayerNotice(this, new SendMessageEventArgs(Nickname, GAME_JOIN_REFUSE_STARTED));
                    }
                    else if (Players.Count >= MaxLobbySize) // Full
                    {
                        SendPlayerNotice(this, new SendMessageEventArgs(Nickname, GAME_JOIN_REFUSE_FULL));
                    }
                    else if (Blacklist.Contains(Nickname)) // KickBanned
                    {
                        SendPlayerNotice(this, new SendMessageEventArgs(Nickname, GAME_JOIN_REFUSE_KICKED));
                    }
                    else if (Bans != null && HostName.StartsWith("[") && (Bans.Contains(Nickname)))
                    {
                        SendPlayerNotice(this, new SendMessageEventArgs(Nickname, GAME_JOIN_REFUSE_BANNED));
                    }
                    else // Can join :D
                    {
                        Whitelist.Add(Nickname);

                        // Append Sync list with player in it

                        StringBuilder OutMsg = new StringBuilder();
                        bool          First  = true;
                        foreach (KeyValuePair <string, Player> Player in Players)
                        {
                            if (First)
                            {
                                First = false;
                            }
                            else
                            {
                                OutMsg.Append("&");
                            }
                            OutMsg.Append(Player.Value.Name);
                            OutMsg.Append(",");
                            OutMsg.Append(((int)(Player.Value.Side)).ToString());
                            OutMsg.Append(",");
                            OutMsg.Append(Player.Value.Ready ? "1" : "0");
                        }
                        // Stick them in it so they don't crap out after connecting
                        OutMsg.Append("&");
                        OutMsg.Append(Nickname);
                        OutMsg.Append(",");
                        OutMsg.Append(PlayerSide.Spectator);
                        OutMsg.Append(",");
                        OutMsg.Append("0");

                        if (SendPlayerNotice != null)
                        {
                            SendPlayerNotice(this, new SendMessageEventArgs(Nickname, GAME_JOIN_ACCEPTED + OutMsg.ToString())); // Invite new player to lobby
                        }


                        //SendChannelNotice(this, new SendMessageEventArgs(Channel, GAME_PLAYER_NEW + Nickname)); // Lets actually do this when they join the channel
                    }
                }
                else if (Message.StartsWith(GAME_SIDE_REQUEST)) // A player wants to change sides
                {
                    Debug.Assert(Enum.IsDefined(typeof(PlayerSide), Message.Substring(GAME_SIDE_REQUEST.Length)), "Player attempting to change to invalid side: " + Message + "\nYou may safely ignore this message, but please report that it happened.");
                    PlayerSide DesiredSide = (PlayerSide)Enum.Parse(typeof(PlayerSide), Message.Substring(GAME_SIDE_REQUEST.Length));

                    if (DesiredSide != PlayerSide.Spectator)
                    {
                        int SideSize = 0;

                        foreach (KeyValuePair <string, Player> Player in Players)
                        {
                            if (Player.Key != Nickname && Player.Value.Side == DesiredSide)
                            {
                                SideSize++;
                            }
                        }

                        if (SideSize > 4 && SendPlayerNotice != null)                                                                                      // Side is full
                        {
                            SendPlayerNotice(this, new SendMessageEventArgs(Nickname, GAME_SIDE_REFUSED_FULL + ((int)Players[Nickname].Side).ToString())); // Tell player to piss off and stay where they are
                            return;
                        }
                    }
                    Players[Nickname].Side = DesiredSide;
                    if (SendChannelNotice != null)
                    {
                        SendChannelNotice(this, new SendMessageEventArgs(Channel, GAME_SIDE_ACCEPTED + Nickname + "&" + DesiredSide.ToString())); // Change player side
                    }
                    if (UpdateUI != null)
                    {
                        UpdateUI(this, new EventArgs());
                    }
                    if (DisplayUserMessage != null)
                    {
                        DisplayUserMessage(this, new SendMessageEventArgs("", Nickname + " changed side to " + DesiredSide.ToString()));
                    }
                    if (HostName == Nickname && GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Changed Side!", true));
                    }
                }
                else if (Message.StartsWith(GAME_SYNC_PLAYERLIST_REQUEST))
                {
                    SyncPlayerList();
                }
            }
            else if (Nickname == HostName)                  // Ensure its coming from the appropriate host
            {
                if (Message.StartsWith(GAME_JOIN_ACCEPTED)) // Ensure the GAME_JOIN_ACCEPTED is from the host for this game instance
                {
                    EventfulDictionary <string, Player> newPlayerList = new EventfulDictionary <string, Player>();
                    string[] PlayersArray = Message.Substring(GAME_JOIN_ACCEPTED.Length).Split('&');
                    foreach (string PlayerData in PlayersArray)
                    {
                        string[] PlayerSettings = PlayerData.Split(',');
                        Player   Dude;
                        if (Players.ContainsKey(PlayerSettings[0]))
                        {
                            Dude = Players[PlayerSettings[0]];
                            newPlayerList.Add(PlayerSettings[0], Dude, false);
                        }
                        else
                        {
                            Dude      = new Player();
                            Dude.Name = PlayerSettings[0];
                            newPlayerList.Add(PlayerSettings[0], Dude, false);
                        }
                        //Debug.Assert(Enum.IsDefined(typeof(PlayerSide), PlayerSettings[1]), "Invalid GAME_SYNC_PLAYERLIST Message from Host: " + Message);
                        Dude.Side  = (PlayerSide)Enum.Parse(typeof(PlayerSide), PlayerSettings[1]);
                        Dude.Ready = (PlayerSettings[2] != "0" ? true : false);
                    }

                    Players = newPlayerList;

                    if (GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Join success!", true));
                        GameEvent(this, new GameEventArgs(GAME_JOIN_ACCEPTED, true));
                    }
                    if (UpdateUI != null)
                    {
                        UpdateUI(this, new EventArgs());
                    }
                    SyncPlayerList();
                }
                else if (Message.StartsWith(GAME_JOIN_REFUSE_FULL))
                {
                    if (GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Join failed - Lobby full", true));
                        GameEvent(this, new GameEventArgs(GAME_JOIN_REFUSE_FULL, true));
                    }
                }
                else if (Message.StartsWith(GAME_JOIN_REFUSE_STARTED))
                {
                    if (GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Join failed - Started", true));
                        GameEvent(this, new GameEventArgs(GAME_JOIN_REFUSE_STARTED, true));
                    }
                }
                else if (Message.StartsWith(GAME_JOIN_REFUSE_KICKED))
                {
                    if (GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Join failed - Kicked", true));
                        GameEvent(this, new GameEventArgs(GAME_JOIN_REFUSE_KICKED, true));
                    }
                }
                else if (Message.StartsWith(GAME_JOIN_REFUSE_BANNED))
                {
                    if (GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Join failed - Banned", true));
                        GameEvent(this, new GameEventArgs(GAME_JOIN_REFUSE_BANNED, true));
                    }
                }
                else if (Message.StartsWith(GAME_SIDE_REFUSED_FULL))
                {
                    Players[MyName].Side = (PlayerSide)Enum.Parse(typeof(PlayerSide), Message.Substring(GAME_SIDE_REFUSED_FULL.Length));
                    if (GameEvent != null)
                    {
                        GameEvent(this, new GameEventArgs("Can't Change Side", true));
                        GameEvent(this, new GameEventArgs(GAME_SIDE_REFUSED_FULL, true));
                    }
                    if (UpdateUI != null)
                    {
                        UpdateUI(this, new EventArgs());
                    }
                }
                else if (Message.StartsWith(GAME_CUSTOMMOD_CHECK))
                {
                    CustomMod = Message.Substring(GAME_CUSTOMMOD_CHECK.Length);
                    Players[MyName].HasMod = Directory.Exists("data\\custom\\" + CustomMod) && Directory.GetFiles("data\\custom\\" + CustomMod).Count() >= 2;
                    RaiseSendChannelNotice(this, new SendMessageEventArgs(Channel, Players[MyName].HasMod ? GAME_CUSTOMMOD_YES : GAME_CUSTOMMOD_NO));
                    RaiseUpdateUI(this, new EventArgs());
                }
            }
        }
Exemplo n.º 4
0
        public virtual void ReceiveChannelNotice(string Channel, string SendingPlayer, string Message)
        {
            if (isHost)
            {
                if (Message.StartsWith(GAME_SYNC_PLAYERLIST_REQUEST))
                {
                    SyncPlayerList();
                }
            }
            else
            {
                if (Message.StartsWith(GAME_SIDE_ACCEPTED) && SendingPlayer == HostName) // Host informing clients that a player is switching sides
                {
                    string[] Args = Message.Substring(GAME_SIDE_ACCEPTED.Length).Split('&');
                    Debug.Assert(Enum.IsDefined(typeof(PlayerSide), Args[1]), "Invalid GAME_SIDE_ACCEPTED Message from Host: " + Message);
                    if (Players.ContainsKey(Args[0]))
                    {
                        Players[Args[0]].Side = (PlayerSide)Enum.Parse(typeof(PlayerSide), Args[1]);
                        if (UpdateUI != null)
                        {
                            UpdateUI(this, new EventArgs());
                        }
                        if (DisplayUserMessage != null)
                        {
                            DisplayUserMessage(this, new SendMessageEventArgs("", Args[0] + " changed side to " + Players[Args[0]].Side.ToString()));
                        }
                        if (MyName == Args[0] && GameEvent != null)
                        {
                            GameEvent(this, new GameEventArgs("Changed Side!", true));
                        }
                    }
                    else
                    {
                        SyncPlayerList();
                    }
                }
                else if (Message.StartsWith(GAME_SYNC_PLAYERLIST) && SendingPlayer == HostName)  // Host syncing list of players and their states
                {
                    EventfulDictionary <string, Player> newPlayerList = new EventfulDictionary <string, Player>();
                    string[] PlayersArray = Message.Substring(GAME_SYNC_PLAYERLIST.Length).Split('&');
                    foreach (string PlayerData in PlayersArray)
                    {
                        string[] PlayerSettings = PlayerData.Split(',');
                        Player   Dude;
                        if (Players.ContainsKey(PlayerSettings[0]))
                        {
                            Dude = Players[PlayerSettings[0]];
                            newPlayerList.Add(PlayerSettings[0], Dude, false);
                        }
                        else
                        {
                            Dude      = new Player();
                            Dude.Name = PlayerSettings[0];
                            newPlayerList.Add(PlayerSettings[0], Dude, false);
                        }
                        //Debug.Assert(Enum.IsDefined(typeof(PlayerSide), PlayerSettings[1]), "Invalid GAME_SYNC_PLAYERLIST Message from Host: " + Message);
                        Dude.Side  = (PlayerSide)Enum.Parse(typeof(PlayerSide), PlayerSettings[1]);
                        Dude.Ready = (PlayerSettings[2] != "0" ? true : false);
                    }
                    Players = newPlayerList;
                    if (UpdateUI != null)
                    {
                        UpdateUI(this, new EventArgs());
                    }
                }
                else if (Message.StartsWith(GAME_PREGAME) && SendingPlayer == HostName)
                {
                    if (Stage == GameStage.Lobby)
                    {
                        ProgressGameStage();
                    }
                }
            }

            if (Message.StartsWith(GAME_CUSTOMMOD_YES))
            {
                Players[SendingPlayer].HasMod = true;
                RaiseUpdateUI(this, new EventArgs());
            }
            else if (Message.StartsWith(GAME_CUSTOMMOD_NO))
            {
                Players[SendingPlayer].HasMod = false;
                RaiseUpdateUI(this, new EventArgs());
            }
        }