speedy Posted July 1, 2021 Share Posted July 1, 2021 Hey guys, I'm a coding newbie trying to learn JKA code... apologies if the question seems silly but I wanted to know how can I fetch a list of all active servers and server details like how many players are in the server, etc. from outside of the game? For example, if I have a server IP... how do I get the server information from the IP? I was thinking of writing something in TypeScript but like I said I'm a complete newbie so any help is appreciated. Link to comment
NAB622 Posted July 1, 2021 Share Posted July 1, 2021 If you're outside the game, you can send a /getstatus request to each server to get the info. I believe this has to be prefaced by hexadecimal FF first (Not sure on that part, it's been a long time). Alternatively, I run an open source PHP game tracker, feel free to use it. https://pt.dogi.us Link to comment
NAB622 Posted July 1, 2021 Share Posted July 1, 2021 All right, I'm actually on my computer now, so I can give a proper answer. This only applies to getting data from a single game server - if you're looking to get a list of server addresses, that is beyond my knowledge, but I know it isn't hard. I believe JKHub runs a master server you can use for that. Anyhow, for individual server data, here's what ParaTracker does... Make sure you're using UDP for the connection, Q3 servers have no idea what TCP is. When tracking a server, ParaTracker creates a getstatus query with the following code: str_repeat(chr(255),4) . chr(02) . "getstatus\n" Basically, this boils down to: Four chr(255), followed by a single chr(2), the string "getstatus", and a line break. (There are other working methods, but I found that this method gives maximum compatibility across different games. For instance, Nexuiz Classic does not like this method, so I believe you have to remove the chr(2) for it to work). The final string should look like this: ÿÿÿÿgetstatus Send that command to the game server of your choice over UDP. If you are using Javascript/node.js, you will need to wrap the string with Buffer.from() before sending it. If all went well, you will receive a text dump that looks something like this: ÿÿÿÿstatusResponse \version\JAmp: v1.0.1.0 linux-x86_64 Oct 20 2020\v\2.6B1\timelimit\0\sv_privateClients\0\sv_minRate\0\sv_minPing\0\sv_maxclients\16\sv_maxRate\0\sv_maxPing\0\sv_hostname\^1Parabolic ^9[^8ja.dogi.us^9]\sv_fps\60\sv_floodProtectSlow\1\sv_floodProtect\0\sv_autoDemo\0\sv_allowDownload\1\ssf\5F\protocol\26\pmove_overbounce\1\mapname\sithcouncilv2\jp_gripSpeedScale\0.4\jp_cinfo\32\japp_version\JA++, 64 bits, May 30 2019, 78feacf\japp_unlagged\0\gamename\JA+ Mod v2.6 B1\g_weaponDisable\0\g_stepSlideFix\1\g_siegeTeamSwitch\1\g_siegeTeam2\none\g_siegeTeam1\none\g_siegeRespawn\20\g_showDuelHealths\0\g_saberLocking\1\g_privateDuel\1\g_noSpecMove\0\g_needpass\0\g_maxHolocronCarry\3\g_maxForceRank\7\g_jediVmerc\0\g_gametype\0\g_forcePowerDisable\0\g_forceBasedTeams\0\g_duelWeaponDisable\1\g_debugMelee\0\fraglimit\500000\duel_fraglimit\10\dmflags\0\capturelimit\5\bot_minplayers\0\bg_fighterAltControl\0 22 132 "TIPO" 0 0 "^0w^7S^0w^1|^0e^7V^0ilkill^7E^0" 2 0 "^1s^0|^7papa" 0 0 "^0D^7|^0S J^7o^0n^7e^0s" 0 0 "^0one^1.^7conker" 3 0 "^5-^0a^5-^7illumi^5na" 0 0 "^0cK ^7inmojo*" 12 0 "^2KiH^4.^7FeTTe^7" 9 0 "^0w^7S^0w^1|^0l^7a^0ws^1_^769" 1 0 "^1-^0Tv^1-^7doNka" 9 0 "^4iN^3-^7SoD^3!" 8 0 "^0-^7o^2p^7p H^2y^7drO^0-" The first line is four chr(255), followed by a string telling you what the server is sending you (statusResponse). The second line is all the CVars, delimited with backslashes like so: \variable\value After a line break, the player info begins. There is a line break between each player's info, the data is delimited with spaces, and player names are in quotes: score ping team(Only appears if teams are applicable) "name" One other important thing to note, is that Q3 games use ANSI encoding, not ASCII or Unicode. It would be a good idea to convert the data to Unicode if you're putting it on a web page. Good luck! Smoo likes this Link to comment
speedy Posted July 1, 2021 Author Share Posted July 1, 2021 (edited) That is really helpful... thanks! Edit: With the help of Nab622 and CageLight I was able to figure it out. The query has to be sent as a buffer in order to receive server response... I have made a RESTful type Node API server to get server response if anyone is interested (https://github.com/hasham-m-khan/jka-server-status) Edited July 6, 2021 by speedy Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now