From 861d35e8d3c8cb0e51da7f05ebd49dd5977728a2 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 18:10:18 +0100 Subject: [PATCH 01/15] port clientsided gentlemens delay cant do the serverside stuff due to netvars --- src/d_clisrv.c | 163 ++++++++++++++++++++++++++++++++++++++++++++----- src/d_clisrv.h | 14 +++++ src/d_netcmd.c | 1 + 3 files changed, 164 insertions(+), 14 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7b20c78fe..694fa288c 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -103,6 +103,17 @@ static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the 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. + +#define GENTLEMANSMOOTHING (TICRATE) +static tic_t reference_lag; +static UINT8 spike_time; + +static tic_t lowest_lag; +boolean server_lagless; + +static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; +consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + 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) @@ -140,7 +151,7 @@ static UINT8 gamestate_resend_counter[MAXNETNODES]; boolean hu_stopped = false; // Client specific -static ticcmd_t localcmds[MAXSPLITSCREENPLAYERS]; +static ticcmd_t localcmds[MAXSPLITSCREENPLAYERS][MAXGENTLEMENDELAY]; static boolean cl_packetmissed; // here it is for the secondary local player (splitscreen) static UINT8 mynode; // my address pointofview server @@ -456,10 +467,15 @@ static void D_Clearticcmd(tic_t tic) void D_ResetTiccmds(void) { - INT32 i; + INT32 i, j; for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) - memset(&localcmds[i], 0, sizeof(ticcmd_t)); + { + for (j = 0; j < MAXGENTLEMENDELAY; j++) + { + memset(&localcmds[i][j], 0, sizeof(ticcmd_t)); + } + } // Reset the net command list for (i = 0; i < TEXTCMD_HASH_SIZE; i++) @@ -4233,7 +4249,7 @@ void SV_ResetServer(void) memset(playeringame, false, sizeof playeringame); memset(playernode, UINT8_MAX, sizeof playernode); - pingmeasurecount = 1; + pingmeasurecount = 0; //Reset count memset(realpingtable, 0, sizeof realpingtable); memset(playerpingtable, 0, sizeof playerpingtable); @@ -6020,27 +6036,78 @@ static void CL_SendClientCmd(void) } else if (gamestate != GS_NULL) { + UINT8 lagDelay = 0; + + if (lowest_lag > 0) + { + // Gentlemens' ping. + lagDelay = min(lowest_lag, MAXGENTLEMENDELAY); + + // Is our connection worse than our current gentleman point? + // Make sure it stays that way for a bit before increasing delay levels. + if (lagDelay > reference_lag) + { + spike_time++; + if (spike_time >= GENTLEMANSMOOTHING) + { + // Okay, this is genuinely the new baseline delay. + reference_lag = lagDelay; + spike_time = 0; + } + else + { + // Just a temporary fluctuation, ignore it. + lagDelay = reference_lag; + } + } + else + { + reference_lag = lagDelay; // Adjust quickly if the connection improves. + spike_time = 0; + } + + /* + if (server) // Clients have to wait for the gamestate to make it back. Servers don't! + lagDelay *= 2; // Simulate the HELLFUCK NIGHTMARE of a complete round trip. + */ + + // [deep breath in] + // Plausible, elegant explanation that is WRONG AND SUPER HARMFUL. + // Clients with stable connections were adding their mindelay to network delay, + // even when their mindelay was as high or higher than network delay—which made + // client delay APPEAR slower than host mindelay, by the exact value that made + // "lmao just double it" make sense at the time. + // + // While this fix made client connections match server mindelay in our most common + // test environment, it also masked an issue that seriously affected online handling + // responsiveness, completely ruining our opportunity to further investigate it! + // + // See UpdatePingTable. + // I am taking this shitty code to my grave as an example of "never trust your brain". + // -Tyron 2024-05-15 + } + packetsize = sizeof (clientcmd_pak); - G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds[0], 1); - netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic%TICQUEUE]); + G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds[0][lagDelay], 1); + netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic % TICQUEUE]); if (splitscreen || botingame) // Send a special packet with 2 cmd for splitscreen { netbuffer->packettype = (mis ? PT_CLIENT2MIS : PT_CLIENT2CMD); packetsize = sizeof (client2cmd_pak); - G_MoveTiccmd(&netbuffer->u.client2pak.cmd2, &localcmds[1], 1); + G_MoveTiccmd(&netbuffer->u.client2pak.cmd2, &localcmds[1][lagDelay], 1); if (splitscreen > 1) { netbuffer->packettype = (mis ? PT_CLIENT3MIS : PT_CLIENT3CMD); packetsize = sizeof (client3cmd_pak); - G_MoveTiccmd(&netbuffer->u.client3pak.cmd3, &localcmds[2], 1); + G_MoveTiccmd(&netbuffer->u.client3pak.cmd3, &localcmds[2][lagDelay], 1); if (splitscreen > 2) { netbuffer->packettype = (mis ? PT_CLIENT4MIS : PT_CLIENT4CMD); packetsize = sizeof (client4cmd_pak); - G_MoveTiccmd(&netbuffer->u.client4pak.cmd4, &localcmds[3], 1); + G_MoveTiccmd(&netbuffer->u.client4pak.cmd4, &localcmds[3][lagDelay], 1); } } } @@ -6207,8 +6274,15 @@ static void SV_SendTics(void) // static inline void CreateNewLocalCMD(UINT8 p, INT32 realtics) { - G_BuildTiccmd(&localcmds[p], realtics, p+1); - localcmds[p].angleturn |= TICCMD_RECEIVED; + INT32 i; + + for (i = MAXGENTLEMENDELAY-1; i > 0; i--) + { + G_MoveTiccmd(&localcmds[p][i], &localcmds[p][i-1], 1); + } + + G_BuildTiccmd(&localcmds[p][0], realtics, p+1); + localcmds[p][0].angleturn |= TICCMD_RECEIVED; } static void Local_Maketic(INT32 realtics) @@ -6510,16 +6584,77 @@ static tic_t gametime = 0; static void UpdatePingTable(void) { + tic_t fastest; + tic_t lag; + INT32 i; + if (server) { - if (netgame && !(gametime % 35)) // update once per second. + if (Playing() && !(gametime % 8)) // Value chosen based on _my vibes man_ PingUpdate(); + + fastest = 0; + // update node latency values so we can take an average later. for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && playernode[i] != UINT8_MAX) - realpingtable[i] += GetLag(playernode[i]); + { + if (playeringame[i] && playernode[i] > 0 && playernode[i] != UINT8_MAX) + { + if (playernode[i] > 0 && !players[i].spectator) + { + lag = GetLag(playernode[i]); + realpingtable[i] += (lag); + + if (! fastest || lag < fastest) + fastest = lag; + } + else + realpingtable[i] += (GetLag(playernode[i])); + } + } + + // Don't gentleman below your mindelay + if (fastest < (tic_t)cv_mindelay.value) + fastest = (tic_t)cv_mindelay.value; + pingmeasurecount++; + + lowest_lag = fastest; + + if (fastest) + lag = fastest; + else + lag = GetLag(0); + + lag = (realpingtable[0] + 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; + } + } + else // We're a client, handle mindelay on the way out. + { + // Previously (neededtic - gametic) - WRONG VALUE! + // Pretty sure that's measuring jitter, not RTT. + // Stable connections would be punished by adding their mindelay to network delay! + tic_t mydelay = playerpingtable[consoleplayer]; + + if (mydelay < (tic_t)cv_mindelay.value) + lowest_lag = cv_mindelay.value - mydelay; + else + lowest_lag = 0; } } diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 4e81621d9..1e86ec567 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -41,6 +41,15 @@ applications may follow different packet versions. #define BACKUPTICS 32 #define TICQUEUE 512 // more than enough for most timeouts.... #define MAXTEXTCMD 256 + +// No. of tics your controls can be delayed by. + +// TODO: Instead of storing a ton of extra cmds for gentlemens' delay, +// keep them in a linked-list, with timestamps to discard everything that's older than already sent. +// That will support any amount of lag, and be less wasteful for clients who don't use it. +// This just works as a quick implementation. +#define MAXGENTLEMENDELAY TICRATE + // // Packet structure // @@ -576,6 +585,9 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; +extern boolean server_lagless; +extern consvar_t cv_mindelay; + extern consvar_t #ifdef VANILLAJOINNEXTROUND cv_joinnextround, @@ -645,6 +657,8 @@ extern char motd[254], server_context[8]; extern UINT8 playernode[MAXPLAYERS]; INT32 D_NumPlayers(void); +boolean D_IsPlayerHumanAndGaming(INT32 player_number); + void D_ResetTiccmds(void); tic_t GetLag(INT32 node); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 41b9c97e9..b8efd3392 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -916,6 +916,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_rollingdemos); CV_RegisterVar(&cv_netstat); CV_RegisterVar(&cv_netticbuffer); + CV_RegisterVar(&cv_mindelay); #ifdef NETGAME_DEVMODE CV_RegisterVar(&cv_fishcake); -- 2.54.0 From 1d5092cf22958b0d59af18d44575a2eb46d5162d Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 16:16:46 +0100 Subject: [PATCH 02/15] smol cleanup --- src/d_clisrv.c | 35 +++++++++++++---------------------- src/d_clisrv.h | 1 - 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 694fa288c..1d10ec4c2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -109,7 +109,6 @@ static tic_t reference_lag; static UINT8 spike_time; static tic_t lowest_lag; -boolean server_lagless; static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -6601,47 +6600,39 @@ static void UpdatePingTable(void) { if (playeringame[i] && playernode[i] > 0 && playernode[i] != UINT8_MAX) { - if (playernode[i] > 0 && !players[i].spectator) - { - lag = GetLag(playernode[i]); - realpingtable[i] += (lag); + // TicsToMilliseconds can't handle pings over 1000ms lol + realpingtable[i] += GetLag(playernode[i]); + if (!players[i].spectator) + { + lag = playerpingtable[i]; if (! fastest || lag < fastest) fastest = lag; } - else - realpingtable[i] += (GetLag(playernode[i])); } } - // Don't gentleman below your mindelay - if (fastest < (tic_t)cv_mindelay.value) - fastest = (tic_t)cv_mindelay.value; - - pingmeasurecount++; - lowest_lag = fastest; - if (fastest) - lag = fastest; - else - lag = GetLag(0); + // Don't gentleman below your mindelay + if (lowest_lag < (tic_t)cv_mindelay.value) + lowest_lag = (tic_t)cv_mindelay.value; - lag = (realpingtable[0] + lag); + pingmeasurecount++; switch (playerpernode[0]) { case 4: - realpingtable[nodetoplayer4[0]] = lag; + realpingtable[nodetoplayer4[0]] = lowest_lag; /*FALLTHRU*/ case 3: - realpingtable[nodetoplayer3[0]] = lag; + realpingtable[nodetoplayer3[0]] = lowest_lag; /*FALLTHRU*/ case 2: - realpingtable[nodetoplayer2[0]] = lag; + realpingtable[nodetoplayer2[0]] = lowest_lag; /*FALLTHRU*/ case 1: - realpingtable[nodetoplayer[0]] = lag; + realpingtable[nodetoplayer[0]] = lowest_lag; } } else // We're a client, handle mindelay on the way out. diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 1e86ec567..25bbdf054 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -585,7 +585,6 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; -extern boolean server_lagless; extern consvar_t cv_mindelay; extern consvar_t -- 2.54.0 From 064e9d58af21f250c9b586a0eb7400206c177ee1 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 18:10:53 +0100 Subject: [PATCH 03/15] add gentlemens delay to ping display + display ping even offline if you have mindelay active --- src/hu_stuff.c | 16 +++++++++++++--- src/k_kart.c | 15 ++++++++++++--- src/screen.c | 7 ++++++- src/sdl/i_video.c | 13 +++++++++---- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 6cbb46148..96ba8cec6 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2425,7 +2425,7 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) UINT8 *colormap = NULL; INT32 measureid = cv_pingmeasurement.value ? 1 : 0; INT32 gfxnum; // gfx to draw - + //SRB2/Kart v1.0 style UINT8 numbars = 0; // how many ping bars do we draw? UINT8 barcolor = 31; // color we use for the bars (green, yellow, red or black) @@ -2522,6 +2522,7 @@ static inline void HU_DrawSpectatorTicker(void) INT32 length = 0, height = 174; INT32 totallength = 0, templength = -8; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + UINT32 ping = 0; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) @@ -2595,8 +2596,17 @@ static inline void HU_DrawSpectatorTicker(void) } } - if (netgame && i != serverplayer) - HU_drawPing((templength - duptweak)+8, height-20, playerpingtable[i], V_TRANSLUCENT); + if ((netgame && i != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[i]))) + { + ping = playerpingtable[i]; + + if (P_IsLocalPlayer(&players[i]) && ping <= (tic_t)cv_mindelay.value) + { + ping = cv_mindelay.value; + } + + HU_drawPing((templength - duptweak)+8, height-20, ping, V_TRANSLUCENT); + } } if ((length += len) >= dupadjust+8) diff --git a/src/k_kart.c b/src/k_kart.c index 6f7555786..5ab4481fa 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8885,6 +8885,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I INT32 i, rightoffset = 240; const UINT8 *colormap; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + UINT32 ping = 0; //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up @@ -8904,9 +8905,17 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[tab[i].num].spectator || !players[tab[i].num].mo) continue; //ignore them. - if (netgame // don't draw it offline - && tab[i].num != serverplayer) - HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[tab[i].num], 0); + if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) + { + ping = playerpingtable[pnum]; + + if (P_IsLocalPlayer(&players[pnum]) && ping <= (tic_t)cv_mindelay.value) + { + ping = cv_mindelay.value; + } + + HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, ping, 0); + } STRBUFCPY(strtime, tab[i].name); diff --git a/src/screen.c b/src/screen.c index 249c7225c..9d293ec7a 100644 --- a/src/screen.c +++ b/src/screen.c @@ -521,7 +521,12 @@ void SCR_DisplayLocalPing(void) if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain - + + if (ping <= (tic_t)cv_mindelay.value) + { + ping = cv_mindelay.value; + } + HU_drawPing(308, dispy, ping, pingflags); } } diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 609afc30a..c4dec0400 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1464,11 +1464,16 @@ void I_FinishUpdate(void) if (I_SkipFrame()) return; - if (cv_ticrate.value && st_overlay) - SCR_DisplayTicRate(); + if (st_overlay) + { + if (cv_ticrate.value) + SCR_DisplayTicRate(); - if (cv_showping.value && netgame && consoleplayer != serverplayer && st_overlay) - SCR_DisplayLocalPing(); + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); + if (cv_showping.value && cv_mindelay.value && consoleplayer == serverplayer && Playing()) + SCR_DisplayLocalPing(); + } #ifdef HAVE_DISCORDRPC if (discordRequestList != NULL) -- 2.54.0 From 6b951d2773094d172de4d9edcd354ad71b0ae643 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 17:38:20 +0100 Subject: [PATCH 04/15] division by zero moment --- 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 1d10ec4c2..e94cef84e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4248,7 +4248,7 @@ void SV_ResetServer(void) memset(playeringame, false, sizeof playeringame); memset(playernode, UINT8_MAX, sizeof playernode); - pingmeasurecount = 0; //Reset count + pingmeasurecount = 1; memset(realpingtable, 0, sizeof realpingtable); memset(playerpingtable, 0, sizeof playerpingtable); -- 2.54.0 From 6ef9c0b305b295dcb9617522d5ba3ca6a0e4361b Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 18:06:06 +0100 Subject: [PATCH 05/15] colourise pingnumber when gentlemens is active --- src/hu_stuff.c | 24 ++++++++++++------------ src/hu_stuff.h | 2 +- src/k_kart.c | 10 +--------- src/screen.c | 9 ++------- src/sdl/i_video.c | 4 +--- 5 files changed, 17 insertions(+), 32 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 96ba8cec6..625668831 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2433,6 +2433,14 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) SINT8 yoffset = 6; //INT32 dx; + UINT32 lag = playerpingtable[pnum]; + + if (P_IsLocalPlayer(&players[pnum]) && lag < (tic_t)cv_mindelay.value) + { + lag = cv_mindelay.value; + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); + } + gfxnum = Ping_gfx_num(lag); if (!cv_pingstyle.value) @@ -2452,7 +2460,7 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) x = V_DrawPingNum(x + (measureid == 1 ? 11 - pingmeasure[measureid]->width : 10), y+9, flags, lag, colormap); if (measureid == 0) - V_DrawScaledPatch(x+1 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); + V_DrawScaledPatch(x+1 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); } else if (cv_pingstyle.value) // old style ping { @@ -2500,8 +2508,8 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) } if (cv_pingicon.value) - { - for (i=0; (i<3); i++) // Draw the ping bar + { + for (i = 0; (i < 3); i++) // Draw the ping bar { V_DrawFill(x+2 *(i-1)+7, y+8+yoffset-4, 2, 8-yoffset, 31|flags); if (i < numbars) @@ -2522,7 +2530,6 @@ static inline void HU_DrawSpectatorTicker(void) INT32 length = 0, height = 174; INT32 totallength = 0, templength = -8; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; - UINT32 ping = 0; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) @@ -2598,14 +2605,7 @@ static inline void HU_DrawSpectatorTicker(void) if ((netgame && i != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[i]))) { - ping = playerpingtable[i]; - - if (P_IsLocalPlayer(&players[i]) && ping <= (tic_t)cv_mindelay.value) - { - ping = cv_mindelay.value; - } - - HU_drawPing((templength - duptweak)+8, height-20, ping, V_TRANSLUCENT); + HU_drawPlayerPing((templength - duptweak)+8, height-20, i, V_TRANSLUCENT); } } diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 66459c716..7578ed526 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -125,7 +125,7 @@ void HU_Drawer(void); char HU_dequeueChatChar(void); void HU_Erase(void); void HU_clearChatChars(void); -void HU_drawPing(INT32 x, INT32 y, UINT32 ping, INT32 flags); // Lat': Ping drawer for scoreboard. +void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard. //void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer); //void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer); void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol); diff --git a/src/k_kart.c b/src/k_kart.c index 5ab4481fa..3e6c97df5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8885,7 +8885,6 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I INT32 i, rightoffset = 240; const UINT8 *colormap; INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; - UINT32 ping = 0; //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up @@ -8907,14 +8906,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) { - ping = playerpingtable[pnum]; - - if (P_IsLocalPlayer(&players[pnum]) && ping <= (tic_t)cv_mindelay.value) - { - ping = cv_mindelay.value; - } - - HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, ping, 0); + HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, pnum, 0); } STRBUFCPY(strtime, tab[i].name); diff --git a/src/screen.c b/src/screen.c index 9d293ec7a..5ae4f8d72 100644 --- a/src/screen.c +++ b/src/screen.c @@ -515,18 +515,13 @@ void SCR_DisplayTicRate(void) void SCR_DisplayLocalPing(void) { - UINT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P + UINT32 ping = playerpingtable[consoleplayer]; INT32 pingflags = V_LocalTransFlag()|V_SNAPTOBOTTOM|V_SNAPTORIGHT; if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain - if (ping <= (tic_t)cv_mindelay.value) - { - ping = cv_mindelay.value; - } - - HU_drawPing(308, dispy, ping, pingflags); + HU_drawPlayerPing(308, dispy, consoleplayer, pingflags); // consoleplayer's ping is everyone's ping in a splitnetgame :P } } diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index c4dec0400..e17dd87f7 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1469,9 +1469,7 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && netgame && consoleplayer != serverplayer) - SCR_DisplayLocalPing(); - if (cv_showping.value && cv_mindelay.value && consoleplayer == serverplayer && Playing()) + if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || (cv_mindelay.value && consoleplayer == serverplayer && Playing()))) SCR_DisplayLocalPing(); } -- 2.54.0 From 9354a0ab88e72c2087b93e54960762bb1d167883 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:27:07 +0100 Subject: [PATCH 06/15] conflict fix --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 625668831..e94bd6598 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2420,7 +2420,7 @@ Ping_gfx_num (int lag) // HU_drawPing // -void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags) +void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { UINT8 *colormap = NULL; INT32 measureid = cv_pingmeasurement.value ? 1 : 0; -- 2.54.0 From f4f3f6e29c194312bfb724982bedad733c84a71c Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:27:42 +0100 Subject: [PATCH 07/15] slight cleanup HU_drawPlayerPing --- src/hu_stuff.c | 63 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e94bd6598..0677bf2a6 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2416,13 +2416,43 @@ Ping_gfx_num (int lag) return 4; } +static const UINT8 * +Ping_gfx_colormap (UINT32 lag, boolean gentleman) +{ + const UINT8 *colormap = NULL; + + if (gentleman) + { + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); + } + + if (servermaxping && lag > servermaxping && hu_tick < 4) + { + // flash ping red if too high + colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_RASPBERRY, GTC_CACHE); + } + + return colormap; +} + +static UINT32 +Ping_conversion (UINT32 lag) +{ + if (cv_pingmeasurement.value) + { + lag = (INT32)(lag * (1000.00f / TICRATE)); + } + + return lag; +} + + // // HU_drawPing // void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { - UINT8 *colormap = NULL; INT32 measureid = cv_pingmeasurement.value ? 1 : 0; INT32 gfxnum; // gfx to draw @@ -2434,35 +2464,29 @@ void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) //INT32 dx; UINT32 lag = playerpingtable[pnum]; + const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])); - if (P_IsLocalPlayer(&players[pnum]) && lag < (tic_t)cv_mindelay.value) + if (gentleman) { lag = cv_mindelay.value; - colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); } - gfxnum = Ping_gfx_num(lag); - - if (!cv_pingstyle.value) + if (cv_pingstyle.value == 0) // kart { + gfxnum = Ping_gfx_num(lag); + if (measureid == 1) V_DrawScaledPatch(x+11 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); if (cv_pingicon.value) V_DrawScaledPatch(x+2, y, flags, pinggfx[gfxnum]); - if (servermaxping && lag > servermaxping && hu_tick < 4) - colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_RASPBERRY, GTC_CACHE); // flash ping red if too high - - if (cv_pingmeasurement.value) - lag = (INT32)(lag * (1000.00f / TICRATE)); - - x = V_DrawPingNum(x + (measureid == 1 ? 11 - pingmeasure[measureid]->width : 10), y+9, flags, lag, colormap); + x = V_DrawPingNum(x + (measureid == 1 ? 11 - pingmeasure[measureid]->width : 10), y+9, flags, Ping_conversion(lag), Ping_gfx_colormap(lag, gentleman)); if (measureid == 0) V_DrawScaledPatch(x+1 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]); } - else if (cv_pingstyle.value) // old style ping + else if (cv_pingstyle.value == 1) // old style ping { if (cv_pingicon.value) { @@ -2488,22 +2512,15 @@ void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) } } - if (cv_pingmeasurement.value) - lag = (INT32)(lag * (1000.00f / TICRATE)); - if (vid.width >= 640) // how sad, we're using a shit resolution. { if (measureid == 1) { - //dx = x+1 - (V_SmallStringWidth(va("%dms", lag), V_ALLOWLOWERCASE|flags)/2); - //V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE|flags, va("%dms", lag)); - V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", lag)); + V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", Ping_conversion(lag))); } else if (measureid == 0) { - //dx = x+1 - (V_SmallStringWidth(va("d%d", lag), flags)/2); - //V_DrawSmallString(dx, y+4, flags, va("d%d", lag)); - V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", lag)); + V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", Ping_conversion(lag))); } } -- 2.54.0 From 1857ce5113d276268fd1d834480b940de2bdb9ef Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:29:08 +0100 Subject: [PATCH 08/15] conflict fix 2 --- src/hu_stuff.c | 2 +- src/k_kart.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 0677bf2a6..4f99ca0eb 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2451,7 +2451,7 @@ Ping_conversion (UINT32 lag) // HU_drawPing // -void HU_drawPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) +void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { INT32 measureid = cv_pingmeasurement.value ? 1 : 0; INT32 gfxnum; // gfx to draw diff --git a/src/k_kart.c b/src/k_kart.c index 3e6c97df5..9048d1fc6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8904,9 +8904,9 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[tab[i].num].spectator || !players[tab[i].num].mo) continue; //ignore them. - if ((netgame && pnum != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[pnum]))) + if ((netgame && tab[i].num != serverplayer) || (cv_mindelay.value && P_IsLocalPlayer(&players[tab[i].num]))) { - HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, pnum, 0); + HU_drawPlayerPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, tab[i].num, 0); } STRBUFCPY(strtime, tab[i].name); -- 2.54.0 From ac64428abb92e7b4e66f569e076a32abafdf5e9d Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 23 Jan 2025 21:55:37 +0100 Subject: [PATCH 09/15] dont mess up realpingtable when serverplayer has mindelay active this was supposed to show mindelay for serverplayers but that doesent work :chaosleep: so just do not mess with it --- src/d_clisrv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e94cef84e..465a95300 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6600,7 +6600,6 @@ static void UpdatePingTable(void) { if (playeringame[i] && playernode[i] > 0 && playernode[i] != UINT8_MAX) { - // TicsToMilliseconds can't handle pings over 1000ms lol realpingtable[i] += GetLag(playernode[i]); if (!players[i].spectator) @@ -6620,6 +6619,7 @@ static void UpdatePingTable(void) pingmeasurecount++; +#if 0 switch (playerpernode[0]) { case 4: @@ -6634,6 +6634,7 @@ static void UpdatePingTable(void) case 1: realpingtable[nodetoplayer[0]] = lowest_lag; } +#endif } else // We're a client, handle mindelay on the way out. { -- 2.54.0 From b97841b6fdb1814387409d403292757c49d7c61e Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 06:39:57 +0100 Subject: [PATCH 10/15] proper add server gentlemans this should be a netvar, but we cant really do that, thought not a huge deal however id wish to send some kinda message to all players but idk --- src/d_clisrv.c | 39 +++++++++++++++++++-------------------- src/d_clisrv.h | 4 +++- src/d_netcmd.c | 1 + src/g_game.c | 2 ++ src/hu_stuff.c | 4 ++-- src/sdl/i_video.c | 2 +- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 465a95300..7c7cb7d07 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -107,11 +107,24 @@ UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. #define GENTLEMANSMOOTHING (TICRATE) static tic_t reference_lag; static UINT8 spike_time; +tic_t lowest_lag; +boolean server_lagless; -static tic_t lowest_lag; +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 (cv_lagless.value) + HU_AddChatText(M_GetText("\x82*Gentlemans Delay has been enabled for Serverplayer."), false); + else + HU_AddChatText(M_GetText("\x82*Gentlemans Delay will be disabled for Serverplayer."), false);*/ +} static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_lagless = {"serverlagless", "On", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, Lagless_OnChange, 0, NULL, NULL, 0, 0, NULL}; // this should be a netvar Zzz... SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) @@ -6602,7 +6615,7 @@ static void UpdatePingTable(void) { realpingtable[i] += GetLag(playernode[i]); - if (!players[i].spectator) + if (!server_lagless && !players[i].spectator) { lag = playerpingtable[i]; if (! fastest || lag < fastest) @@ -6611,30 +6624,16 @@ static void UpdatePingTable(void) } } - lowest_lag = fastest; + if (server_lagless) + lowest_lag = 0; + else + lowest_lag = fastest; // Don't gentleman below your mindelay if (lowest_lag < (tic_t)cv_mindelay.value) lowest_lag = (tic_t)cv_mindelay.value; pingmeasurecount++; - -#if 0 - switch (playerpernode[0]) - { - case 4: - realpingtable[nodetoplayer4[0]] = lowest_lag; - /*FALLTHRU*/ - case 3: - realpingtable[nodetoplayer3[0]] = lowest_lag; - /*FALLTHRU*/ - case 2: - realpingtable[nodetoplayer2[0]] = lowest_lag; - /*FALLTHRU*/ - case 1: - realpingtable[nodetoplayer[0]] = lowest_lag; - } -#endif } else // We're a client, handle mindelay on the way out. { diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 25bbdf054..c24356e94 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -585,7 +585,9 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; -extern consvar_t cv_mindelay; +extern boolean server_lagless; +extern tic_t lowest_lag; +extern consvar_t cv_mindelay, cv_lagless; extern consvar_t #ifdef VANILLAJOINNEXTROUND diff --git a/src/d_netcmd.c b/src/d_netcmd.c index b8efd3392..759b3b6a4 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -917,6 +917,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_netstat); CV_RegisterVar(&cv_netticbuffer); CV_RegisterVar(&cv_mindelay); + CV_RegisterVar(&cv_lagless); #ifdef NETGAME_DEVMODE CV_RegisterVar(&cv_fishcake); diff --git a/src/g_game.c b/src/g_game.c index d30e07c00..fa58ca81c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1265,6 +1265,8 @@ static void G_DoLoadLevel(boolean resetplayer) // clear hud messages remains (usually from game startup) CON_ClearHUD(); + server_lagless = cv_lagless.value; + G_ResetAllDeviceRumbles(); } diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 4f99ca0eb..62b29de59 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2464,11 +2464,11 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) //INT32 dx; UINT32 lag = playerpingtable[pnum]; - const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])); + const boolean gentleman = ((cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])) || (pnum == serverplayer && lowest_lag != 0)); // for serverplayer lowest_lag actually reflects mindelay if (gentleman) { - lag = cv_mindelay.value; + lag = (pnum == serverplayer) ? lowest_lag : (tic_t)cv_mindelay.value; } if (cv_pingstyle.value == 0) // kart diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index e17dd87f7..934491e9c 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1469,7 +1469,7 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || (cv_mindelay.value && consoleplayer == serverplayer && Playing()))) + if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || ((cv_mindelay.value || (!server_lagless && lowest_lag != 0)) && consoleplayer == serverplayer && Playing()))) SCR_DisplayLocalPing(); } -- 2.54.0 From b55c654a81691544f33a3c60acace0c745c8e459 Mon Sep 17 00:00:00 2001 From: Alug Date: Fri, 24 Jan 2025 06:43:46 +0100 Subject: [PATCH 11/15] oop --- src/d_clisrv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7c7cb7d07..ccc700325 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -117,9 +117,9 @@ static void Lagless_OnChange(void) server_lagless = true; /*if (cv_lagless.value) - HU_AddChatText(M_GetText("\x82*Gentlemans Delay has been enabled for Serverplayer."), false); + HU_AddChatText(M_GetText("\x82*Gentlemans Delay has been disabled for Serverplayer."), false); else - HU_AddChatText(M_GetText("\x82*Gentlemans Delay will be disabled for Serverplayer."), false);*/ + HU_AddChatText(M_GetText("\x82*Gentlemans Delay will be enabled for Serverplayer."), false);*/ } static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; -- 2.54.0 From 0dd4f3b3d32b0751c7a41eaab4ff98b2c42d9e07 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 27 Jan 2025 09:19:25 +0100 Subject: [PATCH 12/15] make old ping bar be blue on d1 aswell as purple with mindelay --- src/hu_stuff.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 62b29de59..b22e69b2b 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2490,25 +2490,33 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) { if (cv_pingicon.value) { - if (lag < 4) + switch (lag) { - numbars = 3; - barcolor = 184; + case 0 ... 1: + numbars = 3; + barcolor = 215; // Blue + break; + case 2 ... 3: + numbars = 3; + barcolor = 184; // Green + break; + case 4 ... 6: + numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it. + barcolor = 103; // Yellow + break; + case 7 ... 9: + numbars = 1; + barcolor = 155; // Red + break; + default: // Brazil + numbars = 0; + barcolor = 31; // black + break; } - else if (lag < 7) + + if (gentleman) { - numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it. - barcolor = 103; - } - else if (lag < 10) - { - numbars = 1; - barcolor = 155; // need a better red - } - else // brazil - { - numbars = 0; - barcolor = 31; + barcolor = 194; // make it purplish } } -- 2.54.0 From 14881e968a3d77f1adb8be4c9417ca9817c051bb Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 12 Feb 2025 12:00:54 +0100 Subject: [PATCH 13/15] simplify local ping display --- src/d_clisrv.c | 12 ++++++++--- src/d_clisrv.h | 1 + src/hu_stuff.c | 51 +++++++++++++++-------------------------------- src/sdl/i_video.c | 2 +- 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index ccc700325..79bf5e2d8 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -108,6 +108,7 @@ UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. static tic_t reference_lag; static UINT8 spike_time; tic_t lowest_lag; +tic_t simulated_lag; // just for ping readout without netticbuffer added boolean server_lagless; static void Lagless_OnChange(void) @@ -6306,8 +6307,8 @@ static void Local_Maketic(INT32 realtics) // game responder calls HU_Responder, AM_Responder, F_Responder, // and G_MapEventsToControls if (!dedicated) rendergametic = gametic; - // translate inputs (keyboard/mouse/joystick) into game controls + // translate inputs (keyboard/mouse/joystick) into game controls for (i = 0; i <= splitscreen; i++) { CreateNewLocalCMD(i, realtics); @@ -6633,6 +6634,8 @@ static void UpdatePingTable(void) if (lowest_lag < (tic_t)cv_mindelay.value) lowest_lag = (tic_t)cv_mindelay.value; + simulated_lag = lowest_lag; + pingmeasurecount++; } else // We're a client, handle mindelay on the way out. @@ -6643,9 +6646,12 @@ static void UpdatePingTable(void) tic_t mydelay = playerpingtable[consoleplayer]; if (mydelay < (tic_t)cv_mindelay.value) - lowest_lag = cv_mindelay.value - mydelay; + { + lowest_lag = ((tic_t)cv_mindelay.value - mydelay); + simulated_lag = (tic_t)cv_mindelay.value; + } else - lowest_lag = 0; + lowest_lag = simulated_lag = 0; } } diff --git a/src/d_clisrv.h b/src/d_clisrv.h index c24356e94..abef27904 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -586,6 +586,7 @@ extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; extern boolean server_lagless; +extern tic_t simulated_lag; extern tic_t lowest_lag; extern consvar_t cv_mindelay, cv_lagless; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index b22e69b2b..191aaee9f 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1198,7 +1198,7 @@ void HU_Ticker(void) || hu_redownloadinggamestate #endif ) - resynch_ticker++; //tic tic tic tic tic + resynch_ticker++; //tic tic tic tic tic HU_TickSongCredits(); } @@ -2289,22 +2289,6 @@ void HU_Drawer(void) if (gamestate != GS_LEVEL) return; - // draw the crosshair, not when viewing demos nor with chasecam - /*if (!automapactive && !demo.playback) - { - if (cv_crosshair.value && !camera[0].chase && !players[displayplayers[0]].spectator) - HU_DrawCrosshair(); - - if (cv_crosshair2.value && !camera[1].chase && !players[displayplayers[1]].spectator) - HU_DrawCrosshair2(); - - if (cv_crosshair3.value && !camera[2].chase && !players[displayplayers[2]].spectator) - HU_DrawCrosshair3(); - - if (cv_crosshair4.value && !camera[3].chase && !players[displayplayers[3]].spectator) - HU_DrawCrosshair4(); - }*/ - // draw song credits if (cv_songcredits.value) HU_DrawSongCredits(); @@ -2461,14 +2445,13 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) UINT8 barcolor = 31; // color we use for the bars (green, yellow, red or black) SINT8 i = 0; SINT8 yoffset = 6; - //INT32 dx; UINT32 lag = playerpingtable[pnum]; - const boolean gentleman = ((cv_mindelay.value && (lag < (tic_t)cv_mindelay.value) && P_IsLocalPlayer(&players[pnum])) || (pnum == serverplayer && lowest_lag != 0)); // for serverplayer lowest_lag actually reflects mindelay + const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)simulated_lag)); if (gentleman) { - lag = (pnum == serverplayer) ? lowest_lag : (tic_t)cv_mindelay.value; + lag = simulated_lag; } if (cv_pingstyle.value == 0) // kart @@ -2488,6 +2471,18 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) } else if (cv_pingstyle.value == 1) // old style ping { + if (vid.width >= 640) // how sad, we're using a shit resolution. + { + if (measureid == 1) + { + V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", Ping_conversion(lag))); + } + else if (measureid == 0) + { + V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", Ping_conversion(lag))); + } + } + if (cv_pingicon.value) { switch (lag) @@ -2517,23 +2512,9 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags) if (gentleman) { barcolor = 194; // make it purplish + // bars get indirectly set earlier } - } - if (vid.width >= 640) // how sad, we're using a shit resolution. - { - if (measureid == 1) - { - V_DrawRightAlignedSmallString(x+12, y+13, V_ALLOWLOWERCASE|flags, va("%dms", Ping_conversion(lag))); - } - else if (measureid == 0) - { - V_DrawRightAlignedSmallString(x+12, y+13, flags, va("d%d", Ping_conversion(lag))); - } - } - - if (cv_pingicon.value) - { for (i = 0; (i < 3); i++) // Draw the ping bar { V_DrawFill(x+2 *(i-1)+7, y+8+yoffset-4, 2, 8-yoffset, 31|flags); diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 934491e9c..51515bb20 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1469,7 +1469,7 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || ((cv_mindelay.value || (!server_lagless && lowest_lag != 0)) && consoleplayer == serverplayer && Playing()))) + if (cv_showping.value && ((netgame && consoleplayer != serverplayer) || (simulated_lag != 0 && consoleplayer == serverplayer && Playing()))) SCR_DisplayLocalPing(); } -- 2.54.0 From 8f342110c985546af47b9ac303448d49da3efbd6 Mon Sep 17 00:00:00 2001 From: Alug Date: Thu, 27 Feb 2025 19:40:32 +0100 Subject: [PATCH 14/15] color ping numbers for color hud --- src/hu_stuff.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 191aaee9f..d697a431c 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2403,12 +2403,10 @@ Ping_gfx_num (int lag) static const UINT8 * Ping_gfx_colormap (UINT32 lag, boolean gentleman) { - const UINT8 *colormap = NULL; + UINT8 *colormap = NULL; - if (gentleman) - { - colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PASTEL, GTC_CACHE); - } + if (K_UseColorHud()) + colormap = R_GetTranslationColormap(TC_RAINBOW, Ping_gfx_color(lag), GTC_CACHE); if (servermaxping && lag > servermaxping && hu_tick < 4) { -- 2.54.0 From 9ed242cde22cd5e2b7e1aa089262d4854a60716f Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 5 Mar 2025 10:27:09 +0100 Subject: [PATCH 15/15] where did this go? lel --- src/hu_stuff.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 1ca5b7099..e18f4e872 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2356,6 +2356,21 @@ Ping_gfx_num (int lag) return 4; } +static int +Ping_gfx_color (int lag) +{ + if (lag < 2) + return SKINCOLOR_JAWZ; + else if (lag < 4) + return SKINCOLOR_MINT; + else if (lag < 7) + return SKINCOLOR_GOLD; + else if (lag < 10) + return SKINCOLOR_RED; + else + return SKINCOLOR_WHITE; // SKINCOLOR_MAGENTA +} + static const UINT8 * Ping_gfx_colormap (UINT32 lag, boolean gentleman) { @@ -2384,7 +2399,6 @@ Ping_conversion (UINT32 lag) return lag; } - // // HU_drawPing // -- 2.54.0