From 5f26312a0a390ccff6cf6bdca6135da2d52c37f4 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 22 Feb 2020 18:30:20 -0800 Subject: [PATCH 1/7] Drop frames as the host according to the lowest ping among clients --- src/d_clisrv.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 1dacabd9f..7851e1b62 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4960,6 +4960,28 @@ static void CL_SendClientCmd(void) size_t packetsize = 0; boolean mis = false; + int fastest; + int lag; + int i; + + fastest = 0; + + if (server) + { + for (i = 0; i < MAXPLAYERS; ++i) + { + if (playernode[i] > 0 && playeringame[i]) + { + lag = GetLag(playernode[i]); + if (! fastest || lag < fastest) + fastest = lag; + } + } + } + + if (fastest && ( gametic % fastest )) + return; + netbuffer->packettype = PT_CLIENTCMD; if (cl_packetmissed) From 56f6b058d039dfbd64c6fa5e3747342a2aa3bd5f Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 22 Feb 2020 18:33:31 -0800 Subject: [PATCH 2/7] Make host lag optional with "lagless", lag by default (lagless off) --- src/d_clisrv.c | 2 +- src/d_netcmd.c | 3 +++ src/d_netcmd.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7851e1b62..1f5e1f1ae 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4966,7 +4966,7 @@ static void CL_SendClientCmd(void) fastest = 0; - if (server) + if (server && ! cv_lagless.value) { for (i = 0; i < MAXPLAYERS; ++i) { diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 70dff2fcf..ede7558ad 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -447,6 +447,8 @@ consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_co static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}}; consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_lagless = {"lagless", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + static CV_PossibleValue_t pingtimeout_cons_t[] = {{8, "MIN"}, {120, "MAX"}, {0, NULL}}; consvar_t cv_pingtimeout = {"pingtimeout", "10", CV_SAVE, pingtimeout_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -711,6 +713,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_skipmapcheck); CV_RegisterVar(&cv_sleep); CV_RegisterVar(&cv_maxping); + CV_RegisterVar(&cv_lagless); CV_RegisterVar(&cv_pingtimeout); CV_RegisterVar(&cv_showping); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index d1f28665c..7a11a809d 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -144,6 +144,7 @@ extern consvar_t cv_ringslinger, cv_soundtest; extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes; extern consvar_t cv_maxping; +extern consvar_t cv_lagless; extern consvar_t cv_pingtimeout; extern consvar_t cv_showping; From 6484a5cd93179581b4e07c52931adc9c52752c66 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 22 Feb 2020 18:38:36 -0800 Subject: [PATCH 3/7] Show LAGLESS on the scores if the host is being dishonest --- src/k_kart.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 230662d2a..2000c3765 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7085,6 +7085,9 @@ static patch_t *kp_lapanim_hand[3]; static patch_t *kp_yougotem; static patch_t *kp_itemminimap; +static patch_t *kp_alagles[10]; +static patch_t *kp_blagles[6]; + void K_LoadKartHUDGraphics(void) { INT32 i, j; @@ -7385,6 +7388,20 @@ void K_LoadKartHUDGraphics(void) kp_yougotem = (patch_t *) W_CachePatchName("YOUGOTEM", PU_HUDGFX); kp_itemminimap = (patch_t *) W_CachePatchName("MMAPITEM", PU_HUDGFX); + + sprintf(buffer, "ALAGLESx"); + for (i = 0; i < 10; ++i) + { + buffer[7] = '0'+i; + kp_alagles[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + + sprintf(buffer, "BLAGLESx"); + for (i = 0; i < 6; ++i) + { + buffer[7] = '0'+i; + kp_blagles[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } } // For the item toggle menu @@ -8357,9 +8374,11 @@ static boolean K_drawKartPositionFaces(void) // void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol) { + static tic_t alagles_timer = 9; INT32 i, rightoffset = 240; const UINT8 *colormap; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + int y2; //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up @@ -8385,10 +8404,34 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I STRBUFCPY(strtime, tab[i].name); + y2 = y; + + if (tab[i].num == 0 && cv_lagless.value) + { + y2 = ( y - 4 ); + + V_DrawScaledPatch(x + 20, y2, 0, kp_blagles[(leveltime / 3) % 6]); + // every 70 tics + if (( leveltime % 70 ) == 0) + { + alagles_timer = 9; + } + if (alagles_timer > 0) + { + V_DrawScaledPatch(x + 20, y2, 0, kp_alagles[alagles_timer]); + if (( leveltime % 2 ) == 0) + alagles_timer--; + } + else + V_DrawScaledPatch(x + 20, y2, 0, kp_alagles[0]); + + y2 += SHORT (kp_alagles[0]->height) + 1; + } + if (scorelines > 8) - V_DrawThinString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + V_DrawThinString(x + 20, y2, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); else - V_DrawString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); + V_DrawString(x + 20, y2, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); if (players[tab[i].num].mo->color) { From 352d576979585e1f04b5d0b6d06a7b05cbc1305a Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 22 Feb 2020 19:08:03 -0800 Subject: [PATCH 4/7] Don't turn off lagless at map start; draw LAGLESS in intermission --- src/d_clisrv.c | 3 ++- src/d_clisrv.h | 2 ++ src/d_netcmd.c | 12 +++++++++++- src/g_game.c | 2 ++ src/k_kart.c | 2 +- src/y_inter.c | 36 ++++++++++++++++++++++++++++++++++-- 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 1f5e1f1ae..e520c8155 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -97,6 +97,7 @@ UINT16 pingmeasurecount = 1; UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone. UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. tic_t servermaxping = 800; // server's max ping. Defaults to 800 +boolean server_lagless; SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) SINT8 nodetoplayer3[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 2) @@ -4966,7 +4967,7 @@ static void CL_SendClientCmd(void) fastest = 0; - if (server && ! cv_lagless.value) + if (server && ! server_lagless) { for (i = 0; i < MAXPLAYERS; ++i) { diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 0bd85b614..a33d06a2c 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -543,6 +543,8 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; +extern boolean server_lagless; + extern consvar_t #ifdef VANILLAJOINNEXTROUND cv_joinnextround, diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ede7558ad..6b196d10d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -93,6 +93,8 @@ static void TeamScramble_OnChange(void); static void NetTimeout_OnChange(void); static void JoinTimeout_OnChange(void); +static void Lagless_OnChange (void); + static void Ringslinger_OnChange(void); static void Gravity_OnChange(void); static void ForceSkin_OnChange(void); @@ -447,7 +449,7 @@ consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_co static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}}; consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_lagless = {"lagless", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_lagless = {"lagless", "Off", CV_SAVE|CV_NETVAR|CV_CALL, CV_OnOff, Lagless_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t pingtimeout_cons_t[] = {{8, "MIN"}, {120, "MAX"}, {0, NULL}}; consvar_t cv_pingtimeout = {"pingtimeout", "10", CV_SAVE, pingtimeout_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -4772,6 +4774,14 @@ static void JoinTimeout_OnChange(void) jointimeout = (tic_t)cv_jointimeout.value; } +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; +} + UINT32 timelimitintics = 0; /** Deals with a timelimit change by printing the change to the console. diff --git a/src/g_game.c b/src/g_game.c index d4d48f7c2..af32050de 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1781,6 +1781,8 @@ void G_DoLoadLevel(boolean resetplayer) // clear hud messages remains (usually from game startup) CON_ClearHUD(); + + server_lagless = cv_lagless.value; } static INT32 pausedelay = 0; diff --git a/src/k_kart.c b/src/k_kart.c index 2000c3765..4016b7ced 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8406,7 +8406,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I y2 = y; - if (tab[i].num == 0 && cv_lagless.value) + if (tab[i].num == 0 && server_lagless) { y2 = ( y - 4 ); diff --git a/src/y_inter.c b/src/y_inter.c index f5380d565..ff168070c 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -435,6 +435,7 @@ void Y_IntermissionDrawer(void) INT32 y = 41, gutter = ((data.match.numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; const char *timeheader; + int y2; if (data.match.rankingsmode) timeheader = "PWR.LV"; @@ -492,10 +493,41 @@ void Y_IntermissionDrawer(void) STRBUFCPY(strtime, data.match.name[i]); + y2 = y; + + if (data.match.num[i] == 0 && server_lagless) + { + static int alagles_timer = 0; + patch_t *alagles; + + y2 = ( y - 4 ); + + V_DrawScaledPatch(x + 36, y2, 0, W_CachePatchName(va("BLAGLES%d", (intertic / 3) % 6), PU_CACHE)); + // every 70 tics + if (( leveltime % 70 ) == 0) + { + alagles_timer = 9; + } + if (alagles_timer > 0) + { + alagles = W_CachePatchName(va("ALAGLES%d", alagles_timer), PU_CACHE); + V_DrawScaledPatch(x + 36, y2, 0, alagles); + if (( leveltime % 2 ) == 0) + alagles_timer--; + } + else + { + alagles = W_CachePatchName("ALAGLES0", PU_CACHE); + V_DrawScaledPatch(x + 36, y2, 0, alagles); + } + + y2 += SHORT (alagles->height) + 1; + } + if (data.match.numplayers > NUMFORNEWCOLUMN) - V_DrawThinString(x+36, y-1, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + V_DrawThinString(x+36, y2-1, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); else - V_DrawString(x+36, y, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); + V_DrawString(x+36, y2, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); if (data.match.rankingsmode) { From a511d9358a81fb743a5b9b789c61d6f31c1b38c3 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 22 Feb 2020 19:38:36 -0800 Subject: [PATCH 5/7] Terrible code to show the ping counter for honest servers --- src/d_clisrv.c | 75 +++++++++++++++++++++++++++++++++-------------- src/sdl/i_video.c | 5 +++- 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e520c8155..28a519694 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -97,6 +97,7 @@ UINT16 pingmeasurecount = 1; UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone. UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. tic_t servermaxping = 800; // server's max ping. Defaults to 800 +static tic_t lowest_lag; boolean server_lagless; SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) @@ -4961,26 +4962,7 @@ static void CL_SendClientCmd(void) size_t packetsize = 0; boolean mis = false; - int fastest; - int lag; - int i; - - fastest = 0; - - if (server && ! server_lagless) - { - for (i = 0; i < MAXPLAYERS; ++i) - { - if (playernode[i] > 0 && playeringame[i]) - { - lag = GetLag(playernode[i]); - if (! fastest || lag < fastest) - fastest = lag; - } - } - } - - if (fastest && ( gametic % fastest )) + if (lowest_lag && ( gametic % lowest_lag )) return; netbuffer->packettype = PT_CLIENTCMD; @@ -5451,16 +5433,65 @@ static tic_t gametime = 0; static void UpdatePingTable(void) { + int fastest; + tic_t lag; + INT32 i; + if (server) { if (netgame && !(gametime % 35)) // update once per second. PingUpdate(); + + fastest = 0; + // update node latency values so we can take an average later. for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i]) - realpingtable[i] += G_TicsToMilliseconds(GetLag(playernode[i])); + { + if (playeringame[i] && playernode[i] > 0) + { + if (! server_lagless && playernode[i] > 0) + { + lag = GetLag(playernode[i]); + realpingtable[i] += G_TicsToMilliseconds(lag); + + if (! fastest || lag < fastest) + fastest = lag; + } + else + realpingtable[i] += G_TicsToMilliseconds(GetLag(playernode[i])); + } + } pingmeasurecount++; + + if (server_lagless) + lowest_lag = 0; + else + { + lowest_lag = fastest; + + if (fastest) + lag = fastest; + else + lag = GetLag(0); + + lag = ( realpingtable[0] + G_TicsToMilliseconds(lag) ); + + switch (playerpernode[0]) + { + case 4: + realpingtable[nodetoplayer4[0]] = lag; + /*FALLTHRU*/ + case 3: + realpingtable[nodetoplayer3[0]] = lag; + /*FALLTHRU*/ + case 2: + realpingtable[nodetoplayer2[0]] = lag; + /*FALLTHRU*/ + case 1: + realpingtable[nodetoplayer[0]] = lag; + } + } } } diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index e5f1c23fc..c900417ab 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1382,8 +1382,11 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && netgame && consoleplayer != serverplayer) + if (cv_showping.value && netgame && + ( consoleplayer != serverplayer || ! server_lagless )) + { SCR_DisplayLocalPing(); + } } if (rendermode == render_soft && screens[0]) From 4f73e2666188df1d0b6b896cbe68f57152ff5b62 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 22 Feb 2020 19:44:16 -0800 Subject: [PATCH 6/7] Show server's ping on scores if not LAGLESS --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4016b7ced..3c01f22ab 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8399,7 +8399,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I continue; //ignore them. if (netgame // don't draw it offline - && tab[i].num != serverplayer) + && ( tab[i].num != serverplayer || ! server_lagless )) HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[tab[i].num], 0); STRBUFCPY(strtime, tab[i].name); From 11930b41bf704f68d7d6594e1a6e992603235d37 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 3 Mar 2020 20:11:03 -0800 Subject: [PATCH 7/7] Use tic_t --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 28a519694..308eb2616 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5433,7 +5433,7 @@ static tic_t gametime = 0; static void UpdatePingTable(void) { - int fastest; + tic_t fastest; tic_t lag; INT32 i;