mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-01-13 13:21:31 +00:00
Ping measured in frame delay instead of milliseconds
The part of HOSTMOD ministats that I wanted. Can go back to ms using the pingmeasurement cvar. If Tyron wants to bring ministats fully in I think it'd be better to bring its ideas to replace the current HUD instead, ideally using the existing ping gfx, so they should bring it up with Oni # Conflicts: # src/d_clisrv.c # src/d_netcmd.c # src/d_netcmd.h # src/doomstat.h # src/hu_stuff.c # src/m_menu.c
This commit is contained in:
parent
e1e48b71e2
commit
eea0df0ba2
6 changed files with 83 additions and 393 deletions
|
@ -98,13 +98,14 @@ 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.
|
||||
tic_t servermaxping = 800; // server's max ping. Defaults to 800
|
||||
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)
|
||||
SINT8 nodetoplayer4[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 3)
|
||||
UINT8 playerpernode[MAXNETNODES]; // used specialy for splitscreen
|
||||
boolean nodeingame[MAXNETNODES]; // set false as nodes leave game
|
||||
|
||||
tic_t servermaxping = 20; // server's max delay, in frames. Defaults to 20
|
||||
static tic_t nettics[MAXNETNODES]; // what tic the client have received
|
||||
static tic_t supposedtics[MAXNETNODES]; // nettics prevision for smaller packet
|
||||
static UINT8 nodewaiting[MAXNETNODES];
|
||||
|
@ -3582,7 +3583,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
|||
kickreason = KR_KICK;
|
||||
break;
|
||||
case KICK_MSG_PING_HIGH:
|
||||
HU_AddChatText(va("\x82*%s left the game (Broke ping limit)", player_names[pnum]), false);
|
||||
HU_AddChatText(va("\x82*%s left the game (Broke delay limit)", player_names[pnum]), false);
|
||||
kickreason = KR_PINGLIMIT;
|
||||
break;
|
||||
case KICK_MSG_CON_FAIL:
|
||||
|
@ -3661,7 +3662,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
|||
if (msg == KICK_MSG_CON_FAIL)
|
||||
M_StartMessage(M_GetText("Server closed connection\n(Synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||
else if (msg == KICK_MSG_PING_HIGH)
|
||||
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||
M_StartMessage(M_GetText("Server closed connection\n(Broke delay limit)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||
else if (msg == KICK_MSG_BANNED)
|
||||
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
|
||||
else if (msg == KICK_MSG_CUSTOM_KICK)
|
||||
|
@ -6015,7 +6016,7 @@ static void UpdatePingTable(void)
|
|||
// update node latency values so we can take an average later.
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i])
|
||||
realpingtable[i] += (INT32)(GetLag(playernode[i]) * (1000.00f/TICRATE)); // TicsToMilliseconds can't handle pings over 1000ms lol
|
||||
realpingtable[i] += GetLag(playernode[i]);
|
||||
pingmeasurecount++;
|
||||
}
|
||||
}
|
||||
|
|
23
src/d_net.c
23
src/d_net.c
|
@ -1386,6 +1386,7 @@ struct pingcell
|
|||
{
|
||||
INT32 num;
|
||||
INT32 ms;
|
||||
INT32 f;
|
||||
};
|
||||
|
||||
static int pingcellcmp(const void *va, const void *vb)
|
||||
|
@ -1409,6 +1410,7 @@ void Command_Ping_f(void)
|
|||
INT32 pingc;
|
||||
|
||||
int name_width = 0;
|
||||
int f_width = 0;
|
||||
int ms_width = 0;
|
||||
|
||||
int n;
|
||||
|
@ -1416,20 +1418,34 @@ void Command_Ping_f(void)
|
|||
|
||||
pingc = 0;
|
||||
for (i = 1; i < MAXPLAYERS; ++i)
|
||||
{
|
||||
if (playeringame[i])
|
||||
{
|
||||
INT32 ms;
|
||||
|
||||
n = strlen(player_names[i]);
|
||||
if (n > name_width)
|
||||
name_width = n;
|
||||
|
||||
n = playerpingtable[i];
|
||||
if (n > f_width)
|
||||
f_width = n;
|
||||
|
||||
ms = (INT32)(playerpingtable[i] * (1000.00f / TICRATE));
|
||||
n = ms;
|
||||
if (n > ms_width)
|
||||
ms_width = n;
|
||||
|
||||
pingv[pingc].num = i;
|
||||
pingv[pingc].ms = playerpingtable[i];
|
||||
pingv[pingc].f = playerpingtable[i];
|
||||
pingv[pingc].ms = ms;
|
||||
pingc++;
|
||||
}
|
||||
}
|
||||
|
||||
if (f_width < 10) f_width = 1;
|
||||
else if (f_width < 100) f_width = 2;
|
||||
else f_width = 3;
|
||||
|
||||
if (ms_width < 10) ms_width = 1;
|
||||
else if (ms_width < 100) ms_width = 2;
|
||||
|
@ -1439,15 +1455,16 @@ void Command_Ping_f(void)
|
|||
|
||||
for (i = 0; i < pingc; ++i)
|
||||
{
|
||||
CONS_Printf("%02d : %-*s %*d ms\n",
|
||||
CONS_Printf("%02d : %-*s %*d frames (%*d ms)\n",
|
||||
pingv[i].num,
|
||||
name_width, player_names[pingv[i].num],
|
||||
f_width, pingv[i].f,
|
||||
ms_width, pingv[i].ms);
|
||||
}
|
||||
|
||||
if (!server && playeringame[consoleplayer])
|
||||
{
|
||||
CONS_Printf("\nYour ping is %d ms\n", playerpingtable[consoleplayer]);
|
||||
CONS_Printf("\nYour ping is %d frames (%d ms)\n", playerpingtable[consoleplayer], (INT32)(playerpingtable[i] * (1000.00f / TICRATE)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -450,16 +450,18 @@ static CV_PossibleValue_t nettimeout_cons_t[] = {{TICRATE/7, "MIN"}, {60*TICRATE
|
|||
consvar_t cv_nettimeout = {"nettimeout", "210", CV_CALL|CV_SAVE, nettimeout_cons_t, NetTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
//static CV_PossibleValue_t jointimeout_cons_t[] = {{5*TICRATE, "MIN"}, {60*TICRATE, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_jointimeout = {"jointimeout", "210", CV_CALL|CV_SAVE, nettimeout_cons_t, JoinTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
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_maxping = {"maxdelay", "20", CV_SAVE, CV_Unsigned, 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};
|
||||
consvar_t cv_pingtimeout = {"maxdelaytimeout", "10", CV_SAVE, pingtimeout_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// show your ping on the HUD next to framerate. Defaults to warning only (shows up if your ping is > maxping)
|
||||
static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}};
|
||||
consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}};
|
||||
consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// Intermission time Tails 04-19-2002
|
||||
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_inttime = {"inttime", "20", CV_NETVAR, inttime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
@ -718,6 +720,7 @@ void D_RegisterServerCommands(void)
|
|||
CV_RegisterVar(&cv_maxping);
|
||||
CV_RegisterVar(&cv_pingtimeout);
|
||||
CV_RegisterVar(&cv_showping);
|
||||
CV_RegisterVar(&cv_pingmeasurement);
|
||||
|
||||
#ifdef SEENAMES
|
||||
CV_RegisterVar(&cv_allowseenames);
|
||||
|
|
|
@ -148,6 +148,7 @@ extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionb
|
|||
extern consvar_t cv_maxping;
|
||||
extern consvar_t cv_pingtimeout;
|
||||
extern consvar_t cv_showping;
|
||||
extern consvar_t cv_pingmeasurement;
|
||||
|
||||
extern consvar_t cv_skipmapcheck;
|
||||
|
||||
|
|
400
src/hu_stuff.c
400
src/hu_stuff.c
|
@ -79,6 +79,7 @@ patch_t *cred_font[CRED_FONTSIZE];
|
|||
// Note: I'd like to adress that at this point we might *REALLY* want to work towards a common drawString function that can take any font we want because this is really turning into a MESS. :V -Lat'
|
||||
patch_t *pingnum[10];
|
||||
patch_t *pinggfx[5]; // small ping graphic
|
||||
patch_t *pingmeasure[2]; // ping measurement graphic
|
||||
|
||||
patch_t *framecounter;
|
||||
patch_t *frameslash; // framerate stuff. Used in screen.c
|
||||
|
@ -320,6 +321,9 @@ void HU_LoadGraphics(void)
|
|||
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||
}
|
||||
|
||||
pingmeasure[0] = W_CachePatchName("PINGF", PU_HUDGFX);
|
||||
pingmeasure[1] = W_CachePatchName("PINGMS", PU_HUDGFX);
|
||||
|
||||
// fps stuff
|
||||
framecounter = W_CachePatchName("FRAMER", PU_HUDGFX);
|
||||
frameslash = W_CachePatchName("FRAMESL", PU_HUDGFX);;
|
||||
|
@ -2521,384 +2525,50 @@ void HU_Erase(void)
|
|||
// IN-LEVEL MULTIPLAYER RANKINGS
|
||||
//======================================================================
|
||||
|
||||
static int
|
||||
Ping_gfx_num (int lag)
|
||||
{
|
||||
if (lag < 2)
|
||||
return 0;
|
||||
else if (lag < 4)
|
||||
return 1;
|
||||
else if (lag < 7)
|
||||
return 2;
|
||||
else if (lag < 10)
|
||||
return 3;
|
||||
else
|
||||
return 4;
|
||||
}
|
||||
|
||||
//
|
||||
// HU_drawPing
|
||||
//
|
||||
void HU_drawPing(INT32 x, INT32 y, UINT32 ping, INT32 flags)
|
||||
|
||||
void HU_drawPing(INT32 x, INT32 y, UINT32 lag, INT32 flags)
|
||||
{
|
||||
INT32 gfxnum = 4; // gfx to draw
|
||||
UINT8 const *colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SALMON, GTC_CACHE);
|
||||
UINT8 *colormap = NULL;
|
||||
INT32 measureid = cv_pingmeasurement.value ? 1 : 0;
|
||||
INT32 gfxnum; // gfx to draw
|
||||
|
||||
if (ping < 76)
|
||||
gfxnum = 0;
|
||||
else if (ping < 137)
|
||||
gfxnum = 1;
|
||||
else if (ping < 256)
|
||||
gfxnum = 2;
|
||||
else if (ping < 500)
|
||||
gfxnum = 3;
|
||||
gfxnum = Ping_gfx_num(lag);
|
||||
|
||||
V_DrawScaledPatch(x, y, flags, pinggfx[gfxnum]);
|
||||
if (servermaxping && ping > servermaxping && hu_tick < 4) // flash ping red if too high
|
||||
V_DrawPingNum(x, y+9, flags, ping, colormap);
|
||||
else
|
||||
V_DrawPingNum(x, y+9, flags, ping, NULL);
|
||||
V_DrawScaledPatch(x+11 - pingmeasure[measureid]->width, y+9, flags, pingmeasure[measureid]);
|
||||
V_DrawScaledPatch(x+2, y, flags, pinggfx[gfxnum]);
|
||||
|
||||
if (servermaxping && lag > servermaxping && hu_tick < 4)
|
||||
{
|
||||
// flash ping red if too high
|
||||
colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_RASPBERRY, GTC_CACHE);
|
||||
}
|
||||
|
||||
//
|
||||
// HU_DrawTabRankings -- moved to k_kart.c
|
||||
//
|
||||
|
||||
//
|
||||
// HU_DrawTeamTabRankings
|
||||
//
|
||||
/*void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
||||
if (cv_pingmeasurement.value)
|
||||
{
|
||||
INT32 i,x,y;
|
||||
INT32 redplayers = 0, blueplayers = 0;
|
||||
boolean smol = false;
|
||||
const UINT8 *colormap;
|
||||
char name[MAXPLAYERNAME+1];
|
||||
|
||||
// before we draw, we must count how many players are in each team. It makes an additional loop, but we need to know if we have to draw a big or a small ranking.
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (players[tab[i].num].spectator)
|
||||
continue; //ignore them.
|
||||
|
||||
if (tab[i].color == skincolor_redteam) //red
|
||||
{
|
||||
if (redplayers++ > 8)
|
||||
{
|
||||
smol = true;
|
||||
break; // don't make more loops than we need to.
|
||||
}
|
||||
}
|
||||
else if (tab[i].color == skincolor_blueteam) //blue
|
||||
{
|
||||
if (blueplayers++ > 8)
|
||||
{
|
||||
smol = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else //er? not on red or blue, so ignore them
|
||||
continue;
|
||||
|
||||
lag = (INT32)(lag * (1000.00f / TICRATE));
|
||||
}
|
||||
|
||||
// I'll be blunt with you, this may add more lines, but I'm not adding weird cases for this, so we're executing a separate function.
|
||||
if (smol == true || cv_compactscoreboard.value)
|
||||
{
|
||||
HU_Draw32TeamTabRankings(tab, whiteplayer);
|
||||
return;
|
||||
V_DrawPingNum(x+11 - pingmeasure[measureid]->width, y+9, flags, lag, colormap);
|
||||
}
|
||||
|
||||
V_DrawFill(160, 26, 1, 154, 0); //Draw a vertical line to separate the two teams.
|
||||
V_DrawFill(1, 26, 318, 1, 0); //And a horizontal line to make a T.
|
||||
V_DrawFill(1, 180, 318, 1, 0); //And a horizontal line near the bottom.
|
||||
|
||||
i=0, redplayers=0, blueplayers=0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (players[tab[i].num].spectator)
|
||||
continue; //ignore them.
|
||||
|
||||
if (tab[i].color == skincolor_redteam) //red
|
||||
{
|
||||
if (redplayers++ > 8)
|
||||
continue;
|
||||
x = 32 + (BASEVIDWIDTH/2);
|
||||
y = (redplayers * 16) + 16;
|
||||
}
|
||||
else if (tab[i].color == skincolor_blueteam) //blue
|
||||
{
|
||||
if (blueplayers++ > 8)
|
||||
continue;
|
||||
x = 32;
|
||||
y = (blueplayers * 16) + 16;
|
||||
}
|
||||
else //er? not on red or blue, so ignore them
|
||||
continue;
|
||||
|
||||
strlcpy(name, tab[i].name, 7);
|
||||
V_DrawString(x + 20, y,
|
||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||
| ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| V_ALLOWLOWERCASE, name);
|
||||
|
||||
if (gametype == GT_CTF)
|
||||
{
|
||||
if (players[tab[i].num].gotflag & GF_REDFLAG) // Red
|
||||
V_DrawSmallScaledPatch(x-28, y-4, 0, rflagico);
|
||||
else if (players[tab[i].num].gotflag & GF_BLUEFLAG) // Blue
|
||||
V_DrawSmallScaledPatch(x-28, y-4, 0, bflagico);
|
||||
}
|
||||
|
||||
// Draw emeralds
|
||||
if (!players[tab[i].num].powers[pw_super]
|
||||
|| ((leveltime/7) & 1))
|
||||
{
|
||||
HU_DrawEmeralds(x-12,y+2,tab[i].emeralds);
|
||||
}
|
||||
|
||||
if (players[tab[i].num].powers[pw_super])
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, facewantprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
if (players[tab[i].num].health <= 0)
|
||||
V_DrawSmallTranslucentMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap);
|
||||
else
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
V_DrawRightAlignedThinString(x+120, y-1, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
if (!splitscreen)
|
||||
{
|
||||
if (!(tab[i].num == serverplayer))
|
||||
HU_drawPing(x+ 113, y+2, playerpingtable[tab[i].num], false);
|
||||
}
|
||||
V_DrawRightAlignedThinString(x+100, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
if (!splitscreen)
|
||||
{
|
||||
if (!(tab[i].num == serverplayer))
|
||||
HU_drawPing(x+ 113, y+2, playerpingtable[tab[i].num], false);
|
||||
//else
|
||||
// V_DrawSmallString(x+ 94, y+4, V_YELLOWMAP, "SERVER");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// HU_DrawDualTabRankings
|
||||
//
|
||||
void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer)
|
||||
{
|
||||
INT32 i;
|
||||
const UINT8 *colormap;
|
||||
char name[MAXPLAYERNAME+1];
|
||||
|
||||
V_DrawFill(160, 26, 1, 154, 0); //Draw a vertical line to separate the two sides.
|
||||
V_DrawFill(1, 26, 318, 1, 0); //And a horizontal line to make a T.
|
||||
V_DrawFill(1, 180, 318, 1, 0); //And a horizontal line near the bottom.
|
||||
|
||||
for (i = 0; i < scorelines; i++)
|
||||
{
|
||||
if (players[tab[i].num].spectator)
|
||||
continue; //ignore them.
|
||||
|
||||
strlcpy(name, tab[i].name, 7);
|
||||
if (!(tab[i].num == serverplayer))
|
||||
HU_drawPing(x+ 113, y+2, playerpingtable[tab[i].num], false);
|
||||
//else
|
||||
// V_DrawSmallString(x+ 94, y+4, V_YELLOWMAP, "SERVER");
|
||||
|
||||
V_DrawString(x + 20, y,
|
||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||
| ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| V_ALLOWLOWERCASE, name);
|
||||
|
||||
if (G_GametypeUsesLives()) //show lives
|
||||
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE, va("%dx", players[tab[i].num].lives));
|
||||
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
||||
V_DrawSmallScaledPatch(x-28, y-4, 0, tagico);
|
||||
|
||||
// Draw emeralds
|
||||
if (!players[tab[i].num].powers[pw_super]
|
||||
|| ((leveltime/7) & 1))
|
||||
{
|
||||
HU_DrawEmeralds(x-12,y+2,tab[i].emeralds);
|
||||
}
|
||||
|
||||
//V_DrawSmallScaledPatch (x, y-4, 0, livesback);
|
||||
if (tab[i].color == 0)
|
||||
{
|
||||
colormap = colormaps;
|
||||
if (players[tab[i].num].powers[pw_super])
|
||||
V_DrawSmallScaledPatch (x, y-4, 0, facewantprefix[players[tab[i].num].skin]);
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].health <= 0)
|
||||
V_DrawSmallTranslucentPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin]);
|
||||
else
|
||||
V_DrawSmallScaledPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].powers[pw_super])
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, facewantprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
if (players[tab[i].num].health <= 0)
|
||||
V_DrawSmallTranslucentMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap);
|
||||
else
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
}
|
||||
|
||||
// All data drawn with thin string for space.
|
||||
if (G_RaceGametype())
|
||||
{
|
||||
if (circuitmap)
|
||||
{
|
||||
if (players[tab[i].num].exiting)
|
||||
V_DrawRightAlignedThinString(x+146, y, 0, va("%i:%02i.%02i", G_TicsToMinutes(players[tab[i].num].realtime,true), G_TicsToSeconds(players[tab[i].num].realtime), G_TicsToCentiseconds(players[tab[i].num].realtime)));
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+146, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+146, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%i:%02i.%02i", G_TicsToMinutes(tab[i].count,true), G_TicsToSeconds(tab[i].count), G_TicsToCentiseconds(tab[i].count)));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+100, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
|
||||
y += 16;
|
||||
if (y > 160)
|
||||
{
|
||||
y = 32;
|
||||
x += BASEVIDWIDTH/2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// HU_Draw32TabRankings
|
||||
//
|
||||
static void HU_Draw32TabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer)
|
||||
{
|
||||
INT32 i;
|
||||
const UINT8 *colormap;
|
||||
char name[MAXPLAYERNAME+1];
|
||||
|
||||
V_DrawFill(160, 26, 1, 154, 0); //Draw a vertical line to separate the two sides.
|
||||
V_DrawFill(1, 26, 318, 1, 0); //And a horizontal line to make a T.
|
||||
V_DrawFill(1, 180, 318, 1, 0); //And a horizontal line near the bottom.
|
||||
|
||||
for (i = 0; i < scorelines; i++)
|
||||
{
|
||||
if (players[tab[i].num].spectator)
|
||||
continue; //ignore them.
|
||||
|
||||
strlcpy(name, tab[i].name, 7);
|
||||
if (!splitscreen) // don't draw it on splitscreen,
|
||||
{
|
||||
if (!(tab[i].num == serverplayer))
|
||||
HU_drawPing(x+ 135, y+3, playerpingtable[tab[i].num], true);
|
||||
//else
|
||||
// V_DrawSmallString(x+ 129, y+4, V_YELLOWMAP, "HOST");
|
||||
}
|
||||
|
||||
V_DrawString(x + 10, y,
|
||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||
| ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| V_ALLOWLOWERCASE, name);
|
||||
|
||||
if (G_GametypeUsesLives()) //show lives
|
||||
V_DrawRightAlignedThinString(x-1, y, V_ALLOWLOWERCASE, va("%d", players[tab[i].num].lives));
|
||||
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
||||
V_DrawFixedPatch((x-10)*FRACUNIT, (y)*FRACUNIT, FRACUNIT/4, 0, tagico, 0);
|
||||
|
||||
// Draw emeralds
|
||||
if (!players[tab[i].num].powers[pw_super]
|
||||
|| ((leveltime/7) & 1))
|
||||
{
|
||||
HU_Draw32Emeralds(x+60, y+2, tab[i].emeralds);
|
||||
//HU_DrawEmeralds(x-12,y+2,tab[i].emeralds);
|
||||
}
|
||||
|
||||
//V_DrawSmallScaledPatch (x, y-4, 0, livesback);
|
||||
if (tab[i].color == 0)
|
||||
{
|
||||
colormap = colormaps;
|
||||
if (players[tab[i].num].powers[pw_super])
|
||||
V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT/4, 0, superprefix[players[tab[i].num].skin], 0);
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].health <= 0)
|
||||
V_DrawFixedPatch(x*FRACUNIT, (y)*FRACUNIT, FRACUNIT/4, V_HUDTRANSHALF, faceprefix[players[tab[i].num].skin], 0);
|
||||
else
|
||||
V_DrawFixedPatch(x*FRACUNIT, (y)*FRACUNIT, FRACUNIT/4, 0, faceprefix[players[tab[i].num].skin], 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].powers[pw_super])
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT/4, 0, superprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
if (players[tab[i].num].health <= 0)
|
||||
V_DrawFixedPatch(x*FRACUNIT, (y)*FRACUNIT, FRACUNIT/4, V_HUDTRANSHALF, faceprefix[players[tab[i].num].skin], colormap);
|
||||
else
|
||||
V_DrawFixedPatch(x*FRACUNIT, (y)*FRACUNIT, FRACUNIT/4, 0, faceprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
}
|
||||
|
||||
// All data drawn with thin string for space.
|
||||
if (gametype == GT_RACE)
|
||||
{
|
||||
if (circuitmap)
|
||||
{
|
||||
if (players[tab[i].num].exiting)
|
||||
V_DrawRightAlignedThinString(x+128, y, 0, va("%i:%02i.%02i", G_TicsToMinutes(players[tab[i].num].realtime,true), G_TicsToSeconds(players[tab[i].num].realtime), G_TicsToCentiseconds(players[tab[i].num].realtime)));
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+128, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+128, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%i:%02i.%02i", G_TicsToMinutes(tab[i].count,true), G_TicsToSeconds(tab[i].count), G_TicsToCentiseconds(tab[i].count)));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+128, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
|
||||
y += 9;
|
||||
if (i == 16)
|
||||
{
|
||||
y = 32;
|
||||
x += BASEVIDWIDTH/2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// HU_DrawEmeralds
|
||||
//
|
||||
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds)
|
||||
{
|
||||
//Draw the emeralds, in the CORRECT order, using tiny emerald sprites.
|
||||
if (pemeralds & EMERALD1)
|
||||
V_DrawSmallScaledPatch(x , y-6, 0, tinyemeraldpics[0]);
|
||||
|
||||
if (pemeralds & EMERALD2)
|
||||
V_DrawSmallScaledPatch(x+4, y-3, 0, tinyemeraldpics[1]);
|
||||
|
||||
if (pemeralds & EMERALD3)
|
||||
V_DrawSmallScaledPatch(x+4, y+3, 0, tinyemeraldpics[2]);
|
||||
|
||||
if (pemeralds & EMERALD4)
|
||||
V_DrawSmallScaledPatch(x , y+6, 0, tinyemeraldpics[3]);
|
||||
|
||||
if (pemeralds & EMERALD5)
|
||||
V_DrawSmallScaledPatch(x-4, y+3, 0, tinyemeraldpics[4]);
|
||||
|
||||
if (pemeralds & EMERALD6)
|
||||
V_DrawSmallScaledPatch(x-4, y-3, 0, tinyemeraldpics[5]);
|
||||
|
||||
if (pemeralds & EMERALD7)
|
||||
V_DrawSmallScaledPatch(x, y, 0, tinyemeraldpics[6]);
|
||||
}*/
|
||||
|
||||
//
|
||||
// HU_DrawSpectatorTicker
|
||||
//
|
||||
|
|
|
@ -1528,8 +1528,8 @@ static menuitem_t OP_AdvServerOptionsMenu[] =
|
|||
NULL, "Server Browser Address", &cv_masterserver, 10},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Attempts to resynchronise", &cv_resynchattempts, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping limit (ms)", &cv_maxping, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping timeout (s)", &cv_pingtimeout, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Delay limit (frames)", &cv_maxping, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Delay timeout (s)", &cv_pingtimeout, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Connection timeout (tics)", &cv_nettimeout, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Join timeout (tics)", &cv_jointimeout, 80},
|
||||
|
||||
|
@ -2409,8 +2409,6 @@ static void M_ChangeCvar(INT32 choice)
|
|||
choice *= (TICRATE/7);
|
||||
else if (cv == &cv_maxsend)
|
||||
choice *= 512;
|
||||
else if (cv == &cv_maxping)
|
||||
choice *= 50;
|
||||
#endif
|
||||
CV_AddValue(cv,choice);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue