HUD: fix delay indicator online

- As a bonus, the mindelay setting of other players is now
  visible to everyone
This commit is contained in:
James R 2024-04-27 04:23:04 -07:00
parent 64a4bcad34
commit 8103bd21c1
6 changed files with 61 additions and 67 deletions

View file

@ -6305,39 +6305,30 @@ static void UpdatePingTable(void)
}
}
// Don't gentleman below your mindelay
if (fastest < (tic_t)cv_mindelay.value)
fastest = (tic_t)cv_mindelay.value;
pingmeasurecount++;
if (server_lagless)
lowest_lag = 0;
else
{
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;
/*FALLTHRU*/
case 3:
realpingtable[nodetoplayer3[0]] = lag;
/*FALLTHRU*/
case 2:
realpingtable[nodetoplayer2[0]] = lag;
/*FALLTHRU*/
case 1:
realpingtable[nodetoplayer[0]] = lag;
}
switch (playerpernode[0])
{
case 4:
playerdelaytable[nodetoplayer4[0]] = lowest_lag;
/*FALLTHRU*/
case 3:
playerdelaytable[nodetoplayer3[0]] = lowest_lag;
/*FALLTHRU*/
case 2:
playerdelaytable[nodetoplayer2[0]] = lowest_lag;
/*FALLTHRU*/
case 1:
playerdelaytable[nodetoplayer[0]] = lowest_lag;
}
}
else // We're a client, handle mindelay on the way out.

View file

@ -2183,6 +2183,31 @@ Ping_gfx_color (int lag)
return SKINCOLOR_MAGENTA;
}
static const UINT8 *
Ping_gfx_colormap (UINT32 ping, UINT32 lag)
{
const UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, Ping_gfx_color(lag), GTC_CACHE);
if (servermaxping && ping > servermaxping && hu_tick < 4)
{
// flash ping red if too high
colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_WHITE, GTC_CACHE);
}
return colormap;
}
static UINT32
Ping_conversion (UINT32 lag)
{
if (cv_pingmeasurement.value)
{
lag = (INT32)(lag * (1000.00f / TICRATE));
}
return lag;
}
static int
PL_gfx_color (int pl)
{
@ -2199,20 +2224,13 @@ PL_gfx_color (int pl)
//
// HU_drawPing
//
void HU_drawPing(fixed_t x, fixed_t y, UINT32 lag, UINT32 pl, INT32 flags, boolean offline, SINT8 toside)
void HU_drawPing(fixed_t x, fixed_t y, UINT32 ping, UINT32 lag, UINT32 pl, INT32 flags, SINT8 toside)
{
UINT8 *colormap = NULL;
const UINT8 *colormap = NULL;
INT32 measureid = cv_pingmeasurement.value ? 1 : 0;
INT32 gfxnum; // gfx to draw
boolean drawlocal = (offline && cv_mindelay.value && lag <= (tic_t)cv_mindelay.value);
fixed_t x2, y2;
if (!server && lag <= (tic_t)cv_mindelay.value)
{
lag = cv_mindelay.value;
drawlocal = true;
}
x2 = x;
y2 = y + FRACUNIT;
@ -2244,7 +2262,7 @@ void HU_drawPing(fixed_t x, fixed_t y, UINT32 lag, UINT32 pl, INT32 flags, boole
}
}
gfxnum = Ping_gfx_num(lag);
gfxnum = Ping_gfx_num(ping);
if (pl)
{
@ -2257,7 +2275,7 @@ void HU_drawPing(fixed_t x, fixed_t y, UINT32 lag, UINT32 pl, INT32 flags, boole
);
}
if (drawlocal)
if (ping <= lag)
{
V_DrawFixedPatch(
x + (2 * FRACUNIT),
@ -2289,23 +2307,12 @@ void HU_drawPing(fixed_t x, fixed_t y, UINT32 lag, UINT32 pl, INT32 flags, boole
);
}
colormap = R_GetTranslationColormap(TC_RAINBOW, Ping_gfx_color(lag), GTC_CACHE);
if (servermaxping && lag > servermaxping && hu_tick < 4)
{
// flash ping red if too high
colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_WHITE, GTC_CACHE);
}
if (cv_pingmeasurement.value)
{
lag = (INT32)(lag * (1000.00f / TICRATE));
}
colormap = Ping_gfx_colormap(ping, lag);
x2 = V_DrawPingNum(
x2,
y2,
flags, lag,
flags, Ping_conversion(lag),
colormap
);
@ -2322,7 +2329,7 @@ void HU_drawPing(fixed_t x, fixed_t y, UINT32 lag, UINT32 pl, INT32 flags, boole
}
void
HU_drawMiniPing (INT32 x, INT32 y, UINT32 lag, INT32 flags)
HU_drawMiniPing (INT32 x, INT32 y, UINT32 ping, UINT32 lag, INT32 flags)
{
patch_t *patch;
INT32 w = BASEVIDWIDTH;
@ -2332,16 +2339,10 @@ HU_drawMiniPing (INT32 x, INT32 y, UINT32 lag, INT32 flags)
w /= 2;
}
// This looks kinda dumb, but basically:
// Servers with mindelay set modify the ping table.
// Clients with mindelay unset don't, because they can't.
// Both are affected by mindelay, but a client's lag value is pre-adjustment.
if (server && cv_mindelay.value && (tic_t)cv_mindelay.value <= lag)
patch = pinglocal[1];
else if (!server && cv_mindelay.value && (tic_t)cv_mindelay.value >= lag)
patch = pinglocal[1];
if (ping <= lag)
patch = pinglocal[1]; // stone shoe
else
patch = mping[Ping_gfx_num(lag)];
patch = mping[Ping_gfx_num(ping)];
if (( flags & V_SNAPTORIGHT ))
x += ( w - SHORT (patch->width) );

View file

@ -156,8 +156,8 @@ void HU_TickSongCredits(void);
char HU_dequeueChatChar(void);
void HU_Erase(void);
void HU_clearChatChars(void);
void HU_drawPing(fixed_t x, fixed_t y, UINT32 ping, UINT32 packetloss, INT32 flags, boolean offline, SINT8 toside); // Lat': Ping drawer for scoreboard.
void HU_drawMiniPing(INT32 x, INT32 y, UINT32 ping, INT32 flags);
void HU_drawPing(fixed_t x, fixed_t y, UINT32 ping, UINT32 lag, UINT32 packetloss, INT32 flags, SINT8 toside); // Lat': Ping drawer for scoreboard.
void HU_drawMiniPing(INT32 x, INT32 y, UINT32 ping, UINT32 lag, INT32 flags);
// CECHO interface.
void HU_ClearCEcho(void);

View file

@ -5535,7 +5535,9 @@ void K_drawKartFreePlay(void)
static void
Draw_party_ping (int ss, INT32 snap)
{
HU_drawMiniPing(0, 0, playerpingtable[displayplayers[ss]], V_SPLITSCREEN|V_SNAPTOTOP|snap);
UINT32 ping = playerpingtable[displayplayers[ss]];
UINT32 mindelay = playerdelaytable[displayplayers[ss]];
HU_drawMiniPing(0, 0, ping, std::max(ping, mindelay), V_SPLITSCREEN|V_SNAPTOTOP|snap);
}
static void

View file

@ -577,13 +577,13 @@ void SCR_DisplayLocalPing(void)
return;
}
UINT32 mindelay = playerdelaytable[consoleplayer];
UINT32 ping = playerpingtable[consoleplayer];
UINT32 pl = playerpacketlosstable[consoleplayer];
INT32 dispy = cv_ticrate.value ? 170 : 181;
boolean offline = (consoleplayer == serverplayer);
HU_drawPing(307 * FRACUNIT, dispy * FRACUNIT, ping, pl, V_SNAPTORIGHT | V_SNAPTOBOTTOM, offline, 0);
HU_drawPing(307 * FRACUNIT, dispy * FRACUNIT, ping, max(ping, mindelay), pl, V_SNAPTORIGHT | V_SNAPTOBOTTOM, 0);
}

View file

@ -716,14 +716,14 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 xoffset)
kp_cpu
);*/
}
else if (pnum != serverplayer || !server_lagless)
else
{
HU_drawPing(
(x2 - 2) * FRACUNIT, (y-2) * FRACUNIT,
playerpingtable[pnum],
playerdelaytable[pnum],
playerpacketlosstable[pnum],
0,
false,
(datarightofcolumn ? 1 : -1)
);
}