From: Mario Date: Sat, 22 Sep 2018 04:50:48 +0000 (+0000) Subject: Merge branch 'terencehill/scoreboard_stuff' into 'master' X-Git-Tag: xonotic-v0.8.5~1841 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=c72d8802ab6a8df4072e8342a5fe8750619c5855;hp=e262a40d3354378eed3c13d4d6d4eddea08d0d48 Merge branch 'terencehill/scoreboard_stuff' into 'master' Scoreboard stuff See merge request xonotic/xonotic-data.pk3dir!592 --- diff --git a/_hud_common.cfg b/_hud_common.cfg index 3631df7eb4..ee1babe195 100644 --- a/_hud_common.cfg +++ b/_hud_common.cfg @@ -115,6 +115,9 @@ seta hud_panel_scoreboard_spectators_showping 1 "show ping of spectators" seta hud_panel_scoreboard_spectators_aligned 0 "align spectators in columns" seta hud_panel_scoreboard_minwidth 0.6 "minimum width of the scoreboard" +seta hud_panel_scoreboard_accuracy_showdelay 2 "how long to delay displaying accuracy below the scoreboard if it's too far down" +seta hud_panel_scoreboard_accuracy_showdelay_minpos 0.75 "delay displaying the accuracy panel only if its position is lower than this percentage of the screen height from the top" + // hud panel aliases alias quickmenu "cl_cmd hud quickmenu ${* ?}" diff --git a/qcsrc/client/hud/panel/scoreboard.qc b/qcsrc/client/hud/panel/scoreboard.qc index 32ccccfca3..3d9e333bab 100644 --- a/qcsrc/client/hud/panel/scoreboard.qc +++ b/qcsrc/client/hud/panel/scoreboard.qc @@ -61,6 +61,9 @@ float autocvar_hud_panel_scoreboard_namesize = 15; bool autocvar_hud_panel_scoreboard_accuracy = true; bool autocvar_hud_panel_scoreboard_accuracy_doublerows = false; bool autocvar_hud_panel_scoreboard_accuracy_nocolors = false; +float autocvar_hud_panel_scoreboard_accuracy_showdelay = 2; +float autocvar_hud_panel_scoreboard_accuracy_showdelay_minpos = 0.75; + bool autocvar_hud_panel_scoreboard_ctf_leaderboard = true; bool autocvar_hud_panel_scoreboard_dynamichud = false; @@ -1025,6 +1028,12 @@ vector Scoreboard_DrawOthers(vector item_pos, vector rgb, int this_team, entity 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); } + if(pl.eliminated) + { + h_size.x = column_width + hud_fontsize.x * 0.25; + h_size.y = hud_fontsize.y; + drawfill(pos - hud_fontsize.x * 0.25 * eX, h_size, '0 0 0', 0.5 * panel_fg_alpha, DRAWFLAG_NORMAL); + } pos.x += column_width; pos.x += hud_fontsize.x; } @@ -1146,6 +1155,15 @@ bool Scoreboard_WouldDraw() float average_accuracy; vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) { + if (frametime) + { + if (scoreboard_fade_alpha == 1) + scoreboard_acc_fade_alpha = min(1, scoreboard_acc_fade_alpha + frametime * 10); + else + scoreboard_acc_fade_alpha = 1; // sync fading with the scoreboard + } + vector initial_pos = pos; + WepSet weapons_stat = WepSet_GetFromStat(); WepSet weapons_inmap = WepSet_GetFromStat_InMap(); int disownedcnt = 0; @@ -1179,7 +1197,7 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) float weapon_height = 29; float height = hud_fontsize.y + weapon_height; - drawstring(pos + eX * panel_bg_padding, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring(pos + eX * panel_bg_padding, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', panel_fg_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL); pos.y += 1.25 * hud_fontsize.y; if(panel.current_panel_bg != "0") pos.y += panel_bg_border; @@ -1187,7 +1205,11 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) panel_pos = pos; panel_size.y = height * rows; panel_size.y += panel_bg_padding * 2; + + float panel_bg_alpha_save = panel_bg_alpha; + panel_bg_alpha *= scoreboard_acc_fade_alpha; HUD_Panel_DrawBg(); + panel_bg_alpha = panel_bg_alpha_save; vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y); if(panel.current_panel_bg != "0") @@ -1205,18 +1227,18 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) float weapon_width = tmp.x / columnns / rows; if (sbt_bg_alpha) - drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, sbt_bg_alpha, DRAWFLAG_NORMAL); + drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, sbt_bg_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL); if(sbt_highlight) { // column highlighting for (int i = 0; i < columnns; ++i) if ((i % 2) == 0) - drawfill(pos + eX * weapon_width * rows * i, vec2(weapon_width * rows, height * rows), '0 0 0', sbt_highlight_alpha, DRAWFLAG_NORMAL); + drawfill(pos + eX * weapon_width * rows * i, vec2(weapon_width * rows, height * rows), '0 0 0', sbt_highlight_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL); // row highlighting for (int i = 0; i < rows; ++i) - drawfill(pos + eY * (weapon_height + height * i), vec2(tmp.x, hud_fontsize.y), rgb, sbt_highlight_alpha, DRAWFLAG_NORMAL); + drawfill(pos + eY * (weapon_height + height * i), vec2(tmp.x, hud_fontsize.y), rgb, sbt_highlight_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL); } average_accuracy = 0; @@ -1249,7 +1271,7 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) weapon_alpha = 0.2 * sbt_fg_alpha; // weapon icon - drawpic_aspect_skin(tmpos, it.model2, vec2(weapon_width, weapon_height), '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(tmpos, it.model2, vec2(weapon_width, weapon_height), '1 1 1', weapon_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL); // the accuracy if (weapon_stats >= 0) { weapons_with_stats += 1; @@ -1264,7 +1286,7 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) if(!autocvar_hud_panel_scoreboard_accuracy_nocolors) rgb = Accuracy_GetColor(weapon_stats); - drawstring(tmpos + vec2(padding, weapon_height), s, hud_fontsize, rgb, sbt_fg_alpha, DRAWFLAG_NORMAL); + drawstring(tmpos + vec2(padding, weapon_height), s, hud_fontsize, rgb, sbt_fg_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL); } tmpos.x += weapon_width * rows; pos.x += weapon_width * rows; @@ -1280,7 +1302,10 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) average_accuracy = floor((average_accuracy * 100 / weapons_with_stats) + 0.5); panel_size.x += panel_bg_padding * 2; // restore initial width - return end_pos; + + if (scoreboard_acc_fade_alpha == 1) + return end_pos; + return initial_pos + (end_pos - initial_pos) * scoreboard_acc_fade_alpha; } vector MapStats_DrawKeyValue(vector pos, string key, string value) { @@ -1469,6 +1494,39 @@ vector Scoreboard_Rankings_Draw(vector pos, entity pl, vector rgb, vector bg_siz return end_pos; } +float scoreboard_time; +bool have_weapon_stats; +bool Scoreboard_AccuracyStats_WouldDraw(float ypos) +{ + if (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_NEXBALL) + return false; + if (!autocvar_hud_panel_scoreboard_accuracy || warmup_stage || ypos > 0.91 * vid_conheight) + return false; + + if (time < scoreboard_time + autocvar_hud_panel_scoreboard_accuracy_showdelay + && ypos > autocvar_hud_panel_scoreboard_accuracy_showdelay_minpos * vid_conheight + && !intermission) + { + return false; + } + + if (!have_weapon_stats) + { + FOREACH(Weapons, it != WEP_Null, { + int weapon_stats = weapon_accuracy[i - WEP_FIRST]; + if (weapon_stats >= 0) + { + have_weapon_stats = true; + break; + } + }); + if (!have_weapon_stats) + return false; + } + + return true; +} + void Scoreboard_Draw() { if(!autocvar__hud_configure) @@ -1477,6 +1535,8 @@ void Scoreboard_Draw() // frametime checks allow to toggle the scoreboard even when the game is paused if(scoreboard_active) { + if (scoreboard_fade_alpha < 1) + scoreboard_time = time; if(hud_configure_menu_open == 1) scoreboard_fade_alpha = 1; float scoreboard_fadeinspeed = autocvar_hud_panel_scoreboard_fadeinspeed; @@ -1500,7 +1560,10 @@ void Scoreboard_Draw() } if (!scoreboard_fade_alpha) + { + scoreboard_acc_fade_alpha = 0; return; + } } else scoreboard_fade_alpha = 0; @@ -1600,9 +1663,7 @@ void Scoreboard_Draw() pos = Scoreboard_MakeTable(pos, tm, panel_bg_color, bg_size); } - bool show_accuracy = (gametype != MAPINFO_TYPE_CTS && gametype != MAPINFO_TYPE_RACE && gametype != MAPINFO_TYPE_NEXBALL); - - if (show_accuracy && autocvar_hud_panel_scoreboard_accuracy && !warmup_stage) + if (Scoreboard_AccuracyStats_WouldDraw(pos.y)) pos = Scoreboard_AccuracyStats_Draw(pos, panel_bg_color, bg_size); if(gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (autocvar_hud_panel_scoreboard_ctf_leaderboard && gametype == MAPINFO_TYPE_CTF && STAT(CTF_SHOWLEADERBOARD))) { diff --git a/qcsrc/client/hud/panel/scoreboard.qh b/qcsrc/client/hud/panel/scoreboard.qh index b2bda4829e..f585b480fe 100644 --- a/qcsrc/client/hud/panel/scoreboard.qh +++ b/qcsrc/client/hud/panel/scoreboard.qh @@ -3,6 +3,7 @@ bool scoreboard_active; float scoreboard_fade_alpha; +float scoreboard_acc_fade_alpha; void Cmd_Scoreboard_SetFields(int argc); void Scoreboard_Draw();