X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fscoreboard.qc;h=9e07eed7e2d59b13cfdfeb20d7d0b259a1cd2ffd;hp=0e5ee12939b8d5a53527b720ae2663788eba706f;hb=d0f1828690a64d01143d4ab4f257d643456d02bf;hpb=070d139d5e21264d1ac91a6c96631c933f092861 diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index 0e5ee12939..9e07eed7e2 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -297,6 +297,7 @@ void Cmd_HUD_SetFields(float argc) hud_num_fields = 0; drawfont = hud_font; + hud_fontsize = HUD_GetFontsize("hud_fontsize"); for(i = 0; i < argc - 1; ++i) { @@ -594,8 +595,8 @@ string HUD_FixScoreboardColumnWidth(float i, string str) for(j = 0; j < hud_num_fields; ++j) if(j != i) if (hud_field[i] != SP_SEPARATOR) - namesize -= hud_size[j] + 1; - namesize += 1; + namesize -= hud_size[j] + hud_fontsize_x; + namesize += hud_fontsize_x; hud_size[i] = namesize; if (hud_fixscoreboardcolumnwidth_iconlen != 0) @@ -759,7 +760,10 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz tmp_y = 1.25 * hud_fontsize_y; // rounded header - drawpic(pos, "gfx/scoreboard/scoreboard_tableheader", tmp, (rgb * hud_color_bg_team) + '0.5 0.5 0.5', scoreboard_alpha_bg, DRAWFLAG_NORMAL); + if (teamplay) + drawpic(pos, "gfx/scoreboard/scoreboard_tableheader", tmp, (rgb * autocvar_scoreboard_color_bg_team) + '0.5 0.5 0.5', scoreboard_alpha_bg, DRAWFLAG_NORMAL); + else + drawpic(pos, "gfx/scoreboard/scoreboard_tableheader", tmp, rgb + '0.5 0.5 0.5', scoreboard_alpha_bg, DRAWFLAG_NORMAL); // table border tmp_y += hud_border_thickness; @@ -775,7 +779,10 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz // table background tmp_y = body_table_height; - drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb * hud_color_bg_team, scoreboard_alpha_bg, DRAWFLAG_NORMAL); + if (teamplay) + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb * autocvar_scoreboard_color_bg_team, scoreboard_alpha_bg, DRAWFLAG_NORMAL); + else + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, scoreboard_alpha_bg, DRAWFLAG_NORMAL); // anyway, apply some color //drawfill(pos, tmp + '2 0 0', rgb, 0.1, DRAWFLAG_NORMAL); @@ -831,7 +838,7 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz } tmp_x = stringwidth(hud_title[i], FALSE, hud_fontsize); - tmp_x = (hud_size[i] - tmp_x) * hud_fontsize_x; + tmp_x = (hud_size[i] - tmp_x); drawstring(pos + tmp, hud_title[i], hud_fontsize, rgb * 1.5, scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_x -= hud_fontsize_x; } @@ -876,11 +883,9 @@ float HUD_WouldDrawScoreboard() { return 1; else if (intermission == 1) return 1; - else if (intermission == 2) - return 1; else if (getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard")) return 1; - else if(scoreboard_showscores_force) + else if (scoreboard_showscores_force) return 1; return 0; } @@ -891,40 +896,40 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) { float i; float weapon_hit, weapon_damage, weapon_stats; - float fontsize = 40 * 1/3; - float weapon_cnt = 12; + float weapon_cnt = WEP_COUNT - 3; // either minstanex/nex are hidden, no port-o-launch, no tuba float rows; if(cvar("scoreboard_accuracy_doublerows")) rows = 2; else rows = 1; float height = 40; - - if(warmup_stage) - { - return pos; - } + float fontsize = height * 1/3; + float weapon_height = height * 2/3; + float weapon_width = sbwidth / weapon_cnt; drawstring(pos, strcat("Accuracy stats (average ", ftos(average_accuracy), "%)"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - pos_y += 18; + pos_y += 1.25 * hud_fontsize_y; vector tmp; tmp_x = sbwidth; tmp_y = height * rows; - drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb * hud_color_bg_team, scoreboard_alpha_bg, DRAWFLAG_NORMAL); + if (teamplay) + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb * autocvar_scoreboard_color_bg_team, scoreboard_alpha_bg, DRAWFLAG_NORMAL); + else + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, scoreboard_alpha_bg, DRAWFLAG_NORMAL); drawborderlines(hud_accuracy_border_thickness, pos, tmp, '0 0 0', scoreboard_alpha_bg * 0.75, DRAWFLAG_NORMAL); // column highlighting for(i = 0; i < weapon_cnt/rows; ++i) { if(!mod(i, 2)) - drawfill(pos + '1 0 0' * (sbwidth/weapon_cnt) * rows * i, '0 1 0' * height * rows + '1 0 0' * (sbwidth/weapon_cnt) * rows, '0 0 0', scoreboard_alpha_bg * 0.2, DRAWFLAG_NORMAL); + drawfill(pos + '1 0 0' * weapon_width * rows * i, '0 1 0' * height * rows + '1 0 0' * weapon_width * rows, '0 0 0', scoreboard_alpha_bg * 0.2, DRAWFLAG_NORMAL); } // row highlighting for(i = 0; i < rows; ++i) { - drawfill(pos + '0 1 0' * height * (2/3) + '0 1 0' * height * i, '1 0 0' * sbwidth + '0 1 0' * fontsize, '1 1 1', scoreboard_highlight_alpha, DRAWFLAG_NORMAL); + drawfill(pos + '0 1 0' * weapon_height + '0 1 0' * height * i, '1 0 0' * sbwidth + '0 1 0' * fontsize, '1 1 1', scoreboard_highlight_alpha, DRAWFLAG_NORMAL); } drawfont = hud_bigfont; @@ -932,17 +937,20 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) float weapons_with_stats; weapons_with_stats = 0; if(rows == 2) - pos_x += sbwidth/weapon_cnt / 2; + pos_x += weapon_width / 2; if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX) g_minstagib = 1; // TODO: real detection for minstagib? + if (!acc_levels) + rgb = '1 1 1'; + for(i = WEP_FIRST; i <= WEP_LAST; ++i) { self = get_weaponinfo(i); if not(self.weapons) continue; - if ((i == WEP_NEX && g_minstagib) || i == WEP_PORTO || (i == WEP_MINSTANEX && !g_minstagib) || i == WEP_TUBA || i == WEP_FIREBALL) // skip port-o-launch, nex || minstanex, tuba and fireball + if ((i == WEP_NEX && g_minstagib) || i == WEP_PORTO || (i == WEP_MINSTANEX && !g_minstagib) || i == WEP_TUBA) // skip port-o-launch, nex || minstanex and tuba continue; weapon_hit = weapon_hits[i-WEP_FIRST]; weapon_damage = weapon_fired[i-WEP_FIRST]; @@ -956,7 +964,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) weapon_alpha = 0.2 * scoreboard_alpha_fg; // weapon icon - drawpic(pos, strcat("gfx/hud/", cvar_string("hud_skin"), "/weapon", self.netname), '1 0 0' * sbwidth * (1/weapon_cnt) + '0 1 0' * height * (2/3), '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(pos, strcat("weapon", self.netname), '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); // the accuracy if(weapon_damage) { weapons_with_stats += 1; @@ -966,24 +974,34 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) s = strcat(ftos(weapon_stats),"%"); float padding; - padding = ((sbwidth/weapon_cnt) - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value + padding = (weapon_width - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value - // yellow_accuracy = value at which accuracy becomes yellow - if(weapon_stats >= 100) { - rgb_x = 0; - rgb_y = 1; + float weapon_hit, weapon_damage; + weapon_damage = weapon_fired[self.weapon-WEP_FIRST]; + if(weapon_damage) + { + weapon_hit = weapon_hits[self.weapon-WEP_FIRST]; + weapon_stats = floor(100 * weapon_hit / weapon_damage); } - else if(weapon_stats > autocvar_hud_weaponicons_accuracy_yellow) { - rgb_x = 1 - (weapon_stats-autocvar_hud_weaponicons_accuracy_yellow)/(100-autocvar_hud_weaponicons_accuracy_yellow); // red value between 1 -> 0 - rgb_y = 1; - } else { - rgb_x = 1; - rgb_y = weapon_stats/autocvar_hud_weaponicons_accuracy_yellow; // green value between 0 -> 1 + + if (acc_levels) + { + // find the max level lower than weapon_stats + float j; + j = acc_levels-1; + while ( j && weapon_stats < acc_lev[j] ) + --j; + + // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j + float factor; + factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]); + rgb = acc_color(j); + rgb = rgb + factor * (acc_color(j+1) - rgb); } - rgb_z = 0; - drawstring(pos + '1 0 0' * padding + '0 1 0' * height * (2/3), s, '1 1 0' * fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + + drawstring(pos + '1 0 0' * padding + '0 1 0' * weapon_height, s, '1 1 0' * fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); } - pos_x += sbwidth/weapon_cnt * rows; + pos_x += weapon_width * rows; if(rows == 2 && i == 6) { pos_x -= sbwidth; pos_y += height; @@ -995,9 +1013,11 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) average_accuracy = floor(average_accuracy / weapons_with_stats); if(rows == 2) - pos_x -= sbwidth/weapon_cnt / 2; + pos_x -= weapon_width / 2; pos_x -= sbwidth; pos_y += height; + + pos_y += 1.25 * hud_fontsize_y; return pos; } @@ -1005,9 +1025,9 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ { float i; RANKINGS_RECEIVED_CNT = 0; - for (i=RANKINGS_CNT-1; i>=0; --i) - if (grecordtime[i]) - RANKINGS_RECEIVED_CNT = RANKINGS_RECEIVED_CNT + 1; + for (i=RANKINGS_CNT-1; i>=0; --i) + if (grecordtime[i]) + ++RANKINGS_RECEIVED_CNT; if (RANKINGS_RECEIVED_CNT == 0) return pos; @@ -1015,9 +1035,9 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ float is_spec; is_spec = (GetPlayerColor(pl.sv_entnum) == COLOR_SPECTATOR); vector hl_rgb; - hl_rgb_x = cvar("scoreboard_color_bg_r") + 0.5; - hl_rgb_y = cvar("scoreboard_color_bg_g") + 0.5; - hl_rgb_z = cvar("scoreboard_color_bg_b") + 0.5; + hl_rgb_x = cvar("scoreboard_color_bg_r") + 0.5; + hl_rgb_y = cvar("scoreboard_color_bg_g") + 0.5; + hl_rgb_z = cvar("scoreboard_color_bg_b") + 0.5; pos_y += hud_fontsize_y; drawstring(pos, strcat("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); @@ -1026,7 +1046,10 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ tmp_x = sbwidth; tmp_y = hud_fontsize_y * RANKINGS_RECEIVED_CNT; - drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb * hud_color_bg_team, scoreboard_alpha_bg, DRAWFLAG_NORMAL); + if (teamplay) + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb * autocvar_scoreboard_color_bg_team, scoreboard_alpha_bg, DRAWFLAG_NORMAL); + else + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, scoreboard_alpha_bg, DRAWFLAG_NORMAL); drawborderlines(hud_border_thickness, pos, tmp, '0 0 0', scoreboard_alpha_bg * 0.75, DRAWFLAG_NORMAL); // row highlighting @@ -1046,43 +1069,43 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ drawstring(pos, p, hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); drawstring(pos + '3 0 0' * hud_fontsize_x, TIME_ENCODED_TOSTRING(t), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); drawcolorcodedstring(pos + '8 0 0' * hud_fontsize_x, n, hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); - pos += '0 1 0' * hud_fontsize_y; + pos_y += 1.25 * hud_fontsize_y; } return pos; } -float scoreboard_fade_alpha; float hud_woulddrawscoreboard_prev; float hud_woulddrawscoreboard_change; // "time" at which HUD_WouldDrawScoreboard() changed void HUD_DrawScoreboard() { - HUD_UpdatePlayerTeams(); - float hud_woulddrawscoreboard; - hud_woulddrawscoreboard = HUD_WouldDrawScoreboard(); + hud_woulddrawscoreboard = scoreboard_active; if(hud_woulddrawscoreboard != hud_woulddrawscoreboard_prev) { hud_woulddrawscoreboard_change = time; hud_woulddrawscoreboard_prev = hud_woulddrawscoreboard; } - float scoreboard_fadeinspeed = cvar_or("scoreboard_fadeinspeed", 10); - float scoreboard_fadeoutspeed = cvar_or("scoreboard_fadeoutspeed", 5); if(hud_woulddrawscoreboard) { + float scoreboard_fadeinspeed = cvar_or("scoreboard_fadeinspeed", 10); if (scoreboard_fadeinspeed) scoreboard_fade_alpha = bound (0, (time - hud_woulddrawscoreboard_change) * scoreboard_fadeinspeed, 1); else scoreboard_fade_alpha = 1; } - else + else { + float scoreboard_fadeoutspeed = cvar_or("scoreboard_fadeoutspeed", 5); if (scoreboard_fadeoutspeed) scoreboard_fade_alpha = bound (0, (1/scoreboard_fadeoutspeed - (time - hud_woulddrawscoreboard_change)) * scoreboard_fadeoutspeed, 1); else scoreboard_fade_alpha = 0; + } if not(scoreboard_fade_alpha) return; + HUD_UpdatePlayerTeams(); + scoreboard_alpha_bg = cvar("scoreboard_alpha_bg") * scoreboard_fade_alpha * (1 - cvar("_menu_alpha")); scoreboard_alpha_fg = cvar_or("scoreboard_alpha_fg", 1.0) * scoreboard_fade_alpha * (1 - cvar("_menu_alpha")); scoreboard_highlight = cvar("scoreboard_highlight"); @@ -1094,13 +1117,13 @@ void HUD_DrawScoreboard() vector rgb, pos, tmp; entity pl, tm; - sbwidth = HUD_GetWidth(6.5 * hud_fontsize_y); + xmin = cvar("scoreboard_offset_left") * vid_conwidth; + ymin = cvar("con_notify") * cvar("con_notifysize"); - xmin = 0.5 * (vid_conwidth - sbwidth); - ymin = SCOREBOARD_OFFSET; + xmax = (1 - cvar("scoreboard_offset_right")) * vid_conwidth; + ymax = vid_conheight - ymin; - xmax = vid_conwidth - xmin; - ymax = vid_conheight - 0.2*vid_conheight; + sbwidth = xmax - xmin; // Initializes position pos_x = xmin; @@ -1109,16 +1132,17 @@ void HUD_DrawScoreboard() // Heading drawfont = hud_bigfont; - drawstringcenter('0 1 0' * ymin, "Scoreboard", '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(pos, "Scoreboard", '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + + centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth("Scoreboard", FALSE, '24 24 0')); + centerprint_start_y = pos_y; - pos_y += 24 + 4; - pos_y += hud_fontsize_y; + pos_y += 24; drawfont = hud_font; // Draw the scoreboard - vector bg_size; - bg_size = drawgetimagesize("gfx/hud/scoreboard_scoreboard_bg"); + vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * cvar("scoreboard_bg_scale"); if(teamplay) { @@ -1128,10 +1152,10 @@ void HUD_DrawScoreboard() continue; rgb = GetTeamRGB(tm.team); - drawstring(pos - '9.5 0 0' * hud_fontsize_y + '0 1 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_primary])), '1 1 0' * hud_fontsize_y * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(pos - '2 0 0' * hud_fontsize_x + '0 1 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_primary])), '1 1 0' * hud_fontsize_y * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); if(ts_primary != ts_secondary) - drawstring(pos - '7.5 0 0' * hud_fontsize_y + '0 2.5 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_secondary])), '1 1 0' * hud_fontsize_y * 1, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(pos - '2 0 0' * hud_fontsize_x + '0 2.5 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_secondary])), '1 1 0' * hud_fontsize_y * 1, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos = HUD_Scoreboard_MakeTable(pos, tm, rgb, bg_size); } @@ -1162,30 +1186,31 @@ void HUD_DrawScoreboard() } pos = HUD_DrawScoreboardRankings(pos, pl, rgb, bg_size); } - else if(cvar("scoreboard_accuracy") && spectatee_status != -1) { + else if(cvar("scoreboard_accuracy") && spectatee_status != -1 && !warmup_stage) { if(teamplay) pos = HUD_DrawScoreboardAccuracyStats(pos, GetTeamRGB(myteam), bg_size); else pos = HUD_DrawScoreboardAccuracyStats(pos, rgb, bg_size); } - tmp = pos + '0 1.5 0' * hud_fontsize_y; - pos_y += 3 * hud_fontsize_y; - // List spectators float specs; specs = 0; + tmp = pos; for(pl = players.sort_next; pl; pl = pl.sort_next) { if(pl.team != COLOR_SPECTATOR) continue; - HUD_PrintScoreboardItem(pos, pl, (pl.sv_entnum == player_localentnum - 1), specs); pos_y += 1.25 * hud_fontsize_y; + HUD_PrintScoreboardItem(pos, pl, (pl.sv_entnum == player_localentnum - 1), specs); ++specs; } if(specs) + { drawstring(tmp, "Spectators", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + pos_y += 1.25 * hud_fontsize_y; + } // Print info string string str;