Пример #1
0
        /// <summary>
        /// Retreives information about the players on a Source server
        /// </summary>
        /// <returns>A List of PlayerInfo or throws an SSQLServerException if the server could not be reached</returns>
        public List<PlayerInfo> Players()
        {
            //Create a new list to store the player array
            var players = new List<PlayerInfo>();

            byte[] buf = PerformBigRequest((byte)'U');
            uint i = 0;

            //Make sure the response starts with D
            if (buf[i++] != 'D') return null;

            //Get the amount of players
            byte numPlayers = buf[i++];

            //Loop through each player and extract their stats
            for (int ii = 0; ii < numPlayers; ii++)
            {
                //Create a new player
                PlayerInfo newPlayer = new PlayerInfo();

                //Set the index of the player (Does not work in L4D2, always returns 0)
                newPlayer.Index = buf[i++];

                newPlayer.Name = ReadString(buf, ref i);

                //Get the score and store them in the player info
                newPlayer.Score = ReadInt32(buf, ref i);

                //Get the time connected as a float and store it in the player info
                newPlayer.Time = ReadFloat(buf, ref i);

                //Add the player to the list
                players.Add(newPlayer);
            }

            //Return the list of players
            return players;
        }
Пример #2
0
        /// <summary>
        /// Retreives information about the players on a Source server
        /// </summary>
        /// <param name="ip_end">The IPEndPoint object storing the IP address and port of the server</param>
        /// <returns>An ArrayList of PlayerInfo or throws an SSQLServerException if the server could not be reached</returns>
        public ArrayList Players(IPEndPoint ip_end)
        {
            //Create a new array list to store the player array
            ArrayList players = new ArrayList();

            //Create a new buffer to receive packets
            byte[] buf = null;

            //Create a challenge packet
            byte[] challenge = new byte[9];
            challenge[0] = (byte)0xff;
            challenge[1] = (byte)0xff;
            challenge[2] = (byte)0xff;
            challenge[3] = (byte)0xff;
            challenge[4] = (byte)0x55;
            challenge[5] = (byte)0x00;
            challenge[6] = (byte)0x00;
            challenge[7] = (byte)0x00;
            challenge[8] = (byte)0x00;

            try
            {
                //Attempt to get the challenge response
                buf = SocketUtils.getInfo(ip_end, challenge);
            }
            catch (SSQLServerException e)
            {
                throw e;
            }

            int i = 4;

            //Make sure the response starts with A
            if (buf[i++] != 'A') return null;

            //Create the new request with the challenge number
            byte[] requestPlayer = new byte[9];

            requestPlayer[0] = (byte)0xff;
            requestPlayer[1] = (byte)0xff;
            requestPlayer[2] = (byte)0xff;
            requestPlayer[3] = (byte)0xff;
            requestPlayer[4] = (byte)0x55;
            requestPlayer[5] = buf[i++];
            requestPlayer[6] = buf[i++];
            requestPlayer[7] = buf[i++];
            requestPlayer[8] = buf[i++];

            try
            {
                //Attempt to get the players response
                buf = SocketUtils.getInfo(ip_end, requestPlayer);
            }
            catch (SSQLServerException)
            {
                return null;
            }

            //Start past 0xffffffff
            i = 4;

            //Make sure the response starts with D
            if (buf[i++] != 'D') return null;

            //Get the amount of players
            byte numPlayers = buf[i++];

            //Loop through each player and extract their stats
            for (int ii = 0; ii < numPlayers; ii++)
            {
                //Create a new player
                PlayerInfo newPlayer = new PlayerInfo();

                //Set the index of the player (Does not work in L4D2, always returns 0)
                newPlayer.Index = buf[i++];

                //Create a new player name
                StringBuilder playerName = new StringBuilder();

                //Loop through and store the player's name
                while (buf[i] != 0x00)
                {
                    playerName.Append((char)buf[i++]);
                }

                //Move past the end of the string
                i++;

                newPlayer.Name = playerName.ToString();

                //Get the kills and store them in the player info
                newPlayer.Kills = (int)(buf[i] & 255) | ((buf[i + 1] & 255) << 8) | ((buf[i + 2] & 255) << 16) | ((buf[i + 3] & 255) << 24);

                //Move to the next item
                i += 5;

                //Get the time connected as a float and store it in the player info
                newPlayer.Time = (float)((int)(buf[i] & 255) | ((buf[i + 1] & 255) << 8));

                //Move past the float
                i += 3;

                //Add the player to the list
                players.Add(newPlayer);
            }

            //Return the list of players
            return players;
        }