/// <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; }
/// <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; }