diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 51749ec94..256f5dfe1 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -117,7 +117,7 @@ UINT32 playerpacketlosstable[MAXPLAYERS]; UINT32 playerdelaytable[MAXPLAYERS]; // mindelay values. static tic_t lowest_lag; -boolean server_lagless; +SINT8 server_lagless; SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) @@ -5989,6 +5989,7 @@ static tic_t gametime = 0; static void UpdatePingTable(void) { tic_t fastest; + tic_t slowest; tic_t lag; INT32 i; @@ -5999,6 +6000,7 @@ static void UpdatePingTable(void) PingUpdate(); fastest = 0; + slowest = 0; // update node latency values so we can take an average later. for (i = 0; i < MAXPLAYERS; i++) @@ -6013,14 +6015,19 @@ static void UpdatePingTable(void) lag = playerpingtable[i]; if (! fastest || lag < fastest) fastest = lag; + + if (! slowest || lag > slowest) + slowest = lag; } } } - if (server_lagless) + if (server_lagless == 1) lowest_lag = 0; - else + else if (server_lagless == 0) lowest_lag = fastest; + else if (server_lagless == -1) + lowest_lag = slowest; // Don't gentleman below your mindelay if (lowest_lag < (tic_t)cv_mindelay.value) diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 972dc45b6..64175dd83 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -489,7 +489,7 @@ extern UINT32 playerpacketlosstable[MAXPLAYERS]; extern UINT32 playerdelaytable[MAXPLAYERS]; extern tic_t servermaxping; -extern boolean server_lagless; +extern SINT8 server_lagless; extern consvar_t cv_mindelay; extern consvar_t cv_netticbuffer, cv_allownewplayer, cv_maxplayers, cv_joindelay; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ff9802719..8d30121f9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -655,7 +655,8 @@ consvar_t cv_nettimeout = CVAR_INIT ("nettimeout", "210", CV_CALL|CV_SAVE, netti consvar_t cv_jointimeout = CVAR_INIT ("jointimeout", "210", CV_CALL|CV_SAVE, nettimeout_cons_t, JoinTimeout_OnChange); consvar_t cv_maxping = CVAR_INIT ("maxdelay", "20", CV_SAVE, CV_Unsigned, NULL); -consvar_t cv_lagless = CVAR_INIT ("lagless", "On", CV_SAVE|CV_NETVAR|CV_CALL, CV_OnOff, Lagless_OnChange); +static CV_PossibleValue_t lagless_cons_t[] = {{-1, "Worst"}, {0, "Best"}, {1, "Lagless"}, {0, NULL}}; +consvar_t cv_lagless = CVAR_INIT ("lagless", "Lagless", CV_SAVE|CV_NETVAR|CV_CALL, lagless_cons_t, Lagless_OnChange); static CV_PossibleValue_t pingtimeout_cons_t[] = {{8, "MIN"}, {120, "MAX"}, {0, NULL}}; consvar_t cv_pingtimeout = CVAR_INIT ("maxdelaytimeout", "10", CV_SAVE, pingtimeout_cons_t, NULL); @@ -5408,9 +5409,8 @@ static void JoinTimeout_OnChange(void) static void Lagless_OnChange (void) { - /* don't back out of dishonesty, or go lagless after playing honestly */ - if (cv_lagless.value && gamestate == GS_LEVEL) - server_lagless = true; + if (gamestate == GS_LEVEL) + server_lagless = cv_lagless.value; } UINT32 timelimitintics = 0; diff --git a/src/k_hud.c b/src/k_hud.c index 925f6c69f..d4d76c80e 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2238,7 +2238,7 @@ INT32 K_DrawNeoTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines { V_DrawThinString(x - 18 + 25, y, 0, "CPU"); } - else if (tab[i].num != serverplayer || !server_lagless) + else if (tab[i].num != serverplayer || (server_lagless == 0 || server_lagless == -1)) { INT32 xoff = cv_pingmeasurement.value == 1 ? 33 : 26; @@ -2495,7 +2495,7 @@ void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, IN { V_DrawString(x + ((i < 8) ? -25 : rightoffset + 3), y-2, V_SNAPTOLEFT, "CPU"); } - else if (tab[i].num != serverplayer || !server_lagless) + else if (tab[i].num != serverplayer || (server_lagless == 0 || server_lagless == -1)) { HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[tab[i].num], playerdelaytable[tab[i].num], playerpacketlosstable[tab[i].num], 0, true); } diff --git a/src/sdl/i_video.cpp b/src/sdl/i_video.cpp index 0b9f678b9..01d579628 100644 --- a/src/sdl/i_video.cpp +++ b/src/sdl/i_video.cpp @@ -1288,9 +1288,9 @@ void I_FinishUpdate(void) SCR_DisplayTicRate(); if (cv_showping.value && netgame && - ( consoleplayer != serverplayer || ! server_lagless )) + ( consoleplayer != serverplayer || (server_lagless == 0 || server_lagless == -1) )) { - if (server_lagless) + if (server_lagless == 1) { if (consoleplayer != serverplayer) SCR_DisplayLocalPing();