From 47091a3d5efe767ada657b3a0feb4b68c88e8058 Mon Sep 17 00:00:00 2001 From: zicodxx <> Date: Tue, 29 Jun 2010 20:51:38 +0000 Subject: [PATCH] Improved handling of multi level sync and exit smoothly back to the menus; Fixed another small bug in lite_info broadcasting which was sending full info; By broadcasting full info, host could cripple Netgame so a new security measure is implemented to protect host from letting his game be overwritten from outside --- CHANGELOG.txt | 1 + main/net_ipx.c | 23 +++++++++++------------ main/net_udp.c | 27 ++++++++++++++------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 04fd65c57..7add412eb 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,7 @@ D1X-Rebirth Changelog -------- main/net_ipx.c, main/net_udp.c: Aligned default width for IPX-Netlist menu to fit possible items a bit better; Fixed two small bugs when sending and receiving lite_info in UDP; Allowed broadcast on UDP sockets (for later use) main/menu.c, main/new_udp.c, main/net_udp.h: Added UDP Netlist to join LAN games discovered/announced via broadcast +main/net_ipx.c, main/net_udp.c: Improved handling of multi level sync and exit smoothly back to the menus; Fixed another small bug in lite_info broadcasting which was sending full info; By broadcasting full info, host could cripple Netgame so a new security measure is implemented to protect host from letting his game be overwritten from outside 20100627 -------- diff --git a/main/net_ipx.c b/main/net_ipx.c index b1a6cbe4e..50c754e55 100644 --- a/main/net_ipx.c +++ b/main/net_ipx.c @@ -2748,8 +2748,6 @@ net_ipx_send_sync(void) if (NumNetPlayerPositions < MaxNumNetPlayers) { nm_messagebox(TXT_ERROR, 1, TXT_OK, "Not enough start positions\n(need %d got %d)\nNetgame aborted", MaxNumNetPlayers, NumNetPlayerPositions); net_ipx_abort_game(); - if (Game_wind) - window_close(Game_wind); return -1; } @@ -3334,8 +3332,7 @@ int net_ipx_request_poll( newmenu *menu, d_event *event, void *userdata ) return 0; } -void -net_ipx_wait_for_requests(void) +int net_ipx_wait_for_requests(void) { // Wait for other players to load the level before we send the sync int choice, i; @@ -3358,7 +3355,7 @@ menu: // User aborted choice = nm_messagebox(NULL, 3, TXT_YES, TXT_NO, TXT_START_NOWAIT, TXT_QUITTING_NOW); if (choice == 2) - return; + return 0; if (choice != 0) goto menu; @@ -3368,11 +3365,12 @@ menu: if ((Players[i].connected != CONNECT_DISCONNECTED) && (i != Player_num)) net_ipx_dump_player(Netgame.players[i].protocol.ipx.server, Netgame.players[i].protocol.ipx.node, DUMP_ABORTED); - if (Game_wind) - window_close(Game_wind); + return -1; } else if (choice != -2) goto menu; + + return 0; } int @@ -3380,7 +3378,7 @@ net_ipx_level_sync(void) { // Do required syncing between (before) levels - int result; + int result = 0; MySyncPackInitialized = 0; @@ -3392,10 +3390,9 @@ net_ipx_level_sync(void) result = net_ipx_wait_for_sync(); else if (multi_i_am_master()) { - net_ipx_wait_for_requests(); - result = net_ipx_send_sync(); - if (result) - return -1; + result = net_ipx_wait_for_requests(); + if (!result) + result = net_ipx_send_sync(); } else result = net_ipx_wait_for_sync(); @@ -3406,6 +3403,8 @@ net_ipx_level_sync(void) net_ipx_send_endlevel_packet(); if (Game_wind) window_close(Game_wind); + show_menus(); + return -1; } return(0); } diff --git a/main/net_udp.c b/main/net_udp.c index 660f05acc..94ca1d947 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -2197,6 +2197,8 @@ void net_udp_process_packet(ubyte *data, struct _sockaddr sender_addr, int lengt break; } case UPID_GAME_INFO: + if (multi_i_am_master()) + break; net_udp_process_game_info(data, length, sender_addr, 0); break; case UPID_GAME_INFO_LITE_REQ: @@ -3104,8 +3106,6 @@ int net_udp_send_sync(void) net_udp_send_game_info(Netgame.players[i].protocol.udp.addr, UPID_GAME_INFO); } net_udp_send_game_info(GBcast, UPID_GAME_INFO_LITE); - if (Game_wind) - window_close(Game_wind); return -1; } @@ -3469,8 +3469,7 @@ int net_udp_request_poll( newmenu *menu, d_event *event, void *userdata ) return 0; } -void -net_udp_wait_for_requests(void) +int net_udp_wait_for_requests(void) { // Wait for other players to load the level before we send the sync int choice, i; @@ -3493,7 +3492,7 @@ menu: // User aborted choice = nm_messagebox(NULL, 3, TXT_YES, TXT_NO, TXT_START_NOWAIT, TXT_QUITTING_NOW); if (choice == 2) - return; + return 0; if (choice != 0) goto menu; @@ -3503,11 +3502,12 @@ menu: if ((Players[i].connected != CONNECT_DISCONNECTED) && (i != Player_num)) net_udp_dump_player(Netgame.players[i].protocol.udp.addr, DUMP_ABORTED); - if (Game_wind) - window_close(Game_wind); + return -1; } else if (choice != -2) goto menu; + + return 0; } int @@ -3515,7 +3515,7 @@ net_udp_level_sync(void) { // Do required syncing between (before) levels - int result; + int result = 0; memset(&UDP_MData, 0, sizeof(UDP_mdata_info)); net_udp_noloss_init_mdata_queue(); @@ -3528,10 +3528,9 @@ net_udp_level_sync(void) result = net_udp_wait_for_sync(); else if (multi_i_am_master()) { - net_udp_wait_for_requests(); - result = net_udp_send_sync(); - if (result) - return -1; + result = net_udp_wait_for_requests(); + if (!result) + result = net_udp_send_sync(); } else result = net_udp_wait_for_sync(); @@ -3542,6 +3541,8 @@ net_udp_level_sync(void) net_udp_send_endlevel_packet(); if (Game_wind) window_close(Game_wind); + show_menus(); + return -1; } return(0); } @@ -3778,7 +3779,7 @@ void net_udp_do_frame(int force, int listen) if (time>=last_bcast_time+(F1_0*10) || (time < last_bcast_time)) { last_bcast_time = time; - net_udp_send_game_info(GBcast, UPID_GAME_INFO); + net_udp_send_game_info(GBcast, UPID_GAME_INFO_LITE); } if (listen)