File: ptrack.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 (324 lines) | stat: -rw-r--r-- 13,211 bytes parent folder | download | duplicates (2)
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
/*
 * 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 _pilot_track_header
#define _pilot_track_header

#include "stats/scoring.h"					// for medals count

//Pilot tracker client header
#define REGPORT						9243

#define MAX_NET_RETRIES				30
#define NET_ACK_TIMEOUT				2500

#define MAX_PXO_FILENAME_LEN		32

//This is for type 
#define UNT_CONTROL					0
#define UNT_NEW_ID_REQUEST			1
#define UNT_VALIDAT_ID_REQUEST	2
#define UNT_LOOKUP_ID_REQUEST		3
#define UNT_UPDATE_ID_REQUEST		4
#define UNT_MOTD_REQUEST			5
#define UNT_MOTD_RESPONSE			6
#define UNT_PILOT_DATA_READ		7		// Request from the game for pilot info
#define UNT_PILOT_DATA_RESPONSE	8		// Mastertracker's response to a read request (has pilot data in this packet)
#define UNT_PILOT_DATA_WRITE		9		// Request from the server to write a user record
#define UNT_PILOT_WRITE_FAILED	10		// Server didn't update the pilots record for some reason
#define UNT_PILOT_WRITE_SUCCESS	11		// Server updated the pilots record
#define UNT_PILOT_READ_FAILED		12		// Couldn't find the record
#define UNT_LOGIN_AUTH_REQUEST	13		// Request login authentication by login/password only (returns tracker id)
#define UNT_LOGIN_NO_AUTH			14		// Couldn't login this user (code has reason)
#define UNT_LOGIN_AUTHENTICATED	15		// User was authenticated (data has sz string with tracker id)
#define UNT_VALID_FS_MSN_REQ		18		// Client asking if this is a valid mission
#define UNT_VALID_FS_MSN_RSP		19		// Server Response (code has the answer)

#define UNT_PILOT_DATA_READ_NEW	20		// New packet for requesting reads (tracker will get new security field when receiving this)
#define UNT_PILOT_DATA_WRITE_NEW	21		// New packet for requesting writes (tracker will compare security fields if this packet is used)

// 22 through 45 are D3 specific codes
#define UNT_VALID_FS2_MSN_REQ		46		// validated mission request to PXO for FS2
#define UNT_VALID_FS2_MSN_RSP		47		// validated mission response from PXO for FS2

// validate a squad war mission
#define UNT_VALID_SW_MSN_REQ		48		// send info about a squad war mission, wait for tracker response
#define UNT_VALID_SW_MSN_RSP		49		// response from the tracker
#define UNT_SW_RESULT_WRITE		50		// report on a finished squad war mission to the tracker
#define UNT_SW_RESULT_RESPONSE	51		// response on a squad war mission write request

#define UNT_CONTROL_VALIDATION	70		// UNT_CONTROL for validation packets

#define UNT_VALID_MSN_REQ			71		// Client asking if this is a valid mission
#define UNT_VALID_MSN_RSP			72		// Server response (code has the answer)
#define UNT_VALID_TBL_REQ			73		// Client asking if this is a valid table
#define UNT_VALID_TBL_RSP			74		// Server response (code has the answer)

#define UNT_VALID_DATA_REQ			75		// client asking for data validity check
#define UNT_VALID_DATA_RSP			76		// server response


//This is for code
#define CMD_NEW_USER_ACK			1
#define CMD_NEW_USER_NAK			2
#define CMD_VALIDATED_USER_ACK	3
#define CMD_UPDATED_USER_ACK		4
#define CMD_CLIENT_RECEIVED		5
#define CMD_FIND_USER_NAK			6
#define CMD_FIND_USER_ACK			7
#define CMD_UPDATED_USER_NAK		8
#define CMD_VALIDATED_USER_NAK	9
	//Game designators for UNT_PILOT_DATA_REQUEST and UNT_PILOT_DATA_RESPONSE
#define CMD_GAME_FREESPACE			10						
#define CMD_GAME_DESCENT3			11
#define CMD_GAME_FREESPACE2			12
#define CMD_GAME_FS2OPEN			13

//This is for xcode
#define REG_NAK_EMAIL				0								// failed to register the guy because of an invalid email address
#define REG_NAK_LOGIN				1								// failed to register the guy because an existing login exists
#define REG_NAK_ERROR				2								// failed to register because of an error on the tracker
#define REG_NAK_STRINGS				3								// failed to validate because of invalid password/login match
#define REG_NAK_UNKNOWN				4								// failed to validate because the player is unknown
#define REG_NAK_UPDATE_PL			5								// update info failed because login/passwd were not correct
#define REG_NAK_UPDATE_GEN			6								// update info failed in general (tracker problem)
#define REG_NAK_UPDATE_LOG			7								// update failed because login not found
#define REG_ACK_NEW_ID				8								// New id created, just used for return code, not net packets.

#define MAX_UDP_DATA_LENGH			500
#define PACKED_HEADER_ONLY_SIZE	(sizeof(udp_packet_header)-MAX_UDP_DATA_LENGH)
//sizeof(update_id_request)	//The largest packet

#define LOGIN_LEN						33
#define REAL_NAME_LEN				66
#define PASSWORD_LEN					17
#define EMAIL_LEN						100
#define TRACKER_ID_LEN				10
#define PILOT_NAME_LEN				20
#define MATCH_CODE_LEN				34

#define MAX_SQUAD_PLAYERS			4
#define MAX_SQUAD_RESPONSE_LEN	255

// data could be one of the following:

// type == UNT_NEW_ID_REQUEST
// Respond with ACK
typedef struct {
	char first_name[REAL_NAME_LEN];		// Real Name
	char last_name[REAL_NAME_LEN];		// Real Name
	char login[LOGIN_LEN];					// Login id
	char password[PASSWORD_LEN];			// password
	char email[EMAIL_LEN];					// Email Address
	unsigned char showemail;				// 0==don't show 1 == show
	unsigned char showname;					// 0==don't show 1 == show
} new_id_request;


// type == UNT_VALIDAT_ID_REQUEST or UNT_LOOKUP_ID_REQUEST
typedef struct {
	char login[LOGIN_LEN];					// Login id
	char password[PASSWORD_LEN];			// password
	char tracker_id[TRACKER_ID_LEN];		// Tracker ID
} validate_id_request;

// type == UNT_UPDATE_ID_REQUEST
typedef struct {
	char old_login[LOGIN_LEN];				// Login before it's changed.
	char old_password[PASSWORD_LEN];		// Password before it's changed
	char tracker_id[TRACKER_ID_LEN];		// Tracker ID (not sure if we need it for updating, but maybe)
	char first_name[REAL_NAME_LEN];		// Real Name
	char last_name[REAL_NAME_LEN];		// Real Name
	char login[LOGIN_LEN];					// Login id (new)
	char password[PASSWORD_LEN];			// password (new)
	char email[EMAIL_LEN];					// Email Address (new)
	unsigned char showemail;				// 0==don't show 1 == show
	unsigned char showname;					// 0==don't show 1 == show
} update_id_request;

typedef struct {
	char pilot_name[PILOT_NAME_LEN];		// Login id
	char tracker_id[TRACKER_ID_LEN];		// Tracker ID
	char pad[2];							// 2-bytes padding
} pilot_request;

// type == UNT_VALID_SW_MSN_REQ
typedef struct squad_war_request {		
	int squad_plr1[MAX_SQUAD_PLAYERS];	// id #'s for all squad members in the match
	int squad_plr2[MAX_SQUAD_PLAYERS];	// id #'s for all squad memebrs in the match

	ubyte squad_count1;						// # of players present in squad 1
	ubyte squad_count2;						// # of players present in squad 2	

	char match_code[MATCH_CODE_LEN];		// code for the match	

	char mission_filename[MAX_PXO_FILENAME_LEN];		// filename of mission
	int mission_checksum;									// mission checksum
} squad_war_request;

// type == UNT_SW_RESULT_WRITE
typedef struct squad_war_result {
	char match_code[MATCH_CODE_LEN];			// code for the match
	ubyte result;									// result of the match, 0 == tie, 1 == one team won
	ubyte squad_count1;							// # of players in winning squad
	ubyte squad_count2;							// # of players in the losing squad
	char pad[3];							// 3-bytes padding
	int squad_winners[MAX_SQUAD_PLAYERS];	// list of players on the winning team
	int squad_losers[MAX_SQUAD_PLAYERS];	// list of players on the losing team
} squad_war_result;

// type == UNT_VALID_SW_MSN_RSP and UNT_SW_RESULT_RESPONSE
typedef struct squad_war_response {
	char reason[MAX_SQUAD_RESPONSE_LEN];
	unsigned char accepted;
} squad_war_response;

// type == UNT_VALID_DATA_REQ and UNT_VAID_DATA_RSP
enum {
	VDR_TYPE_TABLE		= 0,
	VDR_TYPE_MISSION	= 1,
	VDR_TYPE_SCRIPT		= 2
};

enum {
	VDR_FLAG_IDENT		= 1<<0,		// include mod ident in response
	VDR_FLAG_STATUS		= 1<<1		// include individual file valid status in response
};

struct valid_data_item {
	uint32_t crc;
	SCP_string name;
};

// NOTE: This is packed manually and should not be associated/copied/cast to the data block!!
struct vmt_valid_data_req_struct {
	uint8_t type;
	uint8_t flags;
	uint8_t num_files;

	SCP_vector<valid_data_item> files;
};

// NOTE: This is not used directly but listed here to document the packet
/*
struct vmt_valid_data_rsp_struct {
	uint8_t flags;

	// if VDR_FLAG_IDENT is set
	short game_id;
	SCP_string game_tag;
	SCP_string game_name;

	// if VDR_FLAG_STATUS is set
	uint8_t status_count;
	SCP_vector<uint32_t> status;
};
*/


#pragma pack(push, 1)
	typedef struct {	
		unsigned char type;						// type
		unsigned short len;						//	Length of total packet, including this header
		unsigned int code;						// For control messages
		unsigned short xcode;					// For control/NAK messages and for sigs.
		unsigned int sig;						// To identify unique return ACKs
		unsigned int security;					// Just a random value, we store the last value used in the user record
														// So we don't process the same request twice.		
		unsigned char data[MAX_UDP_DATA_LENGH];
	} udp_packet_header;
#pragma pack(pop)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// GAME SPECIFIC structures


// -----------------------------------------------------------------------------
// FS2 Open
// NOTE: struct is packed when serialized, padding bytes ignored
const unsigned short MAX_FS2OPEN_COUNTS	= 192;
struct vmt_fs2open_struct {
	int tracker_id;
	char pilot_name[PILOT_NAME_LEN];

	int score;
	int rank;
	int assists;
	int kill_count;					// total alltime kills
	int kill_count_ok;				// total valid alltime kills (no friendlies)
	unsigned int p_shots_fired;		// primary weapon
	unsigned int s_shots_fired;		// secondary weapon

	unsigned int p_shots_hit;		// primary
	unsigned int s_shots_hit;		// secondary

	unsigned int p_bonehead_hits;	// hits/kills on the players own team
	unsigned int s_bonehead_hits;
	int bonehead_kills;

	unsigned int missions_flown;	// # of missions flown to completion
	unsigned int flight_time;		// total hours of flight time
	unsigned int last_flown;		// data/time of last mission flown

	int security;
	unsigned int checksum;			// This value needs to be equal to whatever the checksum is once the packet is decoded

	unsigned char virgin_pilot;		// This pilot was just created if TRUE

	char pad;						// IGNORED!!  1-byte padding (alignment)

	unsigned char num_medals;
	unsigned char num_ships;

	unsigned short counts[MAX_FS2OPEN_COUNTS];	// <-- This *must* be last entry!!!!
};
const unsigned short FS2OPEN_BLOCK_SIZE = sizeof(vmt_fs2open_struct) - 1;	// ignore pad byte in size

#define vmt_stats_struct vmt_fs2open_struct
#define STATS_BLOCK_SIZE FS2OPEN_BLOCK_SIZE

//Function prototypes
int InitPilotTrackerClient();
void AckServer(unsigned int sig);

int SendFSPilotData(vmt_stats_struct *fs_pilot);
int GetFSPilotData(vmt_stats_struct *fs_pilot, const char *pilot_name, const char *tracker_id, int update_security);
int SendSWData(squad_war_result *sw_res, squad_war_response *sw_resp);
void PollPTrackNet();

//Definitions
#define STATE_IDLE						0
#define STATE_SENDING_PILOT			1
#define STATE_READING_PILOT			2
#define STATE_RECEIVED_PILOT			3
#define STATE_WROTE_PILOT				4
#define STATE_TIMED_OUT					5
#define STATE_PILOT_NOT_FOUND			6
#define STATE_WRITE_PILOT_FAILED		7

#define PILOT_REQ_TIMEOUT			30000
#define PILOT_REQ_RESEND_TIME		3500


#define PXO_ADD_DATA(d) do { memcpy(data+packet_size, &d, sizeof(d) ); packet_size += sizeof(d); } while (false)
#define PXO_ADD_SHORT(d) do { short swap = INTEL_SHORT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (false)
#define PXO_ADD_USHORT(d) do { ushort swap = INTEL_SHORT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (false)
#define PXO_ADD_INT(d) do { int swap = INTEL_INT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (false)
#define PXO_ADD_UINT(d) do { uint swap = INTEL_INT(d); memcpy(data+packet_size, &swap, sizeof(d) ); packet_size += sizeof(d); } while (false)
#define PXO_ADD_STRING(d, l) do { size_t len = SDL_strlcpy(reinterpret_cast<char *>(data+packet_size), reinterpret_cast<const char *>(d), l-packet_size); packet_size += static_cast<unsigned short>(SDL_min(len+1, static_cast<size_t>(l-packet_size))); } while (0)

#define PXO_GET_DATA(d) do { memcpy(&d, data+offset, sizeof(d) ); offset += sizeof(d); } while(false)
#define PXO_GET_SHORT(d) do { short swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_SHORT(swap); offset += sizeof(d); } while(false)
#define PXO_GET_USHORT(d) do { ushort swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_SHORT(swap); offset += sizeof(d); } while(false)
#define PXO_GET_INT(d) do { int swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_INT(swap); offset += sizeof(d); } while(false)
#define PXO_GET_UINT(d) do { uint swap; memcpy(&swap, data+offset, sizeof(d) ); d = INTEL_INT(swap); offset += sizeof(d); } while(false)
#define PXO_GET_STRING(d) do { size_t len = SDL_strlcpy(d, reinterpret_cast<const char *>(data+offset), SDL_arraysize(d)); offset += static_cast<unsigned short>(SDL_min(len+1, SDL_arraysize(d))); } while(0)

#endif