]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/scoreboard_item_stats
authorterencehill <piuntn@gmail.com>
Mon, 2 Nov 2020 09:49:30 +0000 (10:49 +0100)
committerterencehill <piuntn@gmail.com>
Mon, 2 Nov 2020 09:49:30 +0000 (10:49 +0100)
1  2 
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/hud/panel/scoreboard.qh
qcsrc/client/mutators/events.qh

index 6d4839e6709b7dbe6ef75803e5809d1af76f02e0,5821dc46946808598f58f01f77d28b0e7e73ac59..c0f1bc6eac8ff2b046adc90f147767d9ce57daa4
@@@ -1,7 -1,7 +1,7 @@@
  #include "scoreboard.qh"
  
- #include <client/autocvars.qh>
  #include <client/draw.qh>
+ #include <client/hud/panel/chat.qh>
  #include <client/hud/panel/quickmenu.qh>
  #include <client/hud/panel/racetimer.qh>
  #include <client/hud/panel/weapons.qh>
@@@ -13,7 -13,6 +13,7 @@@
  #include <common/scores.qh>
  #include <common/stats.qh>
  #include <common/teams.qh>
 +#include <common/items/inventory.qh>
  
  // Scoreboard (#24)
  
@@@ -84,12 -83,6 +84,12 @@@ bool autocvar_hud_panel_scoreboard_accu
  float autocvar_hud_panel_scoreboard_accuracy_showdelay = 2;
  float autocvar_hud_panel_scoreboard_accuracy_showdelay_minpos = 0.75;
  
 +bool autocvar_hud_panel_scoreboard_itemstats = true;
 +bool autocvar_hud_panel_scoreboard_itemstats_doublerows = false;
 +bool autocvar_hud_panel_scoreboard_itemstats_filter = true;
 +float autocvar_hud_panel_scoreboard_itemstats_showdelay = 2.2; // slightly more delayed than accuracy
 +float autocvar_hud_panel_scoreboard_itemstats_showdelay_minpos = 0.75;
 +
  bool autocvar_hud_panel_scoreboard_dynamichud = false;
  
  float autocvar_hud_panel_scoreboard_maxheight = 0.6;
@@@ -1076,7 -1069,7 +1076,7 @@@ vector Scoreboard_MakeTable(vector pos
        panel_size.y += panel_bg_padding * 2;
        HUD_Panel_DrawBg();
  
 -      vector end_pos = panel_pos + eY * (panel_size.y + 0.5* hud_fontsize.y);
 +      vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y);
        if(panel.current_panel_bg != "0")
                end_pos.y += panel_bg_border * 2;
  
@@@ -1158,7 -1151,7 +1158,7 @@@ bool Scoreboard_WouldDraw(
        {
                return true;
        }
-       else if (scoreboard_showscores_force)
+       else if (scoreboard_showscores_force || MUTATOR_CALLHOOK(DrawScoreboard_Force))
                return true;
        return false;
  }
@@@ -1168,7 -1161,7 +1168,7 @@@ vector Scoreboard_AccuracyStats_Draw(ve
  {
        if (frametime)
        {
 -              if (scoreboard_fade_alpha == 1)
 +              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
        HUD_Panel_DrawBg();
        panel_bg_alpha = panel_bg_alpha_save;
  
 -      vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
 +      vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y);
        if(panel.current_panel_bg != "0")
                end_pos.y += panel_bg_border * 2;
  
        return initial_pos + (end_pos - initial_pos) * scoreboard_acc_fade_alpha;
  }
  
 +.bool uninteresting;
 +STATIC_INIT(default_order_items_label)
 +{
 +      IL_EACH(default_order_items, true, {
 +              switch(it.netname)
 +              {
 +                      case "bullets":
 +                      case "cells":
 +                      case "plasma":
 +                      case "rockets":
 +                      case "shells":
 +                      case "vaporizer_cells":
 +                      case "fuel":
 +                      case "armor_small":
 +                      case "armor_medium":
 +                      case "health_small":
 +                      case "health_medium":
 +                              it.uninteresting = true;
 +              }
 +      });
 +}
 +
 +vector Scoreboard_ItemStats_Draw(vector pos, vector rgb, vector bg_size)
 +{
 +      if (frametime)
 +      {
 +              if (scoreboard_fade_alpha < 1)
 +                      scoreboard_itemstats_fade_alpha = min(1, scoreboard_itemstats_fade_alpha + frametime * 10);
 +              else
 +                      scoreboard_itemstats_fade_alpha = 1; // sync fading with the scoreboard
 +      }
 +      vector initial_pos = pos;
 +
 +      int disowned_cnt = 0;
 +      int uninteresting_cnt = 0;
 +      IL_EACH(default_order_items, true, {
 +              int q = g_inventory.inv_items[it.m_id];
 +              //q = 1; // debug: display all items
 +              if (autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting)
 +                      ++uninteresting_cnt;
 +              else if (!q)
 +                      ++disowned_cnt;
 +      });
 +      int items_cnt = REGISTRY_COUNT(Items) - uninteresting_cnt;
 +      int n = items_cnt - disowned_cnt;
 +      if (n <= 0) return pos;
 +
 +      int rows = (autocvar_hud_panel_scoreboard_itemstats_doublerows && n >= floor(REGISTRY_COUNT(Items) / 2)) ? 2 : 1;
 +      int columnns = max(6, ceil(n / rows));
 +
 +      float height = 40;
 +      float fontsize = height * 1/3;
 +      float item_height = height * 2/3;
 +
 +      drawstring(pos + eX * panel_bg_padding, _("Item stats"), hud_fontsize, '1 1 1', panel_fg_alpha * scoreboard_itemstats_fade_alpha, DRAWFLAG_NORMAL);
 +      pos.y += 1.25 * hud_fontsize.y;
 +      if(panel.current_panel_bg != "0")
 +              pos.y += panel_bg_border;
 +
 +      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_itemstats_fade_alpha;
 +      HUD_Panel_DrawBg();
 +      panel_bg_alpha = panel_bg_alpha_save;
 +
 +      vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y);
 +      if(panel.current_panel_bg != "0")
 +              end_pos.y += panel_bg_border * 2;
 +
 +      if(panel_bg_padding)
 +      {
 +              panel_pos += '1 1 0' * panel_bg_padding;
 +              panel_size -= '2 2 0' * panel_bg_padding;
 +      }
 +
 +      pos = panel_pos;
 +      vector tmp = panel_size;
 +
 +      float item_width = tmp.x / columnns / rows;
 +
 +      if (sbt_bg_alpha)
 +              drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, sbt_bg_alpha * scoreboard_itemstats_fade_alpha, DRAWFLAG_NORMAL);
 +
 +      if(sbt_highlight)
 +      {
 +              // column highlighting
 +              for (int i = 0; i < columnns; ++i)
 +                      if ((i % 2) == 0)
 +                              drawfill(pos + '1 0 0' * item_width * rows * i, '0 1 0' * height * rows + '1 0 0' * item_width * rows, '0 0 0', sbt_highlight_alpha * scoreboard_itemstats_fade_alpha, DRAWFLAG_NORMAL);
 +
 +              // row highlighting
 +              for (int i = 0; i < rows; ++i)
 +                      drawfill(pos + '0 1 0' * item_height + '0 1 0' * height * i, '1 0 0' * panel_size.x + '0 1 0' * fontsize, rgb, sbt_highlight_alpha * scoreboard_itemstats_fade_alpha, DRAWFLAG_NORMAL);
 +      }
 +
 +      if (rows == 2)
 +              pos.x += item_width / 2;
 +
 +      float oldposx = pos.x;
 +      vector tmpos = pos;
 +
 +      int column = 0;
 +      IL_EACH(default_order_items, !(autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting), {
 +              int n = g_inventory.inv_items[it.m_id];
 +              //n = 1 + floor(i * 3 + 4.8) % 7; // debug: display a value for each item
 +              if (n <= 0) continue;
 +              drawpic_aspect_skin(tmpos, it.m_icon, '1 0 0' * item_width + '0 1 0' * item_height, '1 1 1', panel_fg_alpha * scoreboard_itemstats_fade_alpha, DRAWFLAG_NORMAL);
 +              string s = ftos(n);
 +              float padding = (item_width - stringwidth(s, false, '1 0 0' * fontsize)) / 2; // center
 +              drawstring(tmpos + '1 0 0' * padding + '0 1 0' * item_height, s, '1 1 0' * fontsize, '1 1 1', panel_fg_alpha * scoreboard_itemstats_fade_alpha, DRAWFLAG_NORMAL);
 +              tmpos.x += item_width * rows;
 +              pos.x += item_width * rows;
 +              if (rows == 2 && column == columnns - 1) {
 +                      tmpos.x = oldposx;
 +                      tmpos.y += height;
 +                      pos.y += height;
 +              }
 +              ++column;
 +      });
 +
 +      panel_size.x += panel_bg_padding * 2; // restore initial width
 +
 +      if (scoreboard_itemstats_fade_alpha == 1)
 +              return end_pos;
 +      return initial_pos + (end_pos - initial_pos) * scoreboard_itemstats_fade_alpha;
 +}
 +
  vector MapStats_DrawKeyValue(vector pos, string key, string value) {
        float px = pos.x;
        pos.x += hud_fontsize.x * 0.25;
@@@ -1496,7 -1359,7 +1496,7 @@@ vector Scoreboard_MapStats_Draw(vector 
        panel_size.y += panel_bg_padding * 2;
        HUD_Panel_DrawBg();
  
 -      vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
 +      vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y);
        if(panel.current_panel_bg != "0")
                end_pos.y += panel_bg_border * 2;
  
@@@ -1582,7 -1445,7 +1582,7 @@@ vector Scoreboard_Rankings_Draw(vector 
  
        HUD_Panel_DrawBg();
  
 -      vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
 +      vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y);
        if(panel.current_panel_bg != "0")
                end_pos.y += panel_bg_border * 2;
  
@@@ -1670,42 -1533,6 +1670,42 @@@ bool Scoreboard_AccuracyStats_WouldDraw
        return true;
  }
  
 +bool have_item_stats;
 +bool Scoreboard_ItemStats_WouldDraw(float ypos)
 +{
 +      if (MUTATOR_CALLHOOK(DrawScoreboardItemStats))
 +              return false;
 +      if (!autocvar_hud_panel_scoreboard_itemstats || warmup_stage || ypos > 0.91 * vid_conheight)
 +              return false;
 +
 +      if (time < scoreboard_time + autocvar_hud_panel_scoreboard_itemstats_showdelay
 +              && ypos > autocvar_hud_panel_scoreboard_itemstats_showdelay_minpos * vid_conheight
 +              && !intermission)
 +      {
 +              return false;
 +      }
 +
 +      if (!have_item_stats)
 +      {
 +              IL_EACH(default_order_items, true, {
 +                      if (!(autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting))
 +                      {
 +                              int q = g_inventory.inv_items[it.m_id];
 +                              //q = 1; // debug: display all items
 +                              if (q)
 +                              {
 +                                      have_item_stats = true;
 +                                      break;
 +                              }
 +                      }
 +              });
 +              if (!have_item_stats)
 +                      return false;
 +      }
 +
 +      return true;
 +}
 +
  void Scoreboard_Draw()
  {
        if(!autocvar__hud_configure)
                if (!scoreboard_fade_alpha)
                {
                        scoreboard_acc_fade_alpha = 0;
 +                      scoreboard_itemstats_fade_alpha = 0;
                        return;
                }
        }
  
        if (Scoreboard_AccuracyStats_WouldDraw(pos.y))
                pos = Scoreboard_AccuracyStats_Draw(pos, panel_bg_color, bg_size);
 +      if (Scoreboard_ItemStats_WouldDraw(pos.y))
 +              pos = Scoreboard_ItemStats_Draw(pos, panel_bg_color, bg_size);
  
        if(MUTATOR_CALLHOOK(ShowRankings)) {
                string ranktitle = M_ARGV(0, string);
index 22817d515eb86acbf7752fbeb33d9379ae1aa906,f0dbdb5c6d6a1f92fa2505533d8ffe2d8dba48e0..7189143e669831af26eb7576c6ff43453f214ba6
@@@ -1,12 -1,14 +1,15 @@@
  #pragma once
  #include "../panel.qh"
  
+ bool autocvar_cl_deathscoreboard;
+ string autocvar_scoreboard_columns;
  bool scoreboard_showscores;
  
  bool scoreboard_active;
  float scoreboard_fade_alpha;
  float scoreboard_acc_fade_alpha;
 +float scoreboard_itemstats_fade_alpha;
  
  void Cmd_Scoreboard_SetFields(int argc);
  void Scoreboard_Draw();
index cbd2cf31bc916481ad2f8e69c60aa9cf987326b6,7115ed4dfba7c6b27233c8b4123ec11928e78ff8..245224ba237d7e56cbe3b73388ced6de5d6e8f0c
@@@ -172,15 -172,15 +172,18 @@@ MUTATOR_HOOKABLE(DrawCrosshair, EV_NO_A
  /** Return true to not draw scoreboard */
  MUTATOR_HOOKABLE(DrawScoreboard, EV_NO_ARGS);
  
+ /** Return true to force showing of the scoreboard */
+ MUTATOR_HOOKABLE(DrawScoreboard_Force, EV_NO_ARGS);
  /** Return true to not draw scoreboard while dead */
  MUTATOR_HOOKABLE(DrawDeathScoreboard, EV_NO_ARGS);
  
  /** Return true to not show accuracy stats in the scoreboard */
  MUTATOR_HOOKABLE(DrawScoreboardAccuracy, EV_NO_ARGS);
  
 +/** Return true to not show accuracy stats in the scoreboard */
 +MUTATOR_HOOKABLE(DrawScoreboardItemStats, EV_NO_ARGS);
 +
  /** Called when drawing info messages, allows adding new info messages. Return true to hide the standard join message */
  #define EV_DrawInfoMessages(i, o) \
        /** pos */                          i(vector, MUTATOR_ARGV_0_vector) \