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")