Skip to content

Commit

Permalink
Merge pull request ddnet#8683 from archimede67/fix-teamcount-sb
Browse files Browse the repository at this point in the history
Fix invalid team count in scoreboard for split teams
  • Loading branch information
heinrich5991 authored Aug 4, 2024
2 parents 00d941a + 79ff930 commit 585615a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 14 deletions.
25 changes: 12 additions & 13 deletions src/game/client/components/scoreboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ void CScoreboard::RenderSpectators(CUIRect Spectators)
}
}

void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd)
void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd, CScoreboardRenderState &State)
{
dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid");

Expand Down Expand Up @@ -319,12 +319,10 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart,
// render player entries
int CountRendered = 0;
int PrevDDTeam = -1;
int CurrentDDTeamSize = 0;
int &CurrentDDTeamSize = State.m_CurrentDDTeamSize;

char aBuf[64];
int MaxTeamSize = m_pClient->Config()->m_SvMaxTeamSize;
static float s_TeamStartY = 0;
static float s_TeamStartX = 0;

for(int i = 0; i < MAX_CLIENTS; i++)
{
Expand Down Expand Up @@ -374,8 +372,8 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart,
if(PrevDDTeam != DDTeam)
{
TeamRectCorners |= IGraphics::CORNER_T;
s_TeamStartY = Row.y;
s_TeamStartX = Row.x;
State.m_TeamStartX = Row.x;
State.m_TeamStartY = Row.y;
}
if(NextDDTeam != DDTeam)
TeamRectCorners |= IGraphics::CORNER_B;
Expand All @@ -395,7 +393,7 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart,
str_format(aBuf, sizeof(aBuf), "%d", DDTeam);
else
str_format(aBuf, sizeof(aBuf), Localize("%d\n(%d/%d)", "Team and size"), DDTeam, CurrentDDTeamSize, MaxTeamSize);
TextRender()->Text(s_TeamStartX, maximum(s_TeamStartY + Row.h / 2.0f - TeamFontSize, s_TeamStartY + 3.0f /* padding top */), TeamFontSize, aBuf);
TextRender()->Text(State.m_TeamStartX, maximum(State.m_TeamStartY + Row.h / 2.0f - TeamFontSize, State.m_TeamStartY + 3.0f /* padding top */), TeamFontSize, aBuf);
}
else
{
Expand Down Expand Up @@ -588,6 +586,7 @@ void CScoreboard::OnRender()
const float TitleHeight = 60.0f;

CUIRect Scoreboard = {(Width - ScoreboardWidth) / 2.0f, 150.0f, ScoreboardWidth, 710.0f + TitleHeight};
CScoreboardRenderState RenderState{};

if(Teams)
{
Expand Down Expand Up @@ -647,8 +646,8 @@ void CScoreboard::OnRender()

RenderTitle(RedTitle, TEAM_RED, pRedTeamName == nullptr ? Localize("Red team") : pRedTeamName);
RenderTitle(BlueTitle, TEAM_BLUE, pBlueTeamName == nullptr ? Localize("Blue team") : pBlueTeamName);
RenderScoreboard(RedScoreboard, TEAM_RED, 0, NumPlayers);
RenderScoreboard(BlueScoreboard, TEAM_BLUE, 0, NumPlayers);
RenderScoreboard(RedScoreboard, TEAM_RED, 0, NumPlayers, RenderState);
RenderScoreboard(BlueScoreboard, TEAM_BLUE, 0, NumPlayers, RenderState);
}
else
{
Expand All @@ -670,7 +669,7 @@ void CScoreboard::OnRender()

if(NumPlayers <= 16)
{
RenderScoreboard(Scoreboard, TEAM_RED, 0, NumPlayers);
RenderScoreboard(Scoreboard, TEAM_RED, 0, NumPlayers, RenderState);
}
else if(NumPlayers <= 64)
{
Expand All @@ -686,8 +685,8 @@ void CScoreboard::OnRender()

CUIRect LeftScoreboard, RightScoreboard;
Scoreboard.VSplitMid(&LeftScoreboard, &RightScoreboard);
RenderScoreboard(LeftScoreboard, TEAM_RED, 0, PlayersPerSide);
RenderScoreboard(RightScoreboard, TEAM_RED, PlayersPerSide, 2 * PlayersPerSide);
RenderScoreboard(LeftScoreboard, TEAM_RED, 0, PlayersPerSide, RenderState);
RenderScoreboard(RightScoreboard, TEAM_RED, PlayersPerSide, 2 * PlayersPerSide, RenderState);
}
else
{
Expand All @@ -698,7 +697,7 @@ void CScoreboard::OnRender()
{
CUIRect Column;
RemainingScoreboard.VSplitLeft(Scoreboard.w / NumColumns, &Column, &RemainingScoreboard);
RenderScoreboard(Column, TEAM_RED, i * PlayersPerColumn, (i + 1) * PlayersPerColumn);
RenderScoreboard(Column, TEAM_RED, i * PlayersPerColumn, (i + 1) * PlayersPerColumn, RenderState);
}
}
}
Expand Down
12 changes: 11 additions & 1 deletion src/game/client/components/scoreboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,20 @@

class CScoreboard : public CComponent
{
struct CScoreboardRenderState
{
float m_TeamStartX;
float m_TeamStartY;
int m_CurrentDDTeamSize;

CScoreboardRenderState() :
m_TeamStartX(0), m_TeamStartY(0), m_CurrentDDTeamSize(0) {}
};

void RenderTitle(CUIRect TitleBar, int Team, const char *pTitle);
void RenderGoals(CUIRect Goals);
void RenderSpectators(CUIRect Spectators);
void RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd);
void RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd, CScoreboardRenderState &State);
void RenderRecordingNotification(float x);

static void ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData);
Expand Down

0 comments on commit 585615a

Please sign in to comment.