Ga naar hoofdinhoud

SA:MP Query-mechanisme

Introductie

Het SA:MP Query-mechanisme verstuurt serverstatistieken en -informatie (naam, ping, taal, online spelers, enz.). Hier staat hoe het werkt en hoe je het zonder de originele client kunt gebruiken.

Queries

Queries zijn pure UDP-pakketten met geserialiseerde data.

In de lagere RakNet-socketlaag worden pakketten die beginnen met 53 41 4D 50 ("SAMP") anders behandeld. Zie de code: View Code

Geserialiseerde data

De payload: "SAMP" + IP-octets + eerste poortbyte* + tweede poortbyte + OPCODE

Zie uitleg over IP-octets/poortbytes: Link.

Byte sizeNaam
4"SAMP"
4IP Octets
1Port & 0xFF
1Port >> 8 & 0xFF
1OPCODE

C-voorbeeld

OPCODE

Identifiers voor verzoektypes:

  • "i" (0x69): Info (players, map, hostname, gamemode, language)
  • "r" (0x72): Rules (instagib, gravity, weather, website URL, ...)
  • "c" (0x63): Client list (namen en scores)
  • "d" (0x64): Detail per player (ping, id, score, naam)
  • "x" (0x78): RCON command (anders dan de rest)
  • "p" (0x70): Ping/latency check met 4 pseudo-random bytes

Response

Elke OPCODE geeft een response terug. De eerste 11 bytes zijn gelijk aan de request-header, daarna volgt de specifieke payload.

Response-tabellen (i, r, c, d, p)

Type i

ByteKeyBreedteOmschrijving
11Password10 of 1 (password ingesteld)
12-13Players2Aantal online spelers
14-15MaxPlayers2Maximum aantal spelers
16-19(strlen)4Lengte van hostname
20 + strlenHostname(strlen)Hostname van de server
21-24(strlen)4Lengte van gamemode
25 + strlenGamemode(strlen)Gamemode
26-29(strlen)4Lengte van language
30 + strlenLanguage(strlen)Taal

Type r

ByteKeyBreedteOmschrijving
11-12RuleCount2Aantal rules
13(strlen)1Lengte van rule-naam
14 + strlenRulename(strlen)Rule-naam
15(strlen)1Lengte van rule-waarde
16 + strlenRuleValue(strlen)Rule-waarde

Herhaal vanaf byte 13 voor elke rule.

Type c

ByteKeyBreedteOmschrijving
11-12PlayerCount2Aantal spelers
13(strlen)1Lengte van nickname
14 + strlenPlayerNick(strlen)Spelernaam
15-18Score4Score

Herhaal vanaf byte 13 per speler.

Type d

ByteKeyBreedteOmschrijving
11-12PlayerCount2Aantal spelers
13PlayerID1Speler-ID (0-255)
14(strlen)1Lengte van nickname
15 + strlenPlayerNick(strlen)Spelernaam
16-19Score4Score
20-23Ping4Ping

Herhaal vanaf byte 13 per speler.

Type p

ByteKeyBreedteOmschrijving
11number 11Eerste pseudo-random byte
12number 21Tweede
13number 31Derde
14number 41Vierde

Codevoorbeeld in C

Er is een kleine C-lib beschikbaar om queries te doen: Repository