function AskForServerInfo(targetIP, challenge)
local bf =
bitbuf.
CreateWriteBuffer(64)
bf:
WriteLong(-1)
bf:
WriteByte(string.byte(
"T"))
bf:
WriteString(
"Source Engine Query")
if challenge
then
bf:
WriteLong(challenge)
end
gameserver.
SendConnectionlessPacket(bf, targetIP)
end
function GetServerInfo(targetIP)
AskForServerInfo(targetIP)
hook.
Add(
"HolyLib:ProcessConnectionlessPacket",
"ProcessResponse",
function(bf, ip)
if ip != targetIP
then return end
local msgHeader =
bf:
ReadByte()
if msgHeader == string.byte(
"A")
then AskForServerInfo(targetIP,
bf:
ReadLong())
return true
end
local a2s_info = {
Header = msgHeader,
Protocol =
bf:
ReadByte(),
Name =
bf:
ReadString(),
Map =
bf:
ReadString(),
Folder =
bf:
ReadString(),
Game =
bf:
ReadString(),
ID =
bf:
ReadShort(),
Players =
bf:
ReadByte(),
MaxPlayers =
bf:
ReadByte(),
Bots =
bf:
ReadByte(),
ServerType =
bf:
ReadByte(),
Environment = string.char(bf:ReadByte()),
Visibility =
bf:
ReadByte(),
VAC =
bf:
ReadByte(),
Version =
bf:
ReadString(),
ExtraDataFlag =
bf:
ReadByte(),
}
if bit.band(a2s_info.ExtraDataFlag, 0x80) != 0
then
a2s_info.Port =
bf:
ReadShort()
end
if bit.band(a2s_info.ExtraDataFlag, 0x10) != 0
then
a2s_info.SteamID =
bf:
ReadLongLong()
end
if bit.band(a2s_info.ExtraDataFlag, 0x40) != 0
then
a2s_info.SourceTVPort =
bf:
ReadShort()
a2s_info.SourceTVName =
bf:
ReadString()
end
if bit.band(a2s_info.ExtraDataFlag, 0x20) != 0
then
a2s_info.Tags =
bf:
ReadString()
end
if bit.band(a2s_info.ExtraDataFlag, 0x01) != 0
then
a2s_info.GameID =
bf:
ReadLongLong()
end
PrintTable(a2s_info)
end)
end
GetServerInfo(
"xxx.xxx.xxx.xxx:27015")