diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 9d3060063..1c6d68538 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D1X-Rebirth Changelog +20120423 +-------- +main/multi.c, main/multi.h, main/net_udp.c: fixed improper player disconnecting which might have been caused by endlevel packet + 20120418 -------- main/gameseq.c, main/gameseq.h, main/gauges.c, main/multi.c, main/net_udp.c, main/state.c: Removed usage of 'oldmaxnet' variable when switching between coop and other game modes which would not be correctly set when coop mode is loaded from a netgame profile; Removed 'MaxNumNetPlayers' variable as already replaced by Netgame.max_numplayers diff --git a/main/multi.c b/main/multi.c index 94901fec7..7fe30841d 100644 --- a/main/multi.c +++ b/main/multi.c @@ -1791,6 +1791,8 @@ void multi_disconnect_player(int pnum) if (!(Game_mode & GM_NETWORK)) return; + if (Players[pnum].connected == CONNECT_DISCONNECTED) + return; if (Players[pnum].connected == CONNECT_PLAYING) { diff --git a/main/multi.h b/main/multi.h index 7d18e68ef..e9ba8b9f8 100644 --- a/main/multi.h +++ b/main/multi.h @@ -72,7 +72,7 @@ extern int multi_protocol; // set and determinate used protocol // 3 Descent II Shareware // 4 Descent II Commercial // > 4 DXX-Rebirth -#define MULTI_PROTO_VERSION 11 +#define MULTI_PROTO_VERSION 12 // PROTOCOL VARIABLES AND DEFINES - END diff --git a/main/net_udp.c b/main/net_udp.c index b5ec7335a..5a30799bf 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -2595,8 +2595,10 @@ void net_udp_read_endlevel_packet( ubyte *data, int data_len, struct _sockaddr s len += 2; - Players[pnum].connected = data[len]; len++; - tmpvar = data[len]; len++; + if ((int)data[len] == CONNECT_DISCONNECTED) + multi_disconnect_player(pnum); + Players[pnum].connected = data[len]; len++; + tmpvar = data[len]; len++; if ((Network_status != NETSTAT_PLAYING) && (Players[pnum].connected == CONNECT_PLAYING) && (tmpvar < Countdown_seconds_left)) Countdown_seconds_left = tmpvar; Players[pnum].net_kills_total = GET_INTEL_SHORT(&(data[len])); len += 2; @@ -2604,10 +2606,10 @@ void net_udp_read_endlevel_packet( ubyte *data, int data_len, struct _sockaddr s for (i = 0; i < MAX_PLAYERS; i++) { - kill_matrix[pnum][i] = GET_INTEL_SHORT(&(data[len])); len += 2; + kill_matrix[pnum][i] = GET_INTEL_SHORT(&(data[len])); len += 2; } - - Netgame.players[pnum].LastPacketTime = timer_query(); + if (Players[i].connected) + Netgame.players[pnum].LastPacketTime = timer_query(); } else { @@ -2616,7 +2618,7 @@ void net_udp_read_endlevel_packet( ubyte *data, int data_len, struct _sockaddr s len++; - tmpvar = data[len]; len++; + tmpvar = data[len]; len++; if ((Network_status != NETSTAT_PLAYING) && (tmpvar < Countdown_seconds_left)) Countdown_seconds_left = tmpvar; @@ -2627,9 +2629,11 @@ void net_udp_read_endlevel_packet( ubyte *data, int data_len, struct _sockaddr s len += 5; continue; } - - Players[i].connected = data[len]; len++; - Players[i].net_kills_total = GET_INTEL_SHORT(&(data[len])); len += 2; + + if ((int)data[len] == CONNECT_DISCONNECTED) + multi_disconnect_player(i); + Players[i].connected = data[len]; len++; + Players[i].net_kills_total = GET_INTEL_SHORT(&(data[len])); len += 2; Players[i].net_killed_total = GET_INTEL_SHORT(&(data[len])); len += 2; if (Players[i].connected) @@ -2644,7 +2648,7 @@ void net_udp_read_endlevel_packet( ubyte *data, int data_len, struct _sockaddr s { kill_matrix[i][j] = GET_INTEL_SHORT(&(data[len])); } - len += 2; + len += 2; } } } @@ -3875,7 +3879,6 @@ void net_udp_leave_game() } Players[Player_num].connected = CONNECT_DISCONNECTED; - net_udp_send_endlevel_packet(); change_playernum_to(0); net_udp_flush(); net_udp_close(); @@ -4602,14 +4605,8 @@ void net_udp_read_pdata_short_packet(UDP_frame_info *pd) } else { - // only by reading pdata a client can know if a player re/disconnected. So do that here. + // only by reading pdata a client can know if a player reconnected. So do that here. // NOTE: we might do this somewhere else - maybe with a sync packet like when adding a fresh player. - if ( Players[TheirPlayernum].connected != CONNECT_DISCONNECTED && pd->connected == CONNECT_DISCONNECTED ) - { - Netgame.players[TheirPlayernum].LastPacketTime = timer_query() - UDP_TIMEOUT; - multi_disconnect_player(TheirPlayernum); - return; - } if ( Players[TheirPlayernum].connected == CONNECT_DISCONNECTED && pd->connected == CONNECT_PLAYING ) { Players[TheirPlayernum].connected = CONNECT_PLAYING;