1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*
* qstat
* by Steve Jankowski
*
* Teeworlds protocol
* Copyright 2008 ? Emiliano Leporati
*
* Licensed under the Artistic License, see LICENSE.txt for license terms
*
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "debug.h"
#include "qstat.h"
#include "packet_manip.h"
char tee_serverinfo[8] = { '\xFF', '\xFF', '\xFF', '\xFF', 'i', 'n', 'f', 'o' };
query_status_t send_tee_request_packet( struct qserver *server )
{
return send_packet( server, server->type->status_packet, server->type->status_len );
}
query_status_t deal_with_tee_packet( struct qserver *server, char *rawpkt, int pktlen )
{
// skip unimplemented ack, crc, etc
char *pkt = rawpkt + 6;
char *tok = NULL, *version = NULL;
int i;
struct player* player;
server->ping_total += time_delta(&packet_recv_time, &server->packet_time1);
if (0 == memcmp( pkt, tee_serverinfo, 8))
{
pkt += 8;
// version
version = strdup(pkt); pkt += strlen(pkt) + 1;
// server name
server->server_name = strdup(pkt); pkt += strlen(pkt) + 1;
// map name
server->map_name = strdup(pkt); pkt += strlen(pkt) + 1;
// game type
switch(atoi(pkt)) {
case 0:
add_rule( server, server->type->game_rule, "dm", NO_FLAGS);
break;
case 1:
add_rule( server, server->type->game_rule, "tdm", NO_FLAGS);
break;
case 2:
add_rule( server, server->type->game_rule, "ctf", NO_FLAGS);
break;
default:
add_rule( server, server->type->game_rule, "unknown", NO_FLAGS);
break;
}
pkt += strlen(pkt) + 1;
pkt += strlen(pkt) + 1;
pkt += strlen(pkt) + 1;
// num players
server->num_players = atoi(pkt); pkt += strlen(pkt) + 1;
// max players
server->max_players = atoi(pkt); pkt += strlen(pkt) + 1;
// players
for(i = 0; i < server->num_players; i++)
{
player = add_player( server, i );
player->name = strdup(pkt); pkt += strlen(pkt) + 1;
player->score = atoi(pkt); pkt += strlen(pkt) + 1;
}
// version reprise
server->protocol_version = 0;
if (NULL == (tok = strtok(version, "."))) return -1;
server->protocol_version |= (atoi(tok) & 0x000F) << 12;
if (NULL == (tok = strtok(NULL, "."))) return -1;
server->protocol_version |= (atoi(tok) & 0x000F) << 8;
if (NULL == (tok = strtok(NULL, "."))) return -1;
server->protocol_version |= (atoi(tok) & 0x00FF);
free(version);
return DONE_FORCE;
}
// unknown packet type
return PKT_ERROR;
}
|