+ int i = 0;
+ vector h_pos = item_pos;
+ vector h_size = eX * panel_size.x + eY * hud_fontsize.y * 1.25;
+
+ bool complete = (this_team == NUM_SPECTATOR);
+
+ if(!complete)
+ if((sbt_highlight) && (!(pl_number % 2)))
+ drawfill(h_pos, h_size, rgb, sbt_highlight_alpha, DRAWFLAG_NORMAL);
+
+ vector pos = item_pos;
+ pos.x += hud_fontsize.x * 0.5;
+ pos.y += (1.25 - 1) / 2 * hud_fontsize.y; // center text vertically
+
+ float width_limit = item_pos.x + panel_size.x - hud_fontsize.x;
+ if(!complete)
+ width_limit -= stringwidth("...", false, hud_fontsize);
+ float namesize = autocvar_hud_panel_scoreboard_namesize * hud_fontsize.x;
+ static float max_name_width = 0;
+ string field = "";
+ float fieldsize = 0;
+ float min_fieldsize = 0;
+ float fieldpadding = hud_fontsize.x * 0.25;
+ if(this_team == NUM_SPECTATOR)
+ {
+ if(autocvar_hud_panel_scoreboard_spectators_showping)
+ min_fieldsize = stringwidth("999", false, hud_fontsize);
+ }
+ else if(autocvar_hud_panel_scoreboard_others_showscore)
+ min_fieldsize = stringwidth("99", false, hud_fontsize);
+ for(i = 0; pl; pl = pl.sort_next)
+ {
+ if(pl.team != this_team)
+ continue;
+ if(pl == ignored_pl)
+ continue;
+
+ field = "";
+ if(this_team == NUM_SPECTATOR)
+ {
+ if(autocvar_hud_panel_scoreboard_spectators_showping)
+ field = Scoreboard_GetField(pl, SP_PING);
+ }
+ else if(autocvar_hud_panel_scoreboard_others_showscore)
+ field = ftos(pl.(scores(ps_primary)));
+
+ string str = textShortenToWidth(entcs_GetName(pl.sv_entnum), namesize, hud_fontsize, stringwidth_colors);
+ float column_width = stringwidth(str, true, hud_fontsize);
+ if((this_team == NUM_SPECTATOR) && autocvar_hud_panel_scoreboard_spectators_aligned)
+ {
+ if(column_width > max_name_width)
+ max_name_width = column_width;
+ column_width = max_name_width;
+ }
+ if(field != "")
+ {
+ fieldsize = stringwidth(field, false, hud_fontsize);
+ column_width += hud_fontsize.x * 0.25 + max(fieldsize, min_fieldsize) + 2 * fieldpadding;
+ }
+
+ if(pos.x + column_width > width_limit)
+ {
+ ++i;
+ if(!complete)
+ {
+ drawstring(pos, "...", hud_fontsize, '1 1 1', sbt_fg_alpha, DRAWFLAG_NORMAL);
+ break;
+ }
+ else
+ {
+ pos.x = item_pos.x + hud_fontsize.x * 0.5;
+ pos.y += hud_fontsize.y * 1.25;
+ }
+ }
+
+ vector name_pos = pos;
+ if((this_team == NUM_SPECTATOR) && autocvar_hud_panel_scoreboard_spectators_aligned)
+ name_pos.x += max(fieldsize, min_fieldsize) + 2 * fieldpadding + hud_fontsize.x * 0.25;
+ drawcolorcodedstring(name_pos, str, hud_fontsize, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ if(field != "")
+ {
+ h_size.x = max(fieldsize, min_fieldsize) + 2 * fieldpadding;
+ h_size.y = hud_fontsize.y;
+ vector field_pos = pos;
+ if(!((this_team == NUM_SPECTATOR) && autocvar_hud_panel_scoreboard_spectators_aligned))
+ field_pos.x += column_width - h_size.x;
+ if(sbt_highlight)
+ drawfill(field_pos, h_size, '1 1 1', sbt_highlight_alpha, DRAWFLAG_NORMAL);
+ field_pos.x += fieldpadding + (max(fieldsize, min_fieldsize) - fieldsize) * 0.5;
+ drawstring(field_pos, field, hud_fontsize, sbt_field_rgb, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ }
+ pos.x += column_width;
+ pos.x += hud_fontsize.x;
+ }
+ return eX * item_pos.x + eY * (item_pos.y + i * hud_fontsize.y * 1.25);
+}
+
+vector Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_size)
+{
+ int max_players = 999;
+ if(autocvar_hud_panel_scoreboard_maxheight > 0)
+ {
+ max_players = autocvar_hud_panel_scoreboard_maxheight * vid_conheight;
+ if(teamplay)
+ max_players = (max_players - hud_fontsize.y * 1.25 - panel_bg_padding * 2) / 2;
+ max_players = floor(max_players / (hud_fontsize.y * 1.25));
+ if(max_players <= 1)
+ max_players = 1;
+ if(max_players == tm.team_size)
+ max_players = 999;
+ }