48 #define FS2NETD_DEFAULT_PORT "12009"
49 #define FS2NETD_DEFAULT_SERVER "fs2netd.game-warden.com"
50 #define FS2NETD_DEFAULT_CHAT_SERVER "fs2netd.game-warden.com"
51 #define FS2NETD_DEFAULT_BANNER_URL "http://fs2netd.game-warden.com/files/banners"
59 static bool PXO_options_loaded =
false;
61 static bool Is_connected =
false;
62 static bool In_process =
false;
63 static bool Logged_in =
false;
64 static bool Duplicate_login_detected =
false;
66 static bool do_full_packet =
true;
68 static int Local_timeout = -1;
69 static int Next_gameserver_update = -1;
70 static int Ping_timestamp = -1;
71 static int Last_activity = -1;
72 static int Login_retry_time = -1;
88 static void fs2netd_reset_state()
94 do_full_packet =
true;
96 Next_gameserver_update = -1;
99 Duplicate_login_detected =
false;
100 Login_retry_time = -1;
105 if (PXO_options_loaded) {
127 ml_printf(
"NOTICE: User override for game/user tracker port not specified, using game_settings.tbl override (%i).",
FS2NetD_port);
134 ml_printf(
"ERROR: game_settings.tbl override for game/user tracker port '%i' must be between %i and %i.",
FS2NetD_port, 1024, USHRT_MAX);
142 if ( (port_tmp < 1024) || (port_tmp > USHRT_MAX) ) {
143 ml_printf(
"NOTICE: The port specified for game/user trackers, '%i', is outside of the required range, %i through %i!", port_tmp, 1024, USHRT_MAX);
165 PXO_options_loaded =
true;
170 return (Is_connected && Logged_in);
175 bool reset_gameserver =
false;
179 reset_gameserver =
true;
184 fs2netd_reset_state();
201 if ( !Is_connected ) {
211 fs2netd_reset_state();
216 static int fs2netd_connect_do()
225 Is_connected =
false;
264 do { rc = fs2netd_connect_do(); }
while (!rc);
284 if (Local_timeout == -1) {
290 ml_string(
"FS2NetD MSG: Login failure due to timeout!");
311 do_full_packet =
false;
322 do_full_packet =
true;
332 if (Local_timeout == -1) {
343 if (do_full_packet) {
349 do_full_packet =
false;
351 if ( rescode != -1 ) {
353 return (rescode + 3);
394 if ( !Is_connected ) {
407 char std_error_str[64];
409 do_full_packet =
true;
422 memset( error_str, 0,
sizeof(error_str) );
423 memset( std_error_str, 0,
sizeof(std_error_str) );
428 ml_string(
"FS2NetD MSG: Login process canceled by user.");
447 ml_printf(
"FS2NetD ERROR: Login %s/%s is invalid!", user, passwd);
449 if (strlen(user) == 0) {
450 strcpy_s(error_str,
"Login failed! No username supplied. Go to options -> multi options and add one");
451 strcpy_s(std_error_str,
"Login failed! No username!");
453 else if (strlen(passwd) == 0) {
454 strcpy_s(error_str,
"Login failed! No password supplied. Go to options -> multi options and add one");
455 strcpy_s(std_error_str,
"Login failed! No password!");
458 strcpy_s(error_str,
"Login failed!");
459 strcpy_s(std_error_str,
"Login failed!");
467 ml_string(
"FS2NetD ERROR: UNKNOWN ERROR when fetching pilot data");
468 strcpy_s(error_str,
"An Unknown Error (probably a timeout) occured when trying to retrieve your pilot data.");
469 strcpy_s(std_error_str,
"Unknown Error (timeout?)");
475 ml_string(
"FS2NetD MSG: Got Pilot data");
481 ml_string(
"FS2NetD MSG: Created New Pilot");
482 strcpy_s(error_str,
"New Pilot has been created.");
483 strcpy_s(std_error_str,
"New Pilot has been created.");
489 ml_string(
"FS2NetD ERROR: Invalid Pilot!");
490 strcpy_s(error_str,
"Invalid pilot name - A serious error has occured, Contact the FS2NetD Administrator!");
491 strcpy_s(std_error_str,
"Invalid pilot name!");
497 ml_string(
"FS2NetD ERROR: Invalid SID!");
498 strcpy_s(error_str,
"Invalid SID - A serious error has occured, Contact the FS2NetD Administrator!");
499 strcpy_s(std_error_str,
"Invalid SID");
504 ml_string(
"FS2NetD ERROR: Unknown return case for GetPlayerData()");
505 strcpy_s(error_str,
"Unknown return case from GetPlayerData(). Contact the FS2NetD Administrator!");
532 static void fs2netd_handle_ping()
534 static int CONN_check = -1;
541 ml_string(
"FS2NetD WARNING: Lost connection to server!");
545 if ( !Is_connected ) {
551 ml_string(
"FS2NetD ERROR: Lost connection to the FS2NetD server!");
555 ml_string(
"FS2NetD MSG: Will attempt an automatic reconnect to server in 5 minutes...");
560 ml_string(
"FS2NetD NOTICE: Connection to server has been reestablished!");
566 if ( (Ping_timestamp == -1) && (
timer_get_seconds() >= (Last_activity + 300)) ) {
571 if (Last_activity < 0) {
583 ml_string(
"FS2NetD WARNING: Unable to validate login!");
587 if ( !Is_connected ) {
593 ml_string(
"FS2NetD ERROR: Lost connection to the FS2NetD server!");
597 ml_string(
"FS2NetD MSG: Will attempt an automatic reconnect to server in 5 minutes...");
602 ml_string(
"FS2NetD NOTICE: Connection to server has been reestablished!");
615 static void fs2netd_handle_messages()
617 int buffer_size = 0, buffer_offset = 0;
625 int read_size =
FS2NetD_GetData(buffer+bytes_read,
sizeof(buffer)-bytes_read);
627 if (read_size <= 0) {
631 bytes_read += read_size;
678 ml_printf(
"FS2NetD WALL received MSG: %s", tbuf);
706 if ( (itemp < 0) || (itemp > USHRT_MAX) ) {
716 ubyte login_status = 0;
720 if (login_status != 1) {
721 ml_printf(
"FS2NetD IDENT: Got invalid login check!");
729 ubyte dupe_status = 0;
733 Duplicate_login_detected = (dupe_status != 0);
747 if (numServers == 0) {
751 for (
int i = 0;
i < numServers;
i++) {
757 ml_printf(
"FS2NetD SLIST: Invalid ip string (%s)!", svr_ip);
801 Login_retry_time = -1;
809 fs2netd_handle_ping();
815 fs2netd_handle_messages();
818 if (Is_connected && !Logged_in) {
862 ml_string(
"FS2NetD sent game server start");
894 ml_string(
"FS2NetD sent game server update");
912 ml_string(
"FS2NetD sent game server disconnect");
925 static uint Chk_mission_crc = 0;
929 if (Local_timeout == -1) {
941 do_full_packet =
false;
954 char popup_string[256];
960 strcpy_s(Chk_mission_name, mission_name);
963 do_full_packet =
true;
967 memset(popup_string, 0,
sizeof(popup_string));
968 sprintf(popup_string,
XSTR(
"Validating mission %s", 1074), mission_name);
1012 static int fs2netd_send_player_do()
1014 if (Local_timeout == -1) {
1026 do_full_packet =
false;
1028 if (rescode != -1) {
1036 static int fs2netd_send_player()
1040 do_full_packet =
true;
1045 do { rc = fs2netd_send_player_do(); }
while (!rc);
1062 static void fs2netd_store_stats_results()
1066 memset(str, 0,
sizeof(str));
1069 ml_string(
XSTR(
"<PXO stats store process complete>", 1001) );
1089 if (Duplicate_login_detected) {
1090 Duplicate_login_detected =
false;
1092 ml_string(
XSTR(
"<Duplicate login detected - stats have been tossed>", 1583) );
1093 fs2netd_store_stats_results();
1100 fs2netd_store_stats_results();
1106 ml_string(
XSTR(
"<Not enough players were present at game start or end, stats will not be saved>", 1048) );
1107 fs2netd_store_stats_results();
1123 fs2netd_store_stats_results();
1127 int spd_ret = fs2netd_send_player();
1131 ml_string(
"<stats have been tossed - server error>");
1140 ml_string(
"<stats have been tossed - pilot error>");
1146 ml_string(
"<stats have been tossed - invalid tracker id>");
1154 fs2netd_store_stats_results();
1159 if (Local_timeout == -1) {
1171 do_full_packet =
false;
1192 do_full_packet =
true;
1205 if ( !FS2NetD_ban_list.empty() ) {
1208 if (banlist_cfg != NULL) {
1210 cfputs( bl->c_str(), banlist_cfg );
1217 FS2NetD_ban_list.clear();
1228 memset(ip_str, 0, 32);
1229 memset(line, 0, 32);
1231 bool retval =
false;
1234 if (banlist_cfg == NULL) {
1240 while ( !
cfeof(banlist_cfg) && !retval ) {
1241 cfgets(line, 32, banlist_cfg);
1243 if ( !
strnicmp(ip_str, line, strlen(line)) ) {
1255 if (Local_timeout == -1) {
1260 if ( FS2NetD_file_list.empty() ) {
1263 do_full_packet =
false;
1272 if ( rc && FS2NetD_file_list.empty() ) {
1285 static char **file_names = NULL;
1295 if (file_names == NULL) {
1297 file_names = (
char**)
vm_malloc_q(
sizeof(
char*) * 1024 );
1299 if (file_names == NULL) {
1304 memset( wild_card, 0,
sizeof(wild_card) );
1316 for (idx = 0; idx <
count; idx++) {
1317 if (file_names[idx] != NULL) {
1319 file_names[
idx] = NULL;
1338 memset( val_text, 0,
sizeof(val_text) );
1339 snprintf( val_text,
sizeof(val_text) - 1,
"Validating: %s", full_name );
1356 if (file_index >= 0) {
1358 if ( !
stricmp(full_name, fr->name) ) {
1359 if (fr->crc32 == checksum) {
1371 ml_printf(
"FS2NetD Mission Validation: %s => Valid!", full_name);
1373 ml_printf(
"FS2NetD Mission Validation: %s => INVALID! -- 0x%08x", full_name, checksum);
1389 FS2NetD_file_list.clear();
1391 do_full_packet =
true;
1404 FS2NetD_file_list.clear();
1441 if (Local_timeout == -1) {
1447 do_full_packet =
false;
1489 if ( Table_valid_status.empty() ) {
1499 do_full_packet =
true;
1539 ml_printf(
"FS2NetD Table Check: '%s' -- Valid!", tvs->name);
1541 ml_printf(
"FS2NetD Table Check: '%s' -- INVALID (0x%x)!", tvs->name, tvs->crc32);
1559 if ( (tblname == NULL) || !strlen(tblname) ) {
1576 tbl_crc.
crc32 = chksum;
1579 Table_valid_status.push_back( tbl_crc );
1588 if ( (out_plr == NULL) || (callsign == NULL) || !(strlen(callsign)) ) {
1604 ml_printf(
"FS2NetD MSG: Requesting pilot stats for '%s' ...", callsign);
1624 out_plr->
assign(&new_plr);
1640 fs2netd_reset_state();
1641 PXO_options_loaded =
false;
1643 Table_valid_status.clear();
1645 FS2NetD_file_list.clear();
1646 FS2NetD_ban_list.clear();
1655 if ( (chan_name == NULL) || !strlen(chan_name) ) {
1666 char description[512] = { 0 };
1671 if ( Table_valid_status.empty() ) {
1678 out = fopen(full_name,
"wt");
1686 while (*p && (offset <
sizeof(description))) {
1687 if (*p ==
'"' && offset <
sizeof(description)-1) {
1688 description[offset++] =
'"';
1689 description[offset++] =
'"';
1691 description[offset++] = *
p;
1698 fprintf(out,
"filename,CRC32,description\r\n");
1705 while (*p && (offset <
sizeof(filename))) {
1706 if (*p ==
'"' && offset <
sizeof(filename)-1) {
1707 filename[offset++] =
'"';
1708 filename[offset++] =
'"';
1710 filename[offset++] = *
p;
1716 if (offset <
sizeof(filename)) {
1719 filename[
sizeof(
filename)-1] =
'\0';
1722 fprintf(out,
"\"%s\",%u,\"%s\"\r\n", filename, tvs->crc32, description);
int fs2netd_update_valid_tables()
GLenum GLsizei GLenum format
void FS2NetD_Pong(int tstamp)
char pxo_banner_url[MULTI_OPTIONS_STRING_LEN]
#define vm_malloc_q(size)
#define FS_MISSION_FILE_EXT
#define NETGAME_STATE_DEBRIEF
void fs2netd_gameserver_start()
char Multi_fs_tracker_channel[MAX_PATH]
void send_server_query(net_addr *addr)
int cf_delete(const char *filename, int path_type)
Delete the specified file.
int FS2NetD_CheckSingleMission(const char *m_name, uint crc32, bool do_send)
#define PXO_GET_STRING(s)
#define NETINFO_FLAG_MT_CONNECTED
int fs2netd_check_mission_do()
void fs2netd_add_table_validation(const char *tblname)
int FS2NetD_GetBanList(SCP_vector< SCP_string > &mask_list, bool do_send)
char tracker_port[STD_NAME_LEN]
#define PCKT_VALID_SID_REPLY
void FS2NetD_Disconnect()
#define NETGAME_STATE_BRIEFING
#define MVALID_STATUS_INVALID
int FS2NetD_ConnectToServer(const char *host, const char *port)
void std_destroy_gen_dialog()
general failure sound for any event
void ml_string(const char *string, int add_time)
#define FS2NETD_DEFAULT_BANNER_URL
#define PCKT_DUP_LOGIN_REPLY
int multi_get_connection_speed()
#define Assertion(expr, msg,...)
#define PCKT_CHAT_CHAN_COUNT_REPLY
int FS2NetD_CheckValidID()
void fs2netd_gameserver_disconnect()
int fs2netd_get_pilot_info(const char *callsign, player *out_plr, bool first_call)
char title[NAME_LENGTH+1]
char chat_channel[MAX_PATH+1]
int cf_create_default_path_string(char *path, uint path_max, int pathtype, const char *filename, bool localize)
void FS2NetD_GameCountUpdate(const char *chan_name)
void FS2NetD_SendServerDisconnect()
int FS2NetD_GetPlayerData(const char *player_name, player *pl, bool can_create, bool do_send)
int Multi_debrief_stats_accept_code
char std_pxo_password[MULTI_OPTIONS_STRING_LEN]
char callsign[CALLSIGN_LEN+1]
void fs2netd_disconnect()
void assign(const player *pl)
void fs2netd_update_game_count(const char *chan_name)
player Players[MAX_PLAYERS]
void multi_display_chat_msg(const char *msg, int player_index, int add_id)
int fs2netd_get_valid_missions_do()
char Multi_tracker_passwd[MULTI_TRACKER_STRING_LEN+1]
char campaign_name[NAME_LENGTH+1]
int multi_create_lookup_mission(char *fname)
int FS2NetD_GetData(char *buffer, int blen)
void ml_printf(const char *format,...)
int psnet_is_valid_ip_string(char *ip_string, int allow_port)
#define FS2NETD_DEFAULT_CHAT_SERVER
char name[MAX_GAMENAME_LEN+1]
char * cfgets(char *buf, int n, CFILE *cfile)
void fs2netd_reset_connection()
#define DEFAULT_GAME_PORT
#define strnicmp(s1, s2, n)
char mission_name[MAX_GAMENAME_LEN+1]
char game_tracker_ip[MULTI_OPTIONS_STRING_LEN]
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
void std_gen_set_text(char *str, int field_num)
int Multi_num_players_at_start
void FS2NetD_CheckDuplicateLogin()
char Multi_tracker_id_string[255]
#define NETGAME_STATE_MISSION_SYNC
#define FS2NETD_DEFAULT_SERVER
void fs2netd_store_stats()
char mission_name[NAME_LENGTH+1]
bool fs2netd_player_banned(net_addr *addr)
void fs2netd_options_config_init()
void FS2NetD_SendServerStart()
SCP_vector< crc_valid_status > Table_valid_status
#define MULTI_OPTIONS_STRING_LEN
char campaign_name[NAME_LENGTH+1]
char title[NAME_LENGTH+1]
const char * XSTR(const char *str, int index)
#define GM_STANDALONE_SERVER
int cf_chksum_long(const char *filename, uint *chksum, int max_size, int cf_type)
#define MVALID_STATUS_VALID
#define NETGAME_STATE_IN_MISSION
char * cf_add_ext(const char *filename, const char *ext)
SCP_vector< multi_create_info > Multi_create_mission_list
void multi_pxo_channel_count_update(char *name, int count)
int cfputs(const char *str, CFILE *cfile)
bool fs2netd_get_valid_missions()
char name[MAX_GAMENAME_LEN+1]
char user_tracker_ip[MULTI_OPTIONS_STRING_LEN]
char Multi_fs_tracker_filter[MAX_PATH]
void FS2NetD_RequestServerList()
void fs2netd_send_game_request()
int fs2netd_update_valid_tables_do()
int FS2NetD_GetMissionsList(SCP_vector< file_record > &m_list, bool do_send)
char * Cmdline_spew_table_crcs
void FS2NetD_SendServerUpdate()
int FS2NetD_SendPlayerData(const char *player_name, player *pl, bool do_send)
#define MVALID_STATUS_UNKNOWN
void std_create_gen_dialog(char *title)
int fs2netd_update_ban_list_do()
void fs2netd_gameserver_update(bool force)
char pxo_ip[MULTI_OPTIONS_STRING_LEN]
void HUD_printf(const char *format,...)
bool fs2netd_check_mission(char *mission_name)
#define FS2NETD_DEFAULT_PORT
void psnet_string_to_addr(net_addr *address, char *text)
tracker_game_data Multi_tracker_game_data
#define PXO_GET_USHORT(d)
void fs2netd_spew_table_checksums(char *outfile)
#define PCKT_NETOWRK_WALL
void gamesnd_play_iface(int n)
char * psnet_addr_to_string(char *text, net_addr *address)
int cfclose(CFILE *cfile)
char std_pxo_login[MULTI_OPTIONS_STRING_LEN]
GLenum const GLvoid * addr
#define NETGAME_STATE_FORMING
int FS2NetD_ValidateTableList(bool do_send)
int cf_get_file_list(SCP_vector< SCP_string > &list, int pathtype, const char *filter, int sort=CF_SORT_NONE, SCP_vector< file_list_info > *info=NULL)
int timer_get_milliseconds()
char Multi_tracker_login[MULTI_TRACKER_STRING_LEN+1]
multi_global_options Multi_options_g
int FS2NetD_Login(const char *username, const char *password, bool do_send)
void fs2netd_update_ban_list()