File: gtrack.h

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (155 lines) | stat: -rw-r--r-- 4,344 bytes parent folder | download
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * Copyright (C) Volition, Inc. 2005.  All rights reserved.
 * 
 * All source code herein is the property of Volition, Inc. You may not sell 
 * or otherwise commercially exploit the source or things you created based on the 
 * source.
 *
*/

#ifndef _gtrack_header
#define _gtrack_header

#ifdef _WIN32
#include <in6addr.h>
#else
#include <netinet/in.h>
#endif

//Game Tracker client code header

#define GAMEPORT	9202

#define MAX_NET_RETRIES 30
#define NET_ACK_TIMEOUT 2500
#define NET_GAME_TIMEOUT 300			//time in seconds

#define MAX_GAME_DATA_SIZE	1500		// NOTE: this is larger than MAX_PACKET_SIZE but
										//       is set here to match server code

#define MAX_GENERIC_GAME_NAME_LEN	32

#define MAX_GAME_LISTS_PER_PACKET	10

#define CHANNEL_LEN	33

#define MAX_FREESPACE_PLAYERS	16
#define MAX_FREESPACE_PLAYER_NAME_LEN	32
#define MAX_FREESPACE_MISSION_NAME_LEN	32
#define MAX_FREESPACE_PLAYERS	16

#define	GNT_SERVER_ACK			0
#define	GNT_CLIENT_ACK			1
#define	GNT_GAMESTARTED		2
#define	GNT_GAMEOVER			3
#define	GNT_GAMEUPDATE			4
#define	GNT_GAMELIST_REQ		5
#define	GNT_GAMELIST_DATA		6
#define	GNT_GAME_COUNT_REQ	7
#define	GNT_GAME_COUNT_DATA	8
#define	GNT_GAMELIST_DATA_NEW	9
#define	GNT_GAME_PROBE_STATUS	10
#define	GNT_GAMEUPDATE_STATUS	11
// NOTE: IDs 12-16 are special for Descent3 and shouldn't be used here!!
#define GNT_NAT_HOLE_PUNCH_REQ	17
#define GNT_NAT_HOLE_PUNCH_ACK	18

#define	GT_FREESPACE			1
#define	GT_DESCENT3				2
#define	GT_TUBERACER			3
#define	GT_FREESPACE2			4
#define GT_FS2OPEN				5
#define	GT_UNUSED				0

#define GAME_HEADER_ONLY_SIZE		(sizeof(game_packet_header)-MAX_GAME_DATA_SIZE)

#pragma pack(push, 1)
	typedef struct {
		unsigned int len;				//Length of entire packet;
		unsigned char game_type;	//1==freespace (GT_FREESPACE), 2==D3, 3==tuberacer, etc.
		short game_id;				// only used for fs2open, otherwise is part of 16-byte junk space
		char junk[14];				// not used but need constant size for compatibility (SOCKADDR_IN	addr); (originally 16-bytes!!)
		int	type;	//Used to specify what to do ie. Add a new net game (GNT_GAMESTARTED), remove a net game (game over), etc.
		unsigned int	sig;	//Unique identifier for client ACKs (The server always fills this in, the client responds)

		char data[MAX_GAME_DATA_SIZE];
	} game_packet_header;
#pragma pack(pop)

typedef struct {
	char	game_name[MAX_GENERIC_GAME_NAME_LEN];
	int	difficulty;
	int	type;			//game type;
	int	state;
	int	max_players;
	int	current_num_players;
	char	mission_name[MAX_FREESPACE_MISSION_NAME_LEN];
	char	channel[CHANNEL_LEN];
	char	pad[3];		// 3-byte padding for size/alignment
} freespace2_net_game_data;

#define pxo_net_game_data freespace2_net_game_data

typedef struct {
	unsigned char game_type;
	char game_name[MAX_GAME_LISTS_PER_PACKET][MAX_GENERIC_GAME_NAME_LEN];
	char pad[3];	// ..needs 3-byte padding here for alignment..
	unsigned int	game_server[MAX_GAME_LISTS_PER_PACKET];
	unsigned short port[MAX_GAME_LISTS_PER_PACKET];
} game_list_ip4;

typedef struct {
	unsigned char game_type;
	char game_name[MAX_GAME_LISTS_PER_PACKET][MAX_GENERIC_GAME_NAME_LEN];
	char pad[3];			// ..needs 3-byte padding here for alignment..
	in6_addr game_server[MAX_GAME_LISTS_PER_PACKET];
	unsigned short port[MAX_GAME_LISTS_PER_PACKET];
} game_list_ip6;

#define game_list game_list_ip6

typedef struct {
	int	rank;								// Try to find opponents with a rank similar to this
	char channel[CHANNEL_LEN];			// only give us games in this channel	
	char pad[3];					// 3-bytes padding for size/alignment
} filter_game_list_struct;

#pragma pack(push, 1)
struct hole_punch_addr {
	uint32_t addr;
	uint16_t port;
};

struct hole_punch_addr_ip6 {
	in6_addr addr;
	uint16_t port;
};
#pragma pack(pop)

//Function prototypes

int InitGameTrackerClient(int gametype);
void IdleGameTracker();
void UpdateGameData(void *buffer);
game_list * GetGameList();
void RequestGameList();
void RequestGameListWithFilter(void *filter);
void RequestGameCountWithFilter(void *filter);

// void SendGameOver();
//Start New 7-9-98
int SendGameOver();
//End New 7-9-98

void StartTrackerGame(void *buffer);

void AckPacket(int sig);

//Definitions
#define MAX_GAME_BUFFERS	20					//Thats a lot considering 20 games per game_list struct

#define TRACKER_UPDATE_INTERVAL			240		//300 seconds
#define TRACKER_RESEND_TIME				2000		//2000ms


#endif