]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
teamradar: fix clip fail
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index c48454d6e1b470aca349b36ce8d239d41d25ceda..222823039d2007bda59887eb887826557901575f 100644 (file)
@@ -566,7 +566,7 @@ vector HUD_Panel_CheckLimitSize(float id, vector mySize)
                        mySize_x = max(mySize_y * 0.7, mySize_x); // at least 0.7 * height
                        break;
                case 2: 
-                       mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
+                       mySize_x = max(mySize_y * 1.5, mySize_x); // at least 2 * height
                        break;
                case 3: 
                        mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
@@ -575,7 +575,7 @@ vector HUD_Panel_CheckLimitSize(float id, vector mySize)
                        mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
                        break;
                case 7: 
-                       mySize_y = (17/90) * mySize_x; // 17/90 * width
+                       mySize_y = (1/4) * mySize_x; // 1/4 * width
                        break;
                case 8: 
                        mySize_y = (1/4) * mySize_x; // 1/4 * width
@@ -601,7 +601,12 @@ float HUD_Panel_CheckActive(float id)
 // return size of given panel
 vector HUD_Panel_GetSize(float id)
 {
-       return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size")));
+       vector mySize;
+       mySize = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size")));
+
+       mySize = eX * mySize_x * vid_conwidth + eY * mySize_y * vid_conheight;
+
+       return mySize;
 }
 
 // return pos of given panel
@@ -610,6 +615,8 @@ vector HUD_Panel_GetPos(float id)
        vector pos;
        pos = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_pos")));
 
+       pos = eX * pos_x * vid_conwidth + eY * pos_y * vid_conheight;
+
        if (pos_x < 0)
                pos_x = vid_conwidth + pos_x;
        if (pos_y < 0)
@@ -617,25 +624,46 @@ vector HUD_Panel_GetPos(float id)
        return pos;
 }
 
-float HUD_Panel_GetMarigin(float id)
+float HUD_Panel_GetBorder(float id)
 {
-       return bound(1, MARIGIN_MULTIPLIER * cvar_or(strcat("hud_", HUD_Panel_GetName(id), "_border"), 30), 200);
+       float border;
+       border = cvar(strcat("hud_", HUD_Panel_GetName(id), "_bg_border"));
+       if(!border)
+               border = cvar("hud_bg_border");
+       return border;
 }
 
-vector HUD_Panel_GetColor(float id)
+// draw the background/borders
+void HUD_Panel_DrawBg(float id, vector pos, vector mySize)
 {
-       if(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_color")) != "")
-               return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_color")));
-       else
-               return stov(cvar_string("hud_color"));
-}
+       if(!cvar("_hud_configure") && cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg")) == "0")
+               return;
 
-float HUD_Panel_GetBgActive(float id)
-{
-       if(cvar("_hud_configure"))
-               return 1;
+       string bg;
+       bg = cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg"));
+       if(bg == "")
+               bg = cvar_string("hud_bg");
+
+       if(bg != "0")
+       {
+               float border;
+               border = HUD_Panel_GetBorder(id);
+
+               vector color;
+               if(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg_color")) != "")
+                       color = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg_color")));
+               else
+                       color = stov(cvar_string("hud_bg_color"));
 
-       return cvar_or(strcat("hud_", HUD_Panel_GetName(id), "_bg"), 1);
+               float alpha;
+               alpha = cvar(strcat("hud_", HUD_Panel_GetName(id), "_bg_alpha"));
+               if(!alpha)
+                       alpha = cvar("hud_bg_alpha");
+               if(cvar("_hud_configure"))
+                       alpha = max(cvar("hud_configure_bg_minalpha"), alpha);
+
+               draw_BorderPicture(pos - '1 1 0' * border, strcat("gfx/hud/", bg), mySize + '1 1 0' * 2 * border, color, alpha, '1 1 0' * (border/BORDER_MULTIPLIER));
+       }
 }
 
 vector HUD_Panel_GetProgressBarColor(string item)
@@ -664,8 +692,8 @@ vector HUD_Panel_CheckResize(float id, vector myPos, vector mySize)
                targPos = HUD_Panel_GetPos(i);
                targSize = HUD_Panel_GetSize(i);
 
-               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetMarigin(id);
-               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetMarigin(id);
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetBorder(id);
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetBorder(id);
 
                if(myPos_y + mySize_y < targPos_y)
                        continue;
@@ -731,7 +759,8 @@ float HUD_Panel_SetSize(float id, vector mySize)
        myPos = HUD_Panel_GetPos(id);
 
        // check for collisions
-       mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize);
+       if(cvar("hud_configure_checkcollisions"))
+               mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize);
 
        mySize_x = bound(0.025 * vid_conwidth, mySize_x, vid_conwidth - myPos_x);
        mySize_y = bound(0.025 * vid_conheight, mySize_y, vid_conheight - myPos_y);
@@ -752,7 +781,7 @@ float HUD_Panel_SetSize(float id, vector mySize)
                didntresize = 1; // resized X
 
        string s;
-       s = strcat(ftos(mySize_x), " ", ftos(mySize_y));
+       s = strcat(ftos(mySize_x/vid_conwidth), " ", ftos(mySize_y/vid_conheight));
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_size"), s);
        return didntresize;
 }
@@ -774,8 +803,8 @@ vector HUD_Panel_CheckMove(float id, vector myPos, vector mySize)
                if(i == id || !HUD_Panel_CheckActive(i))
                        continue;
 
-               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetMarigin(id);
-               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetMarigin(id);
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetBorder(id);
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetBorder(id);
 
                if(myPos_y + mySize_y < targPos_y)
                        continue;
@@ -843,7 +872,8 @@ void HUD_Panel_SetPos(float id, vector pos, float didntresize)
        vector mySize;
        mySize = HUD_Panel_GetSize(id);
 
-       pos = HUD_Panel_CheckMove(id, pos, mySize);
+       if(cvar("hud_configure_checkcollisions"))
+               pos = HUD_Panel_CheckMove(id, pos, mySize);
 
        pos_x = bound(0, pos_x, vid_conwidth - mySize_x);
        pos_y = bound(0, pos_y, vid_conheight - mySize_y);
@@ -854,7 +884,7 @@ void HUD_Panel_SetPos(float id, vector pos, float didntresize)
                pos_y = pos_y - vid_conheight;
 
        string s;
-       s = strcat(ftos(pos_x), " ", ftos(pos_y));
+       s = strcat(ftos(pos_x/vid_conwidth), " ", ftos(pos_y/vid_conheight));
 
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s);
 }
@@ -908,7 +938,7 @@ void HUD_Panel_Mouse()
                {
                        panelPos = HUD_Panel_GetPos(i);
                        panelSize = HUD_Panel_GetSize(i);
-                       border = HUD_Panel_GetMarigin(i);
+                       border = HUD_Panel_GetBorder(i);
                        if(prevMouseClicked == 0) {
                                // move
                                if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
@@ -1025,14 +1055,12 @@ float weaponorder_cmp(float i, float j, entity pass)
 
 void HUD_WeaponIcons()
 {
-       float alpha, height, border, accuracybar_height, stat_weapons; // "constants"
-       vector pos, mySize, mysize, mypos, color, accuracy_color;
+       float alpha, height, accuracybar_height, stat_weapons; // "constants"
+       vector pos, mySize, mysize, mypos, accuracy_color;
        float i, id, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables
 
-       border = HUD_Panel_GetMarigin(0);
        pos = HUD_Panel_GetPos(0);
        mySize = HUD_Panel_GetSize(0);
-       color = HUD_Panel_GetColor(0);
        accuracybar_height = cvar_or("hud_weaponicons_accuracybar_height", 3);
 
        stat_weapons = getstati(STAT_WEAPONS);
@@ -1047,8 +1075,7 @@ void HUD_WeaponIcons()
        }
        heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
 
-       if(HUD_Panel_GetBgActive(0) && weapon_cnt)
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(0, pos, mySize);
 
        // hits
        weapon_stats = getstati(STAT_DAMAGE_HITS);
@@ -1089,7 +1116,7 @@ void HUD_WeaponIcons()
                        weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
 
                        if(self.weapon == activeweapon)
-                               drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "gfx/hud/sb_ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), color, fade * hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "gfx/hud/sb_ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
                        drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), strcat("gfx/hud/inv_weapon", self.netname), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
 
                        if(cvar_or("hud_weaponicons_number", 1))
@@ -1163,16 +1190,12 @@ void HUD_Inventory()
 {
        float i;
        float stat_items;
-       float border;
 
-       vector pos, mySize, mysize, mypos, color;
-       border = HUD_Panel_GetMarigin(1);
+       vector pos, mySize, mysize, mypos;
        pos = HUD_Panel_GetPos(1);
        mySize = HUD_Panel_GetSize(1);
-       color = HUD_Panel_GetColor(1);
 
-       if(HUD_Panel_GetBgActive(1))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(1, pos, mySize);
 
        // ammo
        stat_items = getstati(STAT_ITEMS);
@@ -1182,14 +1205,14 @@ void HUD_Inventory()
                if(cvar("_hud_configure"))
                        a = 100;
 
-               if(cvar("hud_ammo_onlycurrent")) {
+               if(cvar("hud_inventory_onlycurrent")) {
                        if (stat_items & GetAmmoItemCode(i)) {
-                               drawpic(pos - '1 1 0' * border, "gfx/hud/sb_ammobg", mysize + '1 1 0' * border, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-                               drawpic(pos + eX * mysize_x * 1.7, GetAmmoPicture(i), '24 24 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos, "gfx/hud/sb_ammobg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos + eY * 0.05 * mySize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
                                if(a < 10)
-                                       HUD_DrawXNum(pos + '5 5 0', a, 3, 0, 24, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       HUD_DrawXNum(pos + eX * 0.8 * mySize_y + eY * 0.25 * mySize_y, a, strlen(ftos(a)), 0, 0.5 * mySize_y, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                                else
-                                       HUD_DrawXNum(pos + '5 5 0', a, 3, 0, 24, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       HUD_DrawXNum(pos + eX * 0.8 * mySize_y + eY * 0.25 * mySize_y, a, strlen(ftos(a)), 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                        }
                } else {
                        if (a > 0) {
@@ -1259,21 +1282,16 @@ void HUD_Powerups() {
                        return;
        }
 
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(2);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(2);
        mySize = HUD_Panel_GetSize(2);
-       color = HUD_Panel_GetColor(2);
 
-       if(HUD_Panel_GetBgActive(2))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(2, pos, mySize);
 
        float strength_time, shield_time;
 
-       strength_time = bound(0, ceil(getstatf(STAT_STRENGTH_FINISHED) - time), 999);
-       shield_time = bound(0, ceil(getstatf(STAT_INVINCIBLE_FINISHED) - time), 999);
+       strength_time = bound(0, ceil(getstatf(STAT_STRENGTH_FINISHED) - time), 99);
+       shield_time = bound(0, ceil(getstatf(STAT_INVINCIBLE_FINISHED) - time), 99);
 
        if(cvar("_hud_configure"))
        {
@@ -1413,16 +1431,11 @@ void HUD_Powerups() {
 //
 void HUD_HealthArmor(void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(3);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(3);
        mySize = HUD_Panel_GetSize(3);
-       color = HUD_Panel_GetColor(3);
 
-       if(HUD_Panel_GetBgActive(3))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(3, pos, mySize);
 
        float armor, health, x;
        armor = getstati(STAT_ARMOR);
@@ -1571,16 +1584,11 @@ void HUD_HealthArmor(void)
 //
 void HUD_Score()
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(7);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(7);
        mySize = HUD_Panel_GetSize(7);
-       color = HUD_Panel_GetColor(7);
 
-       if(HUD_Panel_GetBgActive(7))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(7, pos, mySize);
 
        float score, distribution, leader;
        float score_len, distr_len;
@@ -1603,7 +1611,7 @@ void HUD_Score()
 
                score = me.(scores[ps_primary]);
                if(cvar("_hud_configure"))
-                       score = 1337;
+                       score = 123;
 
                if(distribution >= 5) {
                        distribution_color = eY;
@@ -1619,13 +1627,13 @@ void HUD_Score()
                score_len = strlen(ftos(score));
                distr_len = strlen(ftos(distribution));
 
-               HUD_DrawXNum(pos + eX * mySize_x - eX * 4 * 0.33 * mySize_y, distribution, 4, 3, 0.33 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y, distribution, 3, 3, 0.33 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                if (leader)
-                       drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 4 * 0.33 * mySize_y, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-               HUD_DrawXNum(pos + eX * mySize_x - eX * 4 * mySize_y - eX * 4 * 0.33 * mySize_y, score, 4, 0, mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
        } else { // teamgames
                float max_fragcount;
-               max_fragcount = -999;
+               max_fragcount = -99;
 
                float teamnum;
                for(tm = teams.sort_next; tm; tm = tm.sort_next) {
@@ -1633,7 +1641,7 @@ void HUD_Score()
                                continue;
                        score = tm.(teamscores[ts_primary]);
                        if(cvar("_hud_configure"))
-                               score = 1337;
+                               score = 123;
                        leader = 0;
                        
                        score_len = strlen(ftos(score));
@@ -1645,14 +1653,14 @@ void HUD_Score()
                                if (max_fragcount == score)
                                        leader = 1;
                                if (leader)
-                                       drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 4 * 0.33 * mySize_y, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-                               HUD_DrawXNum(pos + eX * mySize_x - eX * 4 * mySize_y - eX * 4 * 0.33 * mySize_y, score, 4, 0, mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                        } else {
                                if (max_fragcount == score)
                                        leader = 1;
                                if (leader)
                                        drawpic(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("gfx/hud/sb_highlight_", ftos(score_len)), eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
-                               HUD_DrawXNum(pos + eX * mySize_x - eX * 4 * 0.33 * mySize_y + eY * 0.33 * mySize_y * teamnum, score, 4, 0, 0.33 * mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y + eY * 0.33 * mySize_y * teamnum, score, 3, 0, 0.33 * mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
                                teamnum += 1;
                        }
                }
@@ -1662,16 +1670,11 @@ void HUD_Score()
 // Race timer (#8)
 //
 void HUD_RaceTimer (void) {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(8);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(8);
        mySize = HUD_Panel_GetSize(8);
-       color = HUD_Panel_GetColor(8);
 
-       if(HUD_Panel_GetBgActive(8))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(8, pos, mySize);
 
        drawfont = hud_bigfont;
        float a, t;
@@ -1790,16 +1793,11 @@ void HUD_RaceTimer (void) {
 // Notification area (#4)
 void HUD_Notify (void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(4);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(4);
        mySize = HUD_Panel_GetSize(4);
-       color = HUD_Panel_GetColor(4);
 
-       if(HUD_Panel_GetBgActive(4))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(4, pos, mySize);
 
        string s;
        entity tm;
@@ -1931,13 +1929,9 @@ float vote_change; // "time" when vote_active changed
 
 void HUD_VoteWindow(void) 
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(9);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(9);
        mySize = HUD_Panel_GetSize(9);
-       color = HUD_Panel_GetColor(9);
 
        string s;
        float a;
@@ -1959,8 +1953,7 @@ void HUD_VoteWindow(void)
                vote_needed = 4;
        }
 
-       if(HUD_Panel_GetBgActive(9))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg * vote_alpha, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(9, pos, mySize);
 
        if(vote_alpha) {
                a = vote_alpha * bound(cvar_or("hud_vote_alreadyvoted_alpha", 0.75), 1 - vote_highlighted, 1);
@@ -2490,16 +2483,11 @@ void CSQC_race_hud(void)
 //
 void HUD_Timer()
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(5);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(5);
        mySize = HUD_Panel_GetSize(5);
-       color = HUD_Panel_GetColor(5);
 
-       if(HUD_Panel_GetBgActive(5))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(5, pos, mySize);
 
        float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft;
 
@@ -2567,16 +2555,11 @@ void HUD_Timer()
 
 void HUD_Radar(void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(6);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(6);
        mySize = HUD_Panel_GetSize(6);
-       color = HUD_Panel_GetColor(6);
 
-       if(HUD_Panel_GetBgActive(6))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(6, pos, mySize);
 
        local float color1, color2; // color already declared as a global in hud.qc
        local vector rgb;
@@ -2622,21 +2605,7 @@ void HUD_Radar(void)
        scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin);
        teamradar_size2d = mySize;
 
-       teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0';
-       if(pos == eX * vid_conwidth)
-       {
-               if(cl_teamradar_nohudhack < 2)
-                       pos_y += 25;
-               if(cl_teamradar_nohudhack < 1)
-                       teamradar_extraclip_mins_y -= 25;
-       }
-       else if(pos == eY * vid_conheight || pos == eX * vid_conwidth + eY * vid_conheight)
-       {
-               if(cl_teamradar_nohudhack < 2)
-                       pos_y -= 50;
-               //if(cl_teamradar_nohudhack < 1)
-                       //teamradar_extraclip_size_y += 50; // don't, the HUD looks nice
-       }
+       teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0'; // we always center
 
        // pixels per world qu to match the teamradar_size2d_x range in the longest dimension
        if(cl_teamradar_rotation == 0)
@@ -2679,8 +2648,8 @@ void HUD_Radar(void)
        drawsetcliparea(
                pos_x,
                pos_y,
-               pos_x + mySize_x,
-               pos_y + mySize_y
+               mySize_x,
+               mySize_y
        );
 
        draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha);
@@ -2730,16 +2699,11 @@ Main HUD system
 
 void HUD_DrawPressedKeys(void)
 {
-       float border;
-
-       vector pos, mySize, color;
-       border = HUD_Panel_GetMarigin(10);
+       vector pos, mySize;
        pos = HUD_Panel_GetPos(10);
        mySize = HUD_Panel_GetSize(10);
-       color = HUD_Panel_GetColor(10);
 
-       if(HUD_Panel_GetBgActive(10))
-               draw_BorderPicture(pos - '1 1 0' * border, "gfx/hud/border", mySize + '1 1 0' * 2 * border, color, hud_alpha_bg, '1 1 0' * (border/MARIGIN_MULTIPLIER));
+       HUD_Panel_DrawBg(10, pos, mySize);
 
        float pressedkeys;
 
@@ -2860,7 +2824,7 @@ void HUD_Reset (void)
 
 void HUD_Main (void)
 {
-       hud_alpha_bg = cvar_or("hud_alpha_bg", 0.8) * (1 - cvar("_menu_alpha"));
+       hud_alpha_bg = cvar_or("hud_bg_alpha", 0.8) * (1 - cvar("_menu_alpha"));
        hud_border_thickness = bound(0, cvar("hud_border_thickness"), 5);
        hud_accuracy_border_thickness = bound(0, cvar_or("hud_accuracy_border_thickness", 1), 5);
        hud_color_bg_team = cvar("hud_color_bg_team");
@@ -2868,6 +2832,9 @@ void HUD_Main (void)
        hud_fontsize = HUD_GetFontsize("hud_fontsize");
        hud_fontsize_spec = HUD_GetFontsize("hud_fontsize_spec");
 
+       if(cvar_string("hud_dock") != "0")
+               drawpic('0 0 0', strcat("gfx/hud/", cvar_string("hud_dock")), eX * vid_conwidth + eY * vid_conheight, stov(cvar_string("hud_dock_color")), cvar("hud_dock_alpha"), DRAWFLAG_NORMAL);
+
        if(HUD_Panel_CheckActive(0))
                HUD_WeaponIcons();
        if(HUD_Panel_CheckActive(1))