]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
and score background. and dock. Now everything should fallback to default, so even...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index 0a2c440baffbde3d1aa08e43675fd1a281e5756d..0d7489d83ae14049bfbf226fad5b6294b1f2d91c 100644 (file)
@@ -102,14 +102,11 @@ do {\
        }\
 } while(0)
 
-var string picpath;
 // draw HUD element with image from gfx/hud/hud_skin/foo.tga if it exists, otherwise gfx/hud/default/foo.tga
 #define drawpic_aspect_skin(pos,pic,sz,color,alpha,drawflag)\
 do{\
        picpath = strcat(hud_skin_path, "/", pic);\
        if(precache_pic(picpath) == "") {\
-               if(cvar("developer"))\
-                       print("Precache fail!\n");\
                picpath = strcat("gfx/hud/default/", pic);\
        }\
        drawpic_aspect(pos, picpath, sz, color, alpha, drawflag);\
@@ -120,8 +117,6 @@ do{\
 do{\
        picpath = strcat(hud_skin_path, "/", pic);\
        if(precache_pic(picpath) == "") {\
-               if(cvar("developer"))\
-                       print("Precache fail!\n");\
                picpath = strcat("gfx/hud/default/", pic);\
        }\
        drawpic(pos, picpath, sz, color, alpha, drawflag);\
@@ -502,7 +497,7 @@ void HUD_Panel_ExportCfg(string cfgname)
                fputs(fh, strcat("seta hud_progressbar_nexball_color \"", cvar_string("hud_progressbar_nexball_color"), "\"", "\n"));
                fputs(fh, "\n");
 
-               fputs(fh, strcat("seta _hud_panelorder \"", cvar_string("hud_nexball_color"), "\"", "\n"));
+               fputs(fh, strcat("seta _hud_panelorder \"", cvar_string("_hud_panelorder"), "\"", "\n"));
                fputs(fh, "\n");
 
                // common cvars for all panels
@@ -631,7 +626,7 @@ void HUD_Panel_HlBorder(float myBorder, vector color, float alpha)
 // draw the background/borders
 #define HUD_Panel_DrawBg(alpha)\
 if(panel_bg != "0")\
-       draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, strcat(hud_skin_path, "/", panel_bg), panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\
+       draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\
 if(highlightedPanel_prev == active_panel && autocvar__hud_configure)\
        HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);
 
@@ -641,17 +636,24 @@ void HUD_Panel_DrawProgressBar(vector pos, float vertical, vector mySize, vector
                return;
 
        string pic;
-       pic = strcat(hud_skin_path, "/");
        if(vertical) {
-               drawsubpic(pos, eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, strcat(pic, "statusbar_vertical"), '0 0 0', '1 0.25 0', color, alpha, drawflag);
+               pic = strcat(hud_skin_path, "/statusbar_vertical");
+               if(precache_pic(pic) == "") {
+                       pic = "gfx/hud/default/statusbar_vertical";
+               }
+               drawsubpic(pos, eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0 0', '1 0.25 0', color, alpha, drawflag);
                if(mySize_y/mySize_x > 2)
-                       drawsubpic(pos + eY * mySize_x, eY * (mySize_y - 2 * mySize_x) + eX * mySize_x, strcat(pic, "statusbar_vertical"), '0 0.25 0', '1 0.5 0', color, alpha, drawflag);
-               drawsubpic(pos + eY * mySize_y - eY * min(mySize_y * 0.5, mySize_x), eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, strcat(pic, "statusbar_vertical"), '0 0.75 0', '1 0.25 0', color, alpha, drawflag);
+                       drawsubpic(pos + eY * mySize_x, eY * (mySize_y - 2 * mySize_x) + eX * mySize_x, pic, '0 0.25 0', '1 0.5 0', color, alpha, drawflag);
+               drawsubpic(pos + eY * mySize_y - eY * min(mySize_y * 0.5, mySize_x), eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0.75 0', '1 0.25 0', color, alpha, drawflag);
        } else {
-               drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, strcat(pic, "statusbar"), '0 0 0', '0.25 1 0', color, alpha, drawflag);
+               pic = strcat(hud_skin_path, "/statusbar");
+               if(precache_pic(pic) == "") {
+                       pic = "gfx/hud/default/statusbar";
+               }
+               drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0 0 0', '0.25 1 0', color, alpha, drawflag);
                if(mySize_x/mySize_y > 2)
-                       drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, strcat(pic, "statusbar"), '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
-               drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, strcat(pic, "statusbar"), '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
+                       drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, pic, '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
+               drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
        }
 }
 
@@ -661,11 +663,15 @@ void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float alph
                return;
 
        string pic;
-       pic = strcat(hud_skin_path, "/");
-       drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, strcat(pic, "num_leading"), '0 0 0', '0.25 1 0', color, alpha, drawflag);
+       pic = strcat(hud_skin_path, "/num_leading");
+       if(precache_pic(pic) == "") {
+               pic = "gfx/hud/default/num_leading";
+       }
+
+       drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0 0 0', '0.25 1 0', color, alpha, drawflag);
        if(mySize_x/mySize_y > 2)
-               drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, strcat(pic, "num_leading"), '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
-       drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, strcat(pic, "num_leading"), '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
+               drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, pic, '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
+       drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
 }
 
 // check if move will result in panel being moved into another panel. If so, return snapped vector, otherwise return the given vector
@@ -1164,7 +1170,7 @@ float HUD_Panel_HighlightCheck()
 
                panelPos = panel_pos;
                panelSize = panel_size;
-               border = 10; // FORCED border so a small border size doesn't mean you can't resize
+               border = max(8, panel_bg_border); // FORCED border so a small border size doesn't mean you can't resize
 
                // move
                if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
@@ -1589,24 +1595,21 @@ void HUD_WeaponIcons(void)
                                        a = 0;
                        }
 
-                       vector complain_bubble_size = '100 50 0' * bound(0.25, autocvar_hud_weaponicons_complainbubble_size, 2);
-                       drawpic_aspect_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) - complain_bubble_size + 0.5 * (eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows)), "weapon_complainbubble", complain_bubble_size, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-
                        string s;
                        if(complain_weapon_type == 0) {
-                               s = "Out of ammo for the";
+                               s = "Out of ammo";
                                color = '1 0 0';
                        }
                        else if(complain_weapon_type == 1) {
-                               s = "You don't have the";
+                               s = "Don't have";
                                color = '1 1 0';
                        }
                        else {
-                               s = "Map doesn't have the";
+                               s = "Unavailable";
                                color = '1 1 1';
                        }
-                       drawstring_aspect(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) - complain_bubble_size + eX * 0.05 * complain_bubble_size_x + eY * (1/6) * complain_bubble_size_y + 0.5 * (eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows)), s, eX * 0.9 * complain_bubble_size_x + eY * 0.2 * complain_bubble_size_y, 0.2 * complain_bubble_size_y, color, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-                       drawstring_aspect(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) - complain_bubble_size + eX * 0.05 * complain_bubble_size_x + eY * (11/30) * complain_bubble_size_y + 0.5 * (eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows)), complain_weapon_name, eX * 0.9 * complain_bubble_size_x + eY * 0.25 * complain_bubble_size_y, 0.25 * complain_bubble_size_y, '1 0 0', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                       drawpic_aspect_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, "weapon_complainbubble", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows) - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+                       drawstring_aspect(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, s, eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows) - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, mySize_y*(1/rows), '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
                }
 
                ++row;
@@ -1754,8 +1757,10 @@ void HUD_Inventory(void)
                        if(autocvar__hud_configure)
                                i = 2;
                        if (currently_selected || autocvar__hud_configure)
+                       {
                                DrawAmmoItem(pos, mySize, i, currently_selected);
-                       break;
+                               break;
+                       }
                } else {
                        DrawAmmoItem(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), i, currently_selected);
                        ++row;
@@ -2801,6 +2806,7 @@ void HUD_Notify (void)
        float i, j;
        for(j = 0; j < entries; ++j)
        {
+               s = "";
                if(autocvar_hud_notify_flip)
                        i = j;
                else // rather nasty hack for ordering items from the bottom up
@@ -2929,8 +2935,11 @@ void HUD_Notify (void)
                                        color = '0 0 1';
                                }
                        }
-                       drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, color, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-                       drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                       if(s != "" && a)
+                       {
+                               drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, color, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                       }
                }
                // X [did action to] Y
                else
@@ -3002,9 +3011,12 @@ void HUD_Notify (void)
                                s = "notify_void";
                                color = '1 1 1';
                        }
-                       drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, color, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-                       drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-                       drawcolorcodedstring(pos_victim, victim, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                       if(s != "" && a)
+                       {
+                               drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, color, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                       }
                }
        }
 }
@@ -3601,13 +3613,6 @@ void HUD_VoteWindow(void)
        // draw the progress bar backgrounds
        drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL);
 
-       // draw the progress bars
-       drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y);
-       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
-
-       drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y);
-       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
-
        // draw the highlights
        if(vote_highlighted == 1) {
                drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y);
@@ -3618,6 +3623,13 @@ void HUD_VoteWindow(void)
                drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
 
+       // draw the progress bars
+       drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y);
+       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+
+       drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y);
+       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+
        drawresetcliparea();
 
        if(!vote_active) {
@@ -4359,157 +4371,170 @@ void HUD_InfoMessages(void)
        fontsize = '0.25 0.25 0' * mySize_y;
        
        string s;
-       if(spectatee_status && !intermission)
+       if(!autocvar__hud_configure)
        {
-               //drawfont = hud_bigfont;
-               if(spectatee_status == -1)
-                       s = "^1Observing";
-               else
-                       s = GetPlayerName(spectatee_status - 1);
+               if(spectatee_status && !intermission)
+               {
+                       //drawfont = hud_bigfont;
+                       if(spectatee_status == -1)
+                               s = "^1Observing";
+                       else
+                               s = GetPlayerName(spectatee_status - 1);
 
-               //s = textShortenToWidth(s, mySize_y, 0.5 * height, stringwidth_colors);
-               //drawcolorcodedstring(pos + eY * 0.25 * height, s, 0.5 * height, panel_fg_alpha, DRAWFLAG_NORMAL);
-               //drawfont = hud_font;
+                       //s = textShortenToWidth(s, mySize_y, 0.5 * height, stringwidth_colors);
+                       //drawcolorcodedstring(pos + eY * 0.25 * height, s, 0.5 * height, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       //drawfont = hud_font;
 
-               // spectator text in the upper right corner
-               if(spectatee_status == -1)
-                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
-               else
-                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+                       // spectator text in the upper right corner
+                       if(spectatee_status == -1)
+                               s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
+                       else
+                               s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
 
-               if(spectatee_status == -1)
-                       s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
-               else
-                       s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+                       if(spectatee_status == -1)
+                               s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
+                       else
+                               s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
 
-               s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+                       s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
 
-               if(gametype == GAME_ARENA)
-                       s = "^1Wait for your turn to join";
-               else if(gametype == GAME_LMS)
-               {
-                       entity sk;
-                       sk = playerslots[player_localentnum - 1];
-                       if(sk.(scores[ps_primary]) >= 666)
-                               s = "^1Match has already begun";
-                       else if(sk.(scores[ps_primary]) > 0)
-                               s = "^1You have no more lives left";
+                       if(gametype == GAME_ARENA)
+                               s = "^1Wait for your turn to join";
+                       else if(gametype == GAME_LMS)
+                       {
+                               entity sk;
+                               sk = playerslots[player_localentnum - 1];
+                               if(sk.(scores[ps_primary]) >= 666)
+                                       s = "^1Match has already begun";
+                               else if(sk.(scores[ps_primary]) > 0)
+                                       s = "^1You have no more lives left";
+                               else
+                                       s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+                       }
                        else
                                s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
-               }
-               else
-                       s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
 
-               //show restart countdown:
-               if (time < getstatf(STAT_GAMESTARTTIME)) {
-                       float countdown;
-                       //we need to ceil, otherwise the countdown would be off by .5 when using round()
-                       countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
-                       s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
+                       //show restart countdown:
+                       if (time < getstatf(STAT_GAMESTARTTIME)) {
+                               float countdown;
+                               //we need to ceil, otherwise the countdown would be off by .5 when using round()
+                               countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
+                               s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
+                               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                               o += eY * fontsize_y;
+                       }
+               }
+               if(warmup_stage && !intermission)
+               {
+                       s = "^2Currently in ^1warmup^2 stage!";
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
                        drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                        o += eY * fontsize_y;
                }
-       }
-       if(warmup_stage && !intermission)
-       {
-               s = "^2Currently in ^1warmup^2 stage!";
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
-       }
 
-       string blinkcolor;
-       if(mod(time, 1) >= 0.5)
-               blinkcolor = "^1";
-       else
-               blinkcolor = "^3";
+               string blinkcolor;
+               if(mod(time, 1) >= 0.5)
+                       blinkcolor = "^1";
+               else
+                       blinkcolor = "^3";
 
-       if(ready_waiting && !intermission && !spectatee_status)
-       {
-               if(ready_waiting_for_me)
+               if(ready_waiting && !intermission && !spectatee_status)
                {
-                       if(warmup_stage)
-                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup");
+                       if(ready_waiting_for_me)
+                       {
+                               if(warmup_stage)
+                                       s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup");
+                               else
+                                       s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready");
+                       }
                        else
-                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready");
+                       {
+                               if(warmup_stage)
+                                       s = strcat("^2Waiting for others to ready up to end warmup...");
+                               else
+                                       s = strcat("^2Waiting for others to ready up...");
+                       }
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
                }
-               else
+               else if(warmup_stage && !intermission && !spectatee_status)
                {
-                       if(warmup_stage)
-                               s = strcat("^2Waiting for others to ready up to end warmup...");
-                       else
-                               s = strcat("^2Waiting for others to ready up...");
+                       s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
+                       if(autocvar_hud_infomessages_flip)
+                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
                }
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
-       }
-       else if(warmup_stage && !intermission && !spectatee_status)
-       {
-               s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
-               if(autocvar_hud_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
-       }
 
-       if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
-       {
-               float ts_min, ts_max;
-               tm = teams.sort_next;
-               if (tm)
+               if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
                {
-                       for(; tm.sort_next; tm = tm.sort_next)
-                       {
-                               if(!tm.team_size || tm.team == COLOR_SPECTATOR)
-                                       continue;
-                               if(!ts_min) ts_min = tm.team_size;
-                               else ts_min = min(ts_min, tm.team_size);
-                               if(!ts_max) ts_max = tm.team_size;
-                               else ts_max = max(ts_max, tm.team_size);
-                       }
-                       if ((ts_max - ts_min) > 1)
+                       float ts_min, ts_max;
+                       tm = teams.sort_next;
+                       if (tm)
                        {
-                               s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
-                               tm = GetTeam(myteam, false);
-                               if (tm)
-                               if (tm.team != COLOR_SPECTATOR)
-                               if (tm.team_size == ts_max)
-                                       s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
-
-                               if(autocvar_hud_infomessages_flip)
-                                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                               o += eY * fontsize_y;
+                               for(; tm.sort_next; tm = tm.sort_next)
+                               {
+                                       if(!tm.team_size || tm.team == COLOR_SPECTATOR)
+                                               continue;
+                                       if(!ts_min) ts_min = tm.team_size;
+                                       else ts_min = min(ts_min, tm.team_size);
+                                       if(!ts_max) ts_max = tm.team_size;
+                                       else ts_max = max(ts_max, tm.team_size);
+                               }
+                               if ((ts_max - ts_min) > 1)
+                               {
+                                       s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
+                                       tm = GetTeam(myteam, false);
+                                       if (tm)
+                                       if (tm.team != COLOR_SPECTATOR)
+                                       if (tm.team_size == ts_max)
+                                               s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
+
+                                       if(autocvar_hud_infomessages_flip)
+                                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+                                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                                       o += eY * fontsize_y;
+                               }
                        }
                }
        }
-       if(autocvar__hud_configure)
+       else 
        {
                s = "^7Press ^3ESC ^7to show HUD options.";
                if(autocvar_hud_infomessages_flip)
                        o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
                drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                o += eY * fontsize_y;
-               s = "^3Doubleclick a panel for panel-specific options.";
+               s = "^3Doubleclick ^7a panel for panel-specific options.";
+               if(autocvar_hud_infomessages_flip)
+                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
+               s = "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and";
+               if(autocvar_hud_infomessages_flip)
+                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
+               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
+               s = "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments.";
                if(autocvar_hud_infomessages_flip)
                        o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
                drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
@@ -4714,8 +4739,16 @@ void HUD_Main (void)
        else
                color = stov(autocvar_hud_dock_color);
 
+       // draw the dock
        if(autocvar_hud_dock != "" && autocvar_hud_dock != "0")
-               drawpic('0 0 0', strcat("gfx/hud/", autocvar_hud_skin, "/", autocvar_hud_dock), eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * menu_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock...
+       {
+               string pic;
+               pic = strcat(hud_skin_path, "/", autocvar_hud_dock);
+               if(precache_pic(pic) == "") {
+                       pic = "gfx/hud/default/dock";
+               }
+               drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * menu_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock...
+       }
 
        // cache the panel order into the panel_order array
        if(autocvar__hud_panelorder != hud_panelorder_prev) {