Merge branch 'master' into terencehill/quickmenu
authorterencehill <piuntn@gmail.com>
Mon, 19 Jan 2015 17:05:57 +0000 (18:05 +0100)
committerterencehill <piuntn@gmail.com>
Mon, 19 Jan 2015 17:05:57 +0000 (18:05 +0100)
Conflicts:
_hud_descriptions.cfg
common.it.po
defaultXonotic.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_minimal_xhair.cfg
hud_luminos_old.cfg
hud_nexuiz.cfg
qcsrc/client/Main.qc
qcsrc/client/autocvars.qh
qcsrc/client/hud.qc
qcsrc/client/hud.qh
qcsrc/menu/classes.c
qcsrc/menu/xonotic/mainwindow.c

19 files changed:
1  2 
_hud_common.cfg
_hud_descriptions.cfg
common.it.po
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_minimal_xhair.cfg
hud_luminos_old.cfg
hud_nexuiz.cfg
keybinds.txt
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/hud.qc
qcsrc/client/hud.qh
qcsrc/client/hud_config.qc
qcsrc/client/mapvoting.qc
qcsrc/client/scoreboard.qc
qcsrc/menu/classes.c
qcsrc/menu/xonotic/mainwindow.c

diff --cc _hud_common.cfg
Simple merge
@@@ -297,13 -298,12 +298,23 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_subsequent_minfontsize "" "minimum factor for the font size from the subsequent fading effects"
  seta hud_panel_centerprint_fade_minfontsize "" "minimum factor for the font size from the fading in/out effects"
  
+ seta hud_panel_buffs "" "enable/disable this panel"
+ seta hud_panel_buffs_pos "" "position of this panel"
+ seta hud_panel_buffs_size "" "size of this panel"
+ seta hud_panel_buffs_bg "" "if set to something else than \"\" = override default background"
+ seta hud_panel_buffs_bg_color "" "if set to something else than \"\" = override default panel background color"
+ seta hud_panel_buffs_bg_color_team "" "override panel color with team color in team based games"
+ seta hud_panel_buffs_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
+ seta hud_panel_buffs_bg_border "" "if set to something else than \"\" = override default size of border around the background"
+ seta hud_panel_buffs_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
++
 +seta hud_panel_quickmenu "" "enable/disable this panel"
 +seta hud_panel_quickmenu_pos "" "position of this base of the panel"
 +seta hud_panel_quickmenu_size "" "size of this panel"
 +seta hud_panel_quickmenu_bg "" "if set to something else than \"\" = override default background"
 +seta hud_panel_quickmenu_bg_color "" "if set to something else than \"\" = override default panel background color"
 +seta hud_panel_quickmenu_bg_color_team "" "override panel color with team color in team based games"
 +seta hud_panel_quickmenu_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
 +seta hud_panel_quickmenu_bg_border "" "if set to something else than \"\" = override default size of border around the background"
 +seta hud_panel_quickmenu_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
 +seta hud_panel_quickmenu_align "text alignment: 0 left, 0.5 center, 1 right"
diff --cc common.it.po
@@@ -6230,43 -7241,4 +7241,20 @@@ msgstr "Abilita pannello
  #: qcsrc/menu/xonotic/weaponslist.c:102
  #, c-format
  msgid "%s (mutator weapon)"
- msgstr "%s (mutatore arma)"
- #: qcsrc/server/w_hlac.qc:11
- msgid "Heavy Laser Assault Cannon"
- msgstr "Heavy Laser Assault Cannon"
- #: qcsrc/server/w_hook.qc:11
- msgid "Grappling Hook"
- msgstr "Grappling Hook"
- #: qcsrc/server/w_minstanex.qc:11
- msgid "MinstaNex"
- msgstr "MinstaNex"
- #: qcsrc/server/w_seeker.qc:11
- msgid "T.A.G. Seeker"
- msgstr "T.A.G. Seeker"
- #: qcsrc/server/w_tuba.qc:12
- #, no-c-format
- msgid "@!#%'n Tuba"
- msgstr "@!#%'n Tuba"
+ msgstr "%s (arma mutatore)"
 +
 +
 +#: command title is translated
 +msgid "QMCMD^nice one"
 +msgstr "bella"
 +
 +#: missing translation for this command
 +msgid "QMCMD^:-) / nice one"
 +msgstr ""
 +
 +#: fully translated command (title and command are the same)
 +msgid "QMCMD^good game"
 +msgstr "bella partita"
 +
 +msgid "QMCMD^Chat"
- msgstr "Parla"
++msgstr "Parla"
diff --cc hud_luminos.cfg
@@@ -295,15 -296,14 +296,25 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
  seta hud_panel_centerprint_fade_minfontsize "0"
  
+ seta hud_panel_buffs 1
+ seta hud_panel_buffs_pos "0.450000 0.855000"
+ seta hud_panel_buffs_size "0.050000 0.070000"
+ seta hud_panel_buffs_bg "0"
+ seta hud_panel_buffs_bg_color ""
+ seta hud_panel_buffs_bg_color_team ""
+ seta hud_panel_buffs_bg_alpha ""
+ seta hud_panel_buffs_bg_border ""
+ seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_quickmenu 1
 +seta hud_panel_quickmenu_pos "0.010000 0.410000"
 +seta hud_panel_quickmenu_size "0.210000 0.250000"
 +seta hud_panel_quickmenu_bg ""
 +seta hud_panel_quickmenu_bg_color ""
 +seta hud_panel_quickmenu_bg_color_team ""
 +seta hud_panel_quickmenu_bg_alpha ""
 +seta hud_panel_quickmenu_bg_border ""
 +seta hud_panel_quickmenu_bg_padding ""
 +seta hud_panel_quickmenu_align "0"
 +
  menu_sync
@@@ -295,15 -296,14 +296,25 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
  seta hud_panel_centerprint_fade_minfontsize "0"
  
+ seta hud_panel_buffs 1
+ seta hud_panel_buffs_pos "0.450000 0.855000"
+ seta hud_panel_buffs_size "0.050000 0.070000"
+ seta hud_panel_buffs_bg "0"
+ seta hud_panel_buffs_bg_color ""
+ seta hud_panel_buffs_bg_color_team ""
+ seta hud_panel_buffs_bg_alpha ""
+ seta hud_panel_buffs_bg_border ""
+ seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_quickmenu 1
 +seta hud_panel_quickmenu_pos "0.010000 0.410000"
 +seta hud_panel_quickmenu_size "0.210000 0.250000"
 +seta hud_panel_quickmenu_bg ""
 +seta hud_panel_quickmenu_bg_color ""
 +seta hud_panel_quickmenu_bg_color_team ""
 +seta hud_panel_quickmenu_bg_alpha ""
 +seta hud_panel_quickmenu_bg_border ""
 +seta hud_panel_quickmenu_bg_padding ""
 +seta hud_panel_quickmenu_align "0"
 +
  menu_sync
@@@ -295,15 -296,14 +296,25 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
  seta hud_panel_centerprint_fade_minfontsize "0"
  
+ seta hud_panel_buffs 1
+ seta hud_panel_buffs_pos "0.450000 0.855000"
+ seta hud_panel_buffs_size "0.050000 0.070000"
+ seta hud_panel_buffs_bg "0"
+ seta hud_panel_buffs_bg_color ""
+ seta hud_panel_buffs_bg_color_team ""
+ seta hud_panel_buffs_bg_alpha ""
+ seta hud_panel_buffs_bg_border ""
+ seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_quickmenu 1
 +seta hud_panel_quickmenu_pos "0.010000 0.410000"
 +seta hud_panel_quickmenu_size "0.210000 0.250000"
 +seta hud_panel_quickmenu_bg ""
 +seta hud_panel_quickmenu_bg_color ""
 +seta hud_panel_quickmenu_bg_color_team ""
 +seta hud_panel_quickmenu_bg_alpha ""
 +seta hud_panel_quickmenu_bg_border ""
 +seta hud_panel_quickmenu_bg_padding ""
 +seta hud_panel_quickmenu_align "0"
 +
  menu_sync
@@@ -295,15 -296,14 +296,25 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
  seta hud_panel_centerprint_fade_minfontsize "0"
  
+ seta hud_panel_buffs 1
+ seta hud_panel_buffs_pos "0.450000 0.855000"
+ seta hud_panel_buffs_size "0.050000 0.070000"
+ seta hud_panel_buffs_bg "0"
+ seta hud_panel_buffs_bg_color ""
+ seta hud_panel_buffs_bg_color_team ""
+ seta hud_panel_buffs_bg_alpha ""
+ seta hud_panel_buffs_bg_border ""
+ seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_quickmenu 1
 +seta hud_panel_quickmenu_pos "0.700000 0.460000"
 +seta hud_panel_quickmenu_size "0.210000 0.250000"
 +seta hud_panel_quickmenu_bg ""
 +seta hud_panel_quickmenu_bg_color ""
 +seta hud_panel_quickmenu_bg_color_team ""
 +seta hud_panel_quickmenu_bg_alpha ""
 +seta hud_panel_quickmenu_bg_border ""
 +seta hud_panel_quickmenu_bg_padding ""
 +seta hud_panel_quickmenu_align "1"
 +
  menu_sync
diff --cc hud_nexuiz.cfg
@@@ -295,15 -296,14 +296,25 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
  seta hud_panel_centerprint_fade_minfontsize "0"
  
+ seta hud_panel_buffs 1
+ seta hud_panel_buffs_pos "0.450000 0.855000"
+ seta hud_panel_buffs_size "0.050000 0.070000"
+ seta hud_panel_buffs_bg "0"
+ seta hud_panel_buffs_bg_color ""
+ seta hud_panel_buffs_bg_color_team ""
+ seta hud_panel_buffs_bg_alpha ""
+ seta hud_panel_buffs_bg_border ""
+ seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_quickmenu 1
 +seta hud_panel_quickmenu_pos "0.010000 0.380000"
 +seta hud_panel_quickmenu_size "0.210000 0.250000"
 +seta hud_panel_quickmenu_bg ""
 +seta hud_panel_quickmenu_bg_color ""
 +seta hud_panel_quickmenu_bg_color_team ""
 +seta hud_panel_quickmenu_bg_alpha ""
 +seta hud_panel_quickmenu_bg_border ""
 +seta hud_panel_quickmenu_bg_padding ""
 +seta hud_panel_quickmenu_align "0"
 +
  menu_sync
diff --cc keybinds.txt
Simple merge
@@@ -37,23 -33,10 +33,10 @@@ void WaypointSprite_Load()
  void ConsoleCommand_macro_init();
  void CSQC_Init(void)
  {
 -      prvm_language = cvar_string("prvm_language");
 +      prvm_language = strzone(cvar_string("prvm_language"));
- #ifdef USE_FTE
- #pragma target ID
-       __engine_check = checkextension("DP_SV_WRITEPICTURE");
-       if(!__engine_check)
-       {
-               print(_("^3Your engine build is outdated\n^3This Server uses a newer QC VM. Please update!\n"));
-               localcmd("\ndisconnect\n");
-               return;
-       }
- #pragma target FTE
- #endif
-       check_unacceptable_compiler_bugs();
  
  #ifdef WATERMARK
-       printf(_("^4CSQC Build information: ^1%s\n"), WATERMARK);
+       dprintf("^4CSQC Build information: ^1%s\n", WATERMARK);
  #endif
  
        float i;
Simple merge
@@@ -344,9 -352,17 +355,19 @@@ float autocvar_hud_panel_weapons_timeou
  float autocvar_hud_panel_weapons_timeout_fadefgmin;
  var float autocvar_hud_panel_weapons_timeout_speed_in = 0.25;
  var float autocvar_hud_panel_weapons_timeout_speed_out = 0.75;
 +//float autocvar_hud_panel_quickmenu;
 +float autocvar_hud_panel_quickmenu_align;
+ vector autocvar_hud_progressbar_acceleration_color;
+ vector autocvar_hud_progressbar_acceleration_neg_color;
  float autocvar_hud_progressbar_alpha;
+ vector autocvar_hud_progressbar_armor_color;
+ vector autocvar_hud_progressbar_fuel_color;
+ vector autocvar_hud_progressbar_health_color;
+ vector autocvar_hud_progressbar_nexball_color;
+ vector autocvar_hud_progressbar_shield_color;
+ vector autocvar_hud_progressbar_speed_color;
+ vector autocvar_hud_progressbar_strength_color;
+ vector autocvar_hud_progressbar_superweapons_color;
  float autocvar_hud_showbinds;
  float autocvar_hud_showbinds_limit;
  float autocvar__hud_showbinds_reload;
@@@ -4393,680 -4411,66 +4411,739 @@@ void HUD_CenterPrint (void
        }
  }
  
- // QuickMenu (#17)
+ // Buffs (#18)
+ //
+ void HUD_Buffs(void)
+ {
+       float buffs = getstati(STAT_BUFFS, 0, 24);
+       if(!autocvar__hud_configure)
+       {
+               if(!autocvar_hud_panel_buffs) return;
+               if(spectatee_status == -1) return;
+               if(getstati(STAT_HEALTH) <= 0) return;
+               if(!buffs) return;
+       }
+       else
+       {
+               buffs = Buff_Type_first.items; // force first buff
+       }
+       
+       float b = 0; // counter to tell other functions that we have buffs
+       entity e;
+       string s = "";
+       for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items)
+       {
+               ++b;
+               string o = strcat(rgb_to_hexcolor(Buff_Color(e.items)), Buff_PrettyName(e.items));
+               if(s == "")
+                       s = o;
+               else
+                       s = strcat(s, " ", o);
+       }
+       HUD_Panel_UpdateCvars();
+       draw_beginBoldFont();
+       vector pos, mySize;
+       pos = panel_pos;
+       mySize = panel_size;
+       HUD_Panel_DrawBg(bound(0, b, 1));
+       if(panel_bg_padding)
+       {
+               pos += '1 1 0' * panel_bg_padding;
+               mySize -= '2 2 0' * panel_bg_padding;
+       }
+       //float panel_ar = mySize_x/mySize_y;
+       //float is_vertical = (panel_ar < 1);
+       //float buff_iconalign = autocvar_hud_panel_buffs_iconalign;
+       vector buff_offset = '0 0 0';
+       
+       for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items)
+       {
+               //DrawNumIcon(pos + buff_offset, mySize, shield, "shield", is_vertical, buff_iconalign, '1 1 1', 1);
+               drawcolorcodedstring_aspect(pos + buff_offset, s, mySize, panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
+       }
+       draw_endBoldFont();
+ }
++// QuickMenu (#19)
 +//
 +// QUICKMENU_MAXLINES must be <= 10
 +#define QUICKMENU_MAXLINES 10
 +#define QUICKMENU_MAXENTRIES 256
 +string QuickMenu_Command[QUICKMENU_MAXLINES];
 +string QuickMenu_Description[QUICKMENU_MAXLINES];
 +float QuickMenu_CurrentPage;
 +float QuickMenu_IsLastPage;
 +// each quickmenu entry (submenu or command) is composed of 2 entries in the buffer
 +#define QUICKMENU_BUFFER_MAXENTRIES 2*QUICKMENU_MAXENTRIES
 +var float QuickMenu_Buffer = -1;
 +float QuickMenu_Buffer_Size;
 +float QuickMenu_Buffer_Index;
 +string QuickMenu_CurrentSubMenu;
 +float QuickMenu_CurrentPage_FirstEntry;
 +var float QuickMenu_Entries;
 +float QuickMenu_TimeOut;
 +// if s1 is not empty s will be displayed as command otherwise as submenu
 +void HUD_QuickMenu_load_entry(float i, string s, string s1)
 +{
 +      //printf("^xc80 entry %d: %s, %s\n", i, s, s1);
 +      if (QuickMenu_Description[i])
 +              strunzone(QuickMenu_Description[i]);
 +      QuickMenu_Description[i] = strzone(s);
 +      if (QuickMenu_Command[i])
 +              strunzone(QuickMenu_Command[i]);
 +      QuickMenu_Command[i] = strzone(s1);
 +}
 +void HUD_QuickMenu_clear_entry(float i)
 +{
 +      if (QuickMenu_Description[i])
 +              strunzone(QuickMenu_Description[i]);
 +      QuickMenu_Description[i] = string_null;
 +      if (QuickMenu_Command[i])
 +              strunzone(QuickMenu_Command[i]);
 +      QuickMenu_Command[i] = string_null;
 +}
 +
 +float HUD_QuickMenu_Page(string target_submenu, float new_page);
 +void HUD_QuickMenu_Default(string submenu);
 +float HUD_QuickMenu_Open(string mode, string submenu)
 +{
 +      float fh = -1;
 +      string s;
 +
 +      if(mode == "")
 +      {
 +              if(autocvar_hud_panel_quickmenu_file == "" || autocvar_hud_panel_quickmenu_file == "0")
 +                      mode = "default";
 +              else
 +                      mode = "file";
 +      }
 +
 +      if(mode == "default")
 +      {
 +              QuickMenu_Buffer = buf_create();
 +              if(QuickMenu_Buffer < 0)
 +                      return false;
 +
 +              HUD_QuickMenu_Default(submenu);
 +      }
 +      else if(mode == "file")
 +      {
 +              if(autocvar_hud_panel_quickmenu_file != "")
 +              if(autocvar_hud_panel_quickmenu_file != "0")
 +                      fh = fopen(autocvar_hud_panel_quickmenu_file, FILE_READ);
 +              if(fh < 0)
 +              {
 +                      printf("Couldn't open file \"%s\"\n", autocvar_hud_panel_quickmenu_file);
 +                      return false;
 +              }
 +
 +              QuickMenu_Buffer = buf_create();
 +              if(QuickMenu_Buffer < 0)
 +              {
 +                      fclose(fh);
 +                      return false;
 +              }
 +
 +              QuickMenu_Buffer_Size = 0;
 +              while((s = fgets(fh)) && QuickMenu_Buffer_Size < QUICKMENU_BUFFER_MAXENTRIES)
 +              {
 +                      // first skip invalid entries, so we don't check them anymore
 +                      float argc;
 +                      argc = tokenize_console(s);
 +                      if(argc == 0 || argc > 2)
 +                              continue;
 +                      if(argv(0) == "")
 +                              continue;
 +                      if(argc == 2 && argv(1) == "")
 +                              continue;
 +
 +                      if(argc == 1)
 +                              bufstr_set(QuickMenu_Buffer, QuickMenu_Buffer_Size, strcat("S", argv(0))); // Submenu
 +                      else
 +                      {
 +                              bufstr_set(QuickMenu_Buffer, QuickMenu_Buffer_Size, strcat("T", argv(0))); // command Title
 +                              ++QuickMenu_Buffer_Size;
 +                              bufstr_set(QuickMenu_Buffer, QuickMenu_Buffer_Size, strcat("C", argv(1))); // command
 +                      }
 +                      ++QuickMenu_Buffer_Size;
 +              }
 +              fclose(fh);
 +      }
 +      else
 +      {
 +              printf("Unrecognized mode %s\n", mode);
 +              return false;
 +      }
 +
 +      if (QuickMenu_Buffer_Size <= 0)
 +      {
 +              buf_del(QuickMenu_Buffer);
 +              QuickMenu_Buffer = -1;
 +              return false;
 +      }
 +
 +      if(mode == "file")
 +              HUD_QuickMenu_Page(submenu, 0);
 +      else
 +              HUD_QuickMenu_Page("", 0);
 +
 +      hud_panel_quickmenu = 1;
 +      if(autocvar_hud_cursormode)
 +              setcursormode(1);
 +      hudShiftState = 0;
 +
 +      QuickMenu_TimeOut = time + autocvar_hud_panel_quickmenu_time;
 +      return true;
 +}
 +
 +void HUD_QuickMenu_Buffer_Close()
 +{
 +      if (QuickMenu_Buffer >= 0)
 +      {
 +              buf_del(QuickMenu_Buffer);
 +              QuickMenu_Buffer = -1;
 +              QuickMenu_Buffer_Size = 0;
 +      }
 +}
 +
 +void HUD_QuickMenu_Close()
 +{
 +      if (QuickMenu_CurrentSubMenu)
 +              strunzone(QuickMenu_CurrentSubMenu);
 +      QuickMenu_CurrentSubMenu = string_null;
 +      float i;
 +      for (i = 0; i < QUICKMENU_MAXLINES; ++i)
 +              HUD_QuickMenu_clear_entry(i);
 +      QuickMenu_Entries = 0;
 +      hud_panel_quickmenu = 0;
 +      mouseClicked = 0;
 +      prevMouseClicked = 0;
 +      HUD_QuickMenu_Buffer_Close();
 +
 +      if(autocvar_hud_cursormode)
 +      if(!mv_active)
 +              setcursormode(0);
 +}
 +
 +// It assumes submenu open tag is already detected
 +void HUD_QuickMenu_skip_submenu(string submenu)
 +{
 +      string s, z_submenu;
 +      z_submenu = strzone(submenu);
 +      for(++QuickMenu_Buffer_Index ; QuickMenu_Buffer_Index < QuickMenu_Buffer_Size; ++QuickMenu_Buffer_Index)
 +      {
 +              s = bufstr_get(QuickMenu_Buffer, QuickMenu_Buffer_Index);
 +              if(substring(s, 0, 1) != "S")
 +                      continue;
 +              if(substring(s, 1, -1) == z_submenu) // submenu end
 +                      break;
 +              HUD_QuickMenu_skip_submenu(substring(s, 1, -1));
 +      }
 +      strunzone(z_submenu);
 +}
 +
 +float HUD_QuickMenu_IsOpened()
 +{
 +      return (QuickMenu_Entries > 0);
 +}
 +
 +// new_page 0 means page 0, new_page != 0 means next page
 +float QuickMenu_Buffer_Index_Prev;
 +float HUD_QuickMenu_Page(string target_submenu, float new_page)
 +{
 +      string s, z_submenu;
 +
 +      if (new_page == 0)
 +              QuickMenu_CurrentPage = 0;
 +      else
 +              ++QuickMenu_CurrentPage;
 +      QuickMenu_CurrentPage_FirstEntry = QuickMenu_CurrentPage * (QUICKMENU_MAXLINES - 2);
 +
 +      z_submenu = strzone(target_submenu);
 +      if (QuickMenu_CurrentSubMenu)
 +              strunzone(QuickMenu_CurrentSubMenu);
 +      QuickMenu_CurrentSubMenu = strzone(z_submenu);
 +
 +      QuickMenu_IsLastPage = TRUE;
 +      QuickMenu_Entries = 0;
 +
 +      QuickMenu_Buffer_Index = 0;
 +      if (z_submenu != "")
 +      {
 +              // skip everything until the submenu open tag is found
 +              for( ; QuickMenu_Buffer_Index < QuickMenu_Buffer_Size; ++QuickMenu_Buffer_Index)
 +              {
 +                      s = bufstr_get(QuickMenu_Buffer, QuickMenu_Buffer_Index);
 +                      if(substring(s, 0, 1) == "S" && substring(s, 1, -1) == z_submenu)
 +                      {
 +                              // printf("^3 beginning of %s\n", z_submenu);
 +                              ++QuickMenu_Buffer_Index;
 +                              break;
 +                      }
 +                      // printf("^1 skipping %s\n", s);
 +              }
 +              if(QuickMenu_Buffer_Index == QuickMenu_Buffer_Size)
 +                      printf("Couldn't find submenu \"%s\"\n", z_submenu);
 +      }
 +      float entry_num = 0;
 +      for( ; QuickMenu_Buffer_Index < QuickMenu_Buffer_Size; ++QuickMenu_Buffer_Index)
 +      {
 +              s = bufstr_get(QuickMenu_Buffer, QuickMenu_Buffer_Index);
 +
 +              if(z_submenu != "" && substring(s, 1, -1) == z_submenu)
 +              {
 +                      // printf("^3 end of %s\n", z_submenu);
 +                      break;
 +              }
 +
 +              if(entry_num >= QuickMenu_CurrentPage_FirstEntry)
 +              {
 +                      ++QuickMenu_Entries;
 +                      if(QuickMenu_Entries == QUICKMENU_MAXLINES - 2)
 +                              QuickMenu_Buffer_Index_Prev = QuickMenu_Buffer_Index;
 +                      else if(QuickMenu_Entries == QUICKMENU_MAXLINES)
 +                      {
 +                              HUD_QuickMenu_clear_entry(QUICKMENU_MAXLINES - 1);
 +                              QuickMenu_Buffer_Index = QuickMenu_Buffer_Index_Prev;
 +                              QuickMenu_IsLastPage = FALSE;
 +                              break;
 +                      }
 +              }
 +
 +              // NOTE: entries are loaded starting from 1, not from 0
 +              if(substring(s, 0, 1) == "S") // submenu
 +              {
 +                      if(entry_num >= QuickMenu_CurrentPage_FirstEntry)
 +                              HUD_QuickMenu_load_entry(QuickMenu_Entries, substring(s, 1, -1), "");
 +                      HUD_QuickMenu_skip_submenu(substring(s, 1, -1));
 +              }
 +              else if(entry_num >= QuickMenu_CurrentPage_FirstEntry && substring(s, 0, 1) == "T")
 +              {
 +                      ++QuickMenu_Buffer_Index;
 +                      string cmd = bufstr_get(QuickMenu_Buffer, QuickMenu_Buffer_Index);
 +                      if(substring(cmd, 0, 1) == "C")
 +                              cmd = substring(cmd, 1, -1);
 +                      HUD_QuickMenu_load_entry(QuickMenu_Entries, substring(s, 1, -1), cmd);
 +              }
 +
 +              ++entry_num;
 +      }
 +      strunzone(z_submenu);
 +      if (QuickMenu_Entries == 0)
 +      {
 +              HUD_QuickMenu_Close();
 +              return 0;
 +      }
 +      QuickMenu_TimeOut = time + autocvar_hud_panel_quickmenu_time;
 +      return 1;
 +}
 +
 +float HUD_QuickMenu_ActionForNumber(float num)
 +{
 +      if (!QuickMenu_IsLastPage)
 +      {
 +              if (num < 0 || num >= QUICKMENU_MAXLINES)
 +                      return 0;
 +              if (num == QUICKMENU_MAXLINES - 1)
 +                      return 0;
 +              if (num == 0)
 +              {
 +                      HUD_QuickMenu_Page(QuickMenu_CurrentSubMenu, +1);
 +                      return 0;
 +              }
 +      } else if (num <= 0 || num > QuickMenu_Entries)
 +              return 0;
 +
 +      if (QuickMenu_Command[num] != "")
 +      {
 +              localcmd(strcat("\n", QuickMenu_Command[num], "\n"));
 +              return 1;
 +      }
 +      if (QuickMenu_Description[num] != "")
 +              HUD_QuickMenu_Page(QuickMenu_Description[num], 0);
 +      return 0;
 +}
 +
 +float HUD_QuickMenu_InputEvent(float bInputType, float nPrimary, float nSecondary)
 +{
 +      // we only care for keyboard events
 +      if(bInputType == 2)
 +              return false;
 +
 +      if(!HUD_QuickMenu_IsOpened() || autocvar__hud_configure || mv_active)
 +              return false;
 +
 +      if(bInputType == 3)
 +      {
 +              mousepos_x = nPrimary;
 +              mousepos_y = nSecondary;
 +              return true;
 +      }
 +
 +      // allow console bind to work
 +      string con_keys;
 +      float keys;
 +      con_keys = findkeysforcommand("toggleconsole", 0);
 +      keys = tokenize(con_keys); // findkeysforcommand returns data for this
 +
 +      float hit_con_bind = 0, i;
 +      for (i = 0; i < keys; ++i)
 +      {
 +              if(nPrimary == stof(argv(i)))
 +                      hit_con_bind = 1;
 +      }
 +
 +      if(bInputType == 0) {
 +              if(nPrimary == K_ALT) hudShiftState |= S_ALT;
 +              if(nPrimary == K_CTRL) hudShiftState |= S_CTRL;
 +              if(nPrimary == K_SHIFT) hudShiftState |= S_SHIFT;
 +      }
 +      else if(bInputType == 1) {
 +              if(nPrimary == K_ALT) hudShiftState -= (hudShiftState & S_ALT);
 +              if(nPrimary == K_CTRL) hudShiftState -= (hudShiftState & S_CTRL);
 +              if(nPrimary == K_SHIFT) hudShiftState -= (hudShiftState & S_SHIFT);
 +      }
 +
 +      if(nPrimary == K_ESCAPE)
 +      {
 +              if (bInputType == 1)
 +                      return true;
 +              HUD_QuickMenu_Close();
 +      }
 +      else if(nPrimary >= '0' && nPrimary <= '9')
 +      {
 +              if (bInputType == 1)
 +                      return true;
 +              HUD_QuickMenu_ActionForNumber(stof(chr2str(nPrimary)));
 +      }
 +      if(nPrimary == K_MOUSE1)
 +      {
 +              if(bInputType == 0) // key pressed
 +                      mouseClicked |= S_MOUSE1;
 +              else if(bInputType == 1) // key released
 +                      mouseClicked -= (mouseClicked & S_MOUSE1);
 +      }
 +      else if(nPrimary == K_MOUSE2)
 +      {
 +              if(bInputType == 0) // key pressed
 +                      mouseClicked |= S_MOUSE2;
 +              else if(bInputType == 1) // key released
 +                      mouseClicked -= (mouseClicked & S_MOUSE2);
 +      }
 +      else if(hit_con_bind)
 +              return false;
 +
 +      return true;
 +}
 +void HUD_QuickMenu_Mouse()
 +{
 +      if(mv_active) return;
 +
 +      if(!mouseClicked)
 +      if(prevMouseClicked & S_MOUSE2)
 +      {
 +              HUD_QuickMenu_Close();
 +              return;
 +      }
 +
 +      if(!autocvar_hud_cursormode)
 +      {
 +              mousepos = mousepos + getmousepos() * autocvar_menu_mouse_speed;
 +
 +              mousepos_x = bound(0, mousepos_x, vid_conwidth);
 +              mousepos_y = bound(0, mousepos_y, vid_conheight);
 +      }
 +
 +      HUD_Panel_UpdateCvars()
 +
 +      if(panel_bg_padding)
 +      {
 +              panel_pos += '1 1 0' * panel_bg_padding;
 +              panel_size -= '2 2 0' * panel_bg_padding;
 +      }
 +
 +      float first_entry_pos, entries_height;
 +      vector fontsize;
 +      fontsize = '1 1 0' * (panel_size_y / QUICKMENU_MAXLINES);
 +      first_entry_pos = panel_pos_y + ((QUICKMENU_MAXLINES - QuickMenu_Entries) * fontsize_y) / 2;
 +      entries_height = panel_size_y - ((QUICKMENU_MAXLINES - QuickMenu_Entries) * fontsize_y);
 +
 +      if (mousepos_x >= panel_pos_x && mousepos_y >= first_entry_pos && mousepos_x <= panel_pos_x + panel_size_x && mousepos_y <= first_entry_pos + entries_height)
 +      {
 +              float entry_num;
 +              entry_num = floor((mousepos_y - first_entry_pos) / fontsize_y);
 +              if (QuickMenu_IsLastPage || entry_num != QUICKMENU_MAXLINES - 2)
 +              {
 +                      panel_pos_y = first_entry_pos + entry_num * fontsize_y;
 +                      vector color;
 +                      if(mouseClicked & S_MOUSE1)
 +                              color = '0.5 1 0.5';
 +                      else if(hudShiftState & S_CTRL)
 +                              color = '1 1 0.3';
 +                      else
 +                              color = '1 1 1';
 +                      drawfill(panel_pos, eX * panel_size_x + eY * fontsize_y, color, .2, DRAWFLAG_NORMAL);
 +
 +                      if(!mouseClicked && (prevMouseClicked & S_MOUSE1))
 +                      {
 +                              float f;
 +                              if (entry_num < QUICKMENU_MAXLINES - 1)
 +                                      f = HUD_QuickMenu_ActionForNumber(entry_num + 1);
 +                              else
 +                                      f = HUD_QuickMenu_ActionForNumber(0);
 +                              if(f && !(hudShiftState & S_CTRL))
 +                                      HUD_QuickMenu_Close();
 +                      }
 +              }
 +      }
 +
 +      const vector cursorsize = '32 32 0';
 +      drawpic(mousepos, strcat("gfx/menu/", autocvar_menu_skin, "/cursor.tga"), cursorsize, '1 1 1', 0.8, DRAWFLAG_NORMAL);
 +
 +      prevMouseClicked = mouseClicked;
 +}
 +void HUD_QuickMenu_DrawEntry(vector pos, string s, vector fontsize)
 +{
 +      string entry;
 +      float offset;
 +      entry = textShortenToWidth(s, panel_size_x, fontsize, stringwidth_colors);
 +      if (autocvar_hud_panel_quickmenu_align > 0)
 +      {
 +              offset = (panel_size_x - stringwidth_colors(entry, fontsize)) * min(autocvar_hud_panel_quickmenu_align, 1);
 +              drawcolorcodedstring(pos + eX * offset, entry, fontsize, panel_fg_alpha, DRAWFLAG_ADDITIVE);
 +      }
 +      else
 +              drawcolorcodedstring(pos, entry, fontsize, panel_fg_alpha, DRAWFLAG_ADDITIVE);
 +}
 +void HUD_QuickMenu(void)
 +{
 +      if(!autocvar__hud_configure)
 +      {
 +              if (hud_configure_prev && hud_configure_prev != -1)
 +                      HUD_QuickMenu_Close();
 +
 +              if(!hud_draw_maximized) return;
 +              if(mv_active) return;
 +              //if(!autocvar_hud_panel_quickmenu) return;
 +              if(!hud_panel_quickmenu) return;
 +
 +              if(time > QuickMenu_TimeOut)
 +              {
 +                      HUD_QuickMenu_Close();
 +                      return;
 +              }
 +      }
 +      else
 +      {
 +              if(!HUD_QuickMenu_IsOpened())
 +              {
 +                      QuickMenu_Entries = 1;
 +                      HUD_QuickMenu_load_entry(QuickMenu_Entries, sprintf(_("Submenu%d"), QuickMenu_Entries), "");
 +                      ++QuickMenu_Entries;
 +                      HUD_QuickMenu_load_entry(QuickMenu_Entries, sprintf(_("Submenu%d"), QuickMenu_Entries), "");
 +                      ++QuickMenu_Entries;
 +                      // although real command doesn't matter here, it must not be empty
 +                      // otherwise the entry is displayed like a submenu
 +                      for (; QuickMenu_Entries < QUICKMENU_MAXLINES - 1; ++QuickMenu_Entries)
 +                              HUD_QuickMenu_load_entry(QuickMenu_Entries, sprintf(_("Command%d"), QuickMenu_Entries), "-");
 +                      ++QuickMenu_Entries;
 +                      HUD_QuickMenu_clear_entry(QuickMenu_Entries);
 +                      QuickMenu_IsLastPage = FALSE;
 +              }
 +      }
 +
 +      HUD_Panel_UpdateCvars();
-       HUD_Panel_ApplyFadeAlpha();
 +
 +      HUD_Panel_DrawBg(1);
 +
 +      if(panel_bg_padding)
 +      {
 +              panel_pos += '1 1 0' * panel_bg_padding;
 +              panel_size -= '2 2 0' * panel_bg_padding;
 +      }
 +
 +      float i;
 +      vector fontsize;
 +      string color;
 +      fontsize = '1 1 0' * (panel_size_y / QUICKMENU_MAXLINES);
 +
 +      if (!QuickMenu_IsLastPage)
 +      {
 +              color = "^5";
 +              HUD_QuickMenu_DrawEntry(panel_pos + eY * (panel_size_y - fontsize_y), sprintf("%d: %s%s", 0, color, _("Continue...")), fontsize);
 +      }
 +      else
 +              panel_pos_y += ((QUICKMENU_MAXLINES - QuickMenu_Entries) * fontsize_y) / 2;
 +
 +      for (i = 1; i <= QuickMenu_Entries; ++i) {
 +              if (QuickMenu_Description[i] == "")
 +                      break;
 +              if (QuickMenu_Command[i] == "")
 +                      color = "^4";
 +              else
 +                      color = "^3";
 +              HUD_QuickMenu_DrawEntry(panel_pos, sprintf("%d: %s%s", i, color, QuickMenu_Description[i]), fontsize);
 +              panel_pos_y += fontsize_y;
 +      }
 +}
 +
 +
 +#define QUICKMENU_SMENU(submenu,eng_submenu) { \
 +      if(target_submenu == eng_submenu && target_submenu_found) \
 +              return; /* target_submenu entries are now loaded, exit */ \
 +      if(QuickMenu_Buffer_Size < QUICKMENU_BUFFER_MAXENTRIES) \
 +              bufstr_set(QuickMenu_Buffer, QuickMenu_Buffer_Size, strcat("S", submenu)); \
 +      ++QuickMenu_Buffer_Size; \
 +      if(target_submenu == eng_submenu && !target_submenu_found) { \
 +              QuickMenu_Buffer_Size = 0; /* enable load of next entries */ \
 +              target_submenu_found = TRUE; \
 +      } \
 +}
 +
 +#define QUICKMENU_ENTRY(title,command) { \
 +      if(QuickMenu_Buffer_Size + 1 < QUICKMENU_BUFFER_MAXENTRIES) \
 +      { \
 +              bufstr_set(QuickMenu_Buffer, QuickMenu_Buffer_Size, strcat("T", title)); \
 +              ++QuickMenu_Buffer_Size; \
 +              bufstr_set(QuickMenu_Buffer, QuickMenu_Buffer_Size, strcat("C", command)); \
 +      } \
 +      ++QuickMenu_Buffer_Size; \
 +}
 +
 +// useful to Translate a string inside the Command
 +#define QUICKMENU_ENTRY_TC(title,command,text,translated_text) {\
 +      if(prvm_language == "en") \
 +              QUICKMENU_ENTRY(title, sprintf(command, text)) \
 +      else if(!autocvar_hud_panel_quickmenu_translatecommands || translated_text == text) \
 +              QUICKMENU_ENTRY(strcat("(en)", title), sprintf(command, text)) \
 +      else \
 +              QUICKMENU_ENTRY(strcat("(", prvm_language, ")", title), sprintf(command, translated_text)) \
 +}
 +
 +void HUD_Quickmenu_PlayerListEntries(string cmd, float with_me)
 +{
 +      entity pl;
 +      for(pl = players.sort_next; pl; pl = pl.sort_next)
 +      {
 +              if(pl.sv_entnum != player_localnum || with_me)
 +                      QUICKMENU_ENTRY(GetPlayerName(pl.sv_entnum), sprintf(cmd, GetPlayerName(pl.sv_entnum)))
 +      }
 +}
 +
 +
 +// Specifying target_submenu, this function only loads entries inside target_submenu
 +// NOTE: alternatively we could have loaded the whole default quickmenu and
 +// then called HUD_QuickMenu_Page(target_submenu, 0);
 +// but this sytem is more reliable since we can always refer to target_submenu
 +// with the English title even if a translation is active
 +void HUD_QuickMenu_Default(string target_submenu)
 +{
 +      float target_submenu_found = FALSE;
 +      if(target_submenu != "")
 +              QuickMenu_Buffer_Size = QUICKMENU_BUFFER_MAXENTRIES; // forbids load of next entries until target_submenu
 +
 +QUICKMENU_SMENU(CTX(_("QMCMD^Chat")), "Chat")
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^nice one")), "say %s", ":-) / nice one", CTX(_("QMCMD^:-) / nice one")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^good game")), "say %s", "good game", CTX(_("QMCMD^good game")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^hi / good luck")), "say %s", "hi / good luck and have fun", CTX(_("QMCMD^hi / good luck and have fun")))
 +QUICKMENU_SMENU(CTX(_("QMCMD^Chat")), "Chat")
 +
 +if(teamplay)
 +{
 +QUICKMENU_SMENU(CTX(_("QMCMD^Team chat")), "Team chat")
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^quad soon")), "say_team %s", "quad soon", CTX(_("QMCMD^quad soon")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^free item, icon")), "say_team %s; g_waypointsprite_team_here_p", "free item %x^7 (l:%y^7)", CTX(_("QMCMD^free item %x^7 (l:%y^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^took item, icon")), "say_team %s; g_waypointsprite_team_here", "took item (l:%l^7)", CTX(_("QMCMD^took item (l:%l^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^negative")), "say_team %s", "negative", CTX(_("QMCMD^negative")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^positive")), "say_team %s", "positive", CTX(_("QMCMD^positive")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^need help, icon")), "say_team %s; g_waypointsprite_team_helpme; cmd voice needhelp", "need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)", CTX(_("QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^enemy seen, icon")), "say_team %s; g_waypointsprite_team_danger_p; cmd voice incoming", "enemy seen (l:%y^7)", CTX(_("QMCMD^enemy seen (l:%y^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^flag seen, icon")), "say_team %s; g_waypointsprite_team_here_p; cmd voice seenflag", "flag seen (l:%y^7)", CTX(_("QMCMD^flag seen (l:%y^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^defending, icon")), "say_team %s; g_waypointsprite_team_here", "defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)", CTX(_("QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^roaming, icon")), "say_team %s; g_waypointsprite_team_here", "roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)", CTX(_("QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^attacking, icon")), "say_team %s; g_waypointsprite_team_here", "attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)", CTX(_("QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^killed flag, icon")), "say_team %s; g_waypointsprite_team_here_p", "killed flagcarrier (l:%y^7)", CTX(_("QMCMD^killed flagcarrier (l:%y^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^dropped flag, icon")), "say_team %s; g_waypointsprite_team_here_d", "dropped flag (l:%d^7)", CTX(_("QMCMD^dropped flag (l:%d^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^drop gun, icon")), "say_team %s; g_waypointsprite_team_here; wait; dropweapon", "dropped gun %w^7 (l:%l^7)", CTX(_("QMCMD^dropped gun %w^7 (l:%l^7)")))
 +      QUICKMENU_ENTRY_TC(CTX(_("QMCMD^drop flag/key, icon")), "say_team %s; g_waypointsprite_team_here; wait; +use", "dropped flag/key %w^7 (l:%l^7)", CTX(_("QMCMD^dropped flag/key %w^7 (l:%l^7)")))
 +QUICKMENU_SMENU(CTX(_("QMCMD^Team chat")), "Team chat")
 +}
 +QUICKMENU_SMENU(CTX(_("QMCMD^Send private message to")), "Send private message to")
 +      HUD_Quickmenu_PlayerListEntries("commandmode tell %s", FALSE);
 +QUICKMENU_SMENU(CTX(_("QMCMD^Send private message to")), "Send private message to")
 +
 +
 +QUICKMENU_SMENU(CTX(_("QMCMD^Settings")), "Settings")
 +      QUICKMENU_SMENU(CTX(_("QMCMD^View/HUD settings")), "View/HUD settings")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^1st/3rd person view")), "toggle chase_active")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Player models like mine on/off")), "toggle cl_forceplayermodels")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Names above players on/off")), "toggle hud_shownames")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Crosshair per weapon on/off")), "toggle crosshair_per_weapon")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^FPS on/off")), "toggle hud_panel_engineinfo")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Net graph on/off")), "toggle shownetgraph")
 +      QUICKMENU_SMENU(CTX(_("QMCMD^View/HUD settings")), "View/HUD settings")
 +
 +      QUICKMENU_SMENU(CTX(_("QMCMD^Sound settings")), "Sound settings")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Hit sound on/off")), "toggle cl_hitsound")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Chat sound on/off")), "toggle cl_chatsound")
 +      QUICKMENU_SMENU(CTX(_("QMCMD^Sound settings")), "Sound settings")
 +
 +      if(spectatee_status > 0)
 +      {
 +      QUICKMENU_SMENU(CTX(_("QMCMD^Spectator camera")), "Spectator camera")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^1st person")), "chase_active 0; -use")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^3rd person around player")), "chase_active 1; +use")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^3rd person behind")), "chase_active 1; -use")
 +      QUICKMENU_SMENU(CTX(_("QMCMD^Spectator camera")), "Spectator camera")
 +      }
 +
 +      if(spectatee_status == -1)
 +      {
 +      QUICKMENU_SMENU(CTX(_("QMCMD^Observer camera")), "Observer camera")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Increase speed")), "weapnext")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Decrease speed")), "weapprev")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Wall collision off")), "+use")
 +              QUICKMENU_ENTRY(CTX(_("QMCMD^Wall collision on")), "-use")
 +      QUICKMENU_SMENU(CTX(_("QMCMD^Observer camera")), "Observer camera")
 +      }
 +
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^toggle fullscreen")), "toggle vid_fullscreen; vid_restart")
 +      if(prvm_language != "en")
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^Translate chat messages on/off")), "toggle hud_panel_quickmenu_translatecommands")
 +QUICKMENU_SMENU(CTX(_("QMCMD^Settings")), "Settings")
 +
 +QUICKMENU_SMENU(CTX(_("QMCMD^Call a vote")), "Call a vote")
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^Restart the map")), "vcall restart")
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^End match")), "vcall endmatch")
 +      if(getstatf(STAT_TIMELIMIT) > 0)
 +      {
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^Reduce match time")), "vcall reducematchtime")
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^Extend match time")), "vcall extendmatchtime")
 +      }
 +      if(teamplay)
 +      QUICKMENU_ENTRY(CTX(_("QMCMD^Shuffle teams")), "vcall shuffleteams")
 +QUICKMENU_SMENU(CTX(_("QMCMD^Call a vote")), "Call a vote")
 +
 +      if(target_submenu != "" && !target_submenu_found)
 +      {
 +              printf("Couldn't find submenu \"%s\"\n", target_submenu);
 +              if(prvm_language != "en")
 +                      printf("^3Warning: submenu must be in English\n", target_submenu);
 +              QuickMenu_Buffer_Size = 0;
 +      }
 +}
 +#undef QUICKMENU_SMENU
 +#undef QUICKMENU_ENTRY
 +#undef QUICKMENU_ENTRY_TC
 +
 +
  /*
  ==================
  Main HUD system
@@@ -5246,37 -4620,8 +5293,10 @@@ void HUD_Main (void
                (panel = HUD_PANEL(RADAR)).panel_draw();
        if(autocvar__con_chat_maximized)
                (panel = HUD_PANEL(CHAT)).panel_draw();
 +      if(hud_panel_quickmenu)
 +              (panel = HUD_PANEL(QUICKMENU)).panel_draw();
  
-       if(autocvar__hud_configure)
-       {
-               if(tab_panel)
-               {
-                       panel = tab_panel;
-                       HUD_Panel_UpdatePosSize()
-                       drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL);
-               }
-               if(highlightedPanel)
-               {
-                       panel = highlightedPanel;
-                       HUD_Panel_UpdatePosSize()
-                       HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha));
-               }
-               if(!hud_configure_prev || hud_configure_prev == -1)
-               {
-                       if(autocvar_hud_cursormode) { setcursormode(1); }
-                       hudShiftState = 0;
-                       for(i = HUD_PANEL_NUM - 1; i >= 0; --i)
-                               hud_panel[panel_order[i]].update_time = time;
-               }
-       }
-       else if(hud_configure_prev && hud_configure_prev != -1 && autocvar_hud_cursormode)
-               setcursormode(0);
+       HUD_Configure_PostDraw();
  
        hud_configure_prev = autocvar__hud_configure;
-       if (!autocvar__hud_configure) // hud config mode disabled, enable normal theAlpha stuff again
-               if (menu_enabled)
-                       menu_enabled = 0;
  }
@@@ -9,7 -9,8 +9,9 @@@ string hud_panelorder_prev
  
  float hud_draw_maximized;
  float hud_panel_radar_maximized;
 +float hud_panel_quickmenu;
+ float chat_panel_modified;
+ float radar_panel_modified;
  
  vector mousepos;
  vector panel_click_distance; // mouse cursor distance from the top left corner of the panel (saved only upon a click)
@@@ -120,7 -115,7 +118,8 @@@ float mv_active
        HUD_PANEL(INFOMESSAGES , HUD_InfoMessages , infomessages) \
        HUD_PANEL(PHYSICS      , HUD_Physics      , physics) \
        HUD_PANEL(CENTERPRINT  , HUD_CenterPrint  , centerprint) \
 -      HUD_PANEL(BUFFS        , HUD_Buffs        , buffs) 
++      HUD_PANEL(BUFFS        , HUD_Buffs        , buffs) \
 +      HUD_PANEL(QUICKMENU    , HUD_QuickMenu    , quickmenu) 
  
  #define HUD_PANEL(NAME,draw_func,name) \
        float HUD_PANEL_##NAME; \
Simple merge
Simple merge
Simple merge
  #include "xonotic/dialog_hudpanel_weapons.c"
  #include "xonotic/dialog_hudpanel_physics.c"
  #include "xonotic/dialog_hudpanel_centerprint.c"
+ #include "xonotic/dialog_hudpanel_buffs.c"
 +#include "xonotic/dialog_hudpanel_quickmenu.c"
  #include "xonotic/slider_picmip.c"
+ #include "xonotic/slider_particles.c"
+ #include "xonotic/slider_sbfadetime.c"
+ #include "xonotic/dialog_settings_misc_reset.c"
@@@ -129,6 -134,6 +134,9 @@@ void MainWindow_configureMainWindow(ent
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
  
++      i = spawnXonoticHUDQuickMenuDialog();
++      i.configureDialog(i);
++      me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
  
        // dialogs used by settings
        me.userbindEditDialog = i = spawnXonoticUserbindEditDialog();