Regards to all F|A personnel here,
I have come here to ask for your aid in setting up the logistics and implementing a transitional system for the server list issue we will soon be experiencing due to EvenBalance's end of contract. Since EvenBalance hosts the master servers (and thus master server lists generated based on heartbeats), it is imperative for the sustenance of the ET community that we somehow set up a system for maintaining server lists.
Therefore, I propose that anyone having some sort of a connection with EvenBalance ask them to point their DNS A Records for etmaster.evenbalance.com, and the various masterx.evenbalance.com (e.g. master0.evenbalance.com, master1.evenbalance.com) to point at a server in the ET community which will be used for a master server. This will eliminate any and all traffic to their servers while maintaining the server lists and the community.
As to the community server to be used for this service, it must have a system for dealing with the heartbeats and server list requests. I do not have the time to code up a server program for this, but I have done some research into the Q3 engine source, and thus we have a preliminary design for the server program:
The program must build a server list based on the receipt of the following command string in a UDP Datagram on port 27960:
\xff\xff\xff\xffheartbeat EnemyTerritory-1\n
and subsequently send UDP Datagram responses of the following commands:
\xff\xff\xff\xffgetchallenge [challenge value]
\xff\xff\xff\xffgetinfo [challenge value]
Where the challenge value can be of any entropy, but the method used by EvenBalance had a fairly large integer value for the challenge.
Servers must be removed from the list on receipt of the following command:
\xff\xff\xff\xffheartbeat ETFlatline-1\n
This server list will be partitioned into responses to the following command from ET clients:
\xff\xff\xff\xffgetservers [protocol number] full empty
Note that [protocol number] is 82 for ET 2.55, and 84 for 2.60b (you probably already know that).
The response is of the following format:
\xff\xff\xff\xffgetserversResponse\[address list]\EOT
If the number of servers in the server list is more than 112, the server must send multiple responses of 112 servers each (and n % 112 servers in the last response). The [address list] component has addresses surrounded by the control character '\'. The address itself is a concatenation of four bytes of IPv4 address and two bytes of port. Each byte is a segment of the IPv4 address. The two bytes of port actually represent a short integer (C/++ nomenclature), and thus the port.
Thus representing a sample response as ASCII text, it will look like this:
....getserversResponse\>K.%m9\Ju.tm9\E.xjm8\..2.m8\X.z$mL\S.R.m8\X.E.m8\.._.m8\R..%m=\.PETj,\Q..<m;\N.IFi|\[..ym8\z.i3m:\...sm9\z.i3m9\z..tm8\N.JEi.\.(..j.\...Wk.\U.I.m:\B7..m8\Q...m8\...WjT\X.E.m8\...#..\Y...4.\K}.../\..DDm8\U.^.m.\N.*.m8\D...m8\U...mB\.l.Di.\.(E.mb\l=..m8\...xm8\B7..m8\[y..m9\......\>K.;m<\....m;\z.i3m<\.l..j.\EOT
Please do note that the '.' in that are due to those characters not being in the basic ASCII table, and thus not on my keyboard.
An example of decoding one of these addresses in the list:
\>K.%m9\
>K.% = IPv4 address, m9 = port
Convert ASCII char to integer:
IPv4 address = 62.75.224.37
Convert 2 bytes to short integer (0-65535):
Port = 27961
Alright, so that should be an extensive explanation, and you probably didn't need half of it. I hope it helps though!
Oh, and it would definitely help to use a typed language to write the server program, as the byte conversions are very easy with typecasting.
Best regards,
KRYPTOS|Qubenet