Server feed
A list of servers can be obtained by sending a HTTP GET request to http://etqw-ipgetter.demonware.net/ipgetter/
The returned data is a list of IP:Port pairs separated by newlines.
Server query
All strings are terminated with a 0 byte
Integers are least significant byte first
Types:
uint32 = unsigned 32 bit integer
uint16 = unsigned 16 bit integer
byte = unsigned 8 bit integer
float = 32 bit floating point number
The protocol seems to be the same for ETQW 1.4 and 1.5 but other versions used a different protocol.
2 types of request packets
\xff\xffgetInfo\x00 - normal request
\xff\xffgetInfoEx\x00 - extended request, has extra data at the end that is customisable by mods
Can send another 8 bytes at the end of the request that will be echoed by the server (the challenge)
Send one of those to the server and get back this:
\xff\xffinfoResponse\x00 - header, will be \xff\xffinfoExResponse\x00 for getInfoEx
8 bytes - Challenge
uint32 version - 16 upper bits = major, 16 lower bits = minor
Versions:
0x000a0015 - 10.21, used by ETQW 1.5
0x000a0013 - 10.19, used by ETQW 1.4
uint32 size - number of bytes following the header
Following that are pairs of strings containing server info (cvars), terminated by 2 empty strings
Players:
byte slot
uint16 playerPing
string name
byte clanTagPosition - 0 = prefix, 1 = suffix
string clanTag
byte isBot
Slot number 32 means this is the end of the players block
Post-players block
uint32 osMask - Mask of OSes supported by the mod, will have all bits set for an unpure server
byte isRanked
uint32 timeLeft - Milliseconds
byte gameState
GameState byte explained:
bit 0 set = warm-up
bit 1 set = game is on
bit 2 set = post-map review
bit 3 set = loading next map
bit 4 set = game is in second round (for stopwatch)
byte serverType - 0 for regular server, 1 for TV server
For a regular server:
byte interestedClients
For a TV server:
uint32 viewers
uint32 maxViewers
The following is only for getInfoEx and can be changed by mods:
Players:
byte index
float xp
string team - Will be empty for spectators
uint32 kills
uint32 deaths
Terminated by byte 32 like normal players block