X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=1636b11e7d59d64842148bae48860a2f96534f12;hp=cfa00a1affafcc0184ee11ff20f5aebaa4b7e400;hb=6b8490ff79ca48220bd0023b5da4019d1bfdcd7d;hpb=8d10ea819c27736320d03e75134af341f8127199 diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index cfa00a1aff..1636b11e7d 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -4,15 +4,13 @@ #include "hud_config.qh" #include "mapvoting.qh" #include "scoreboard.qh" -#include "sortlist.qh" #include "teamradar.qh" #include "t_items.qh" #include "../dpdefs/keycodes.qh" -#include "../common/buffs.qh" +#include "../common/buffs/all.qh" #include "../common/constants.qh" -#include "../common/counting.qh" #include "../common/deathtypes.qh" #include "../common/items/all.qc" #include "../common/mapinfo.qh" @@ -24,7 +22,6 @@ #include "../csqcmodellib/cl_player.qh" -#include "../warpzonelib/mathlib.qh" /* ================== @@ -32,89 +29,6 @@ Misc HUD functions ================== */ -// a border picture is a texture containing nine parts: -// 1/4 width: left part -// 1/2 width: middle part (stretched) -// 1/4 width: right part -// divided into -// 1/4 height: top part -// 1/2 height: middle part (stretched) -// 1/4 height: bottom part -void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize) -{ - if (theBorderSize.x < 0 && theBorderSize.y < 0) // draw whole image as it is - { - drawpic(theOrigin, pic, theSize, theColor, theAlpha, 0); - return; - } - if (theBorderSize.x == 0 && theBorderSize.y == 0) // no border - { - // draw only the central part - drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0); - return; - } - - vector dX, dY; - vector width, height; - vector bW, bH; - //pic = draw_UseSkinFor(pic); - width = eX * theSize.x; - height = eY * theSize.y; - if(theSize.x <= theBorderSize.x * 2) - { - // not wide enough... draw just left and right then - bW = eX * (0.25 * theSize.x / (theBorderSize.x * 2)); - if(theSize.y <= theBorderSize.y * 2) - { - // not high enough... draw just corners - bH = eY * (0.25 * theSize.y / (theBorderSize.y * 2)); - drawsubpic(theOrigin, width * 0.5 + height * 0.5, pic, '0 0 0', bW + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + width * 0.5, width * 0.5 + height * 0.5, pic, eX - bW, bW + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + height * 0.5, width * 0.5 + height * 0.5, pic, eY - bH, bW + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + theSize * 0.5, width * 0.5 + height * 0.5, pic, eX + eY - bW - bH, bW + bH, theColor, theAlpha, 0); - } - else - { - dY = theBorderSize.x * eY; - drawsubpic(theOrigin, width * 0.5 + dY, pic, '0 0 0', '0 0.25 0' + bW, theColor, theAlpha, 0); - drawsubpic(theOrigin + width * 0.5, width * 0.5 + dY, pic, '0 0 0' + eX - bW, '0 0.25 0' + bW, theColor, theAlpha, 0); - drawsubpic(theOrigin + dY, width * 0.5 + height - 2 * dY, pic, '0 0.25 0', '0 0.5 0' + bW, theColor, theAlpha, 0); - drawsubpic(theOrigin + width * 0.5 + dY, width * 0.5 + height - 2 * dY, pic, '0 0.25 0' + eX - bW, '0 0.5 0' + bW, theColor, theAlpha, 0); - drawsubpic(theOrigin + height - dY, width * 0.5 + dY, pic, '0 0.75 0', '0 0.25 0' + bW, theColor, theAlpha, 0); - drawsubpic(theOrigin + width * 0.5 + height - dY, width * 0.5 + dY, pic, '0 0.75 0' + eX - bW, '0 0.25 0' + bW, theColor, theAlpha, 0); - } - } - else - { - if(theSize.y <= theBorderSize.y * 2) - { - // not high enough... draw just top and bottom then - bH = eY * (0.25 * theSize.y / (theBorderSize.y * 2)); - dX = theBorderSize.x * eX; - drawsubpic(theOrigin, dX + height * 0.5, pic, '0 0 0', '0.25 0 0' + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + dX, width - 2 * dX + height * 0.5, pic, '0.25 0 0', '0.5 0 0' + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + width - dX, dX + height * 0.5, pic, '0.75 0 0', '0.25 0 0' + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + height * 0.5, dX + height * 0.5, pic, '0 0 0' + eY - bH, '0.25 0 0' + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + dX + height * 0.5, width - 2 * dX + height * 0.5, pic, '0.25 0 0' + eY - bH, '0.5 0 0' + bH, theColor, theAlpha, 0); - drawsubpic(theOrigin + width - dX + height * 0.5, dX + height * 0.5, pic, '0.75 0 0' + eY - bH, '0.25 0 0' + bH, theColor, theAlpha, 0); - } - else - { - dX = theBorderSize.x * eX; - dY = theBorderSize.x * eY; - drawsubpic(theOrigin, dX + dY, pic, '0 0 0', '0.25 0.25 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + dX, width - 2 * dX + dY, pic, '0.25 0 0', '0.5 0.25 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + width - dX, dX + dY, pic, '0.75 0 0', '0.25 0.25 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + dY, dX + height - 2 * dY, pic, '0 0.25 0', '0.25 0.5 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + dY + dX, width - 2 * dX + height - 2 * dY, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + dY + width - dX, dX + height - 2 * dY, pic, '0.75 0.25 0', '0.25 0.5 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + height - dY, dX + dY, pic, '0 0.75 0', '0.25 0.25 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + height - dY + dX, width - 2 * dX + dY, pic, '0.25 0.75 0', '0.5 0.25 0', theColor, theAlpha, 0); - drawsubpic(theOrigin + height - dY + width - dX, dX + dY, pic, '0.75 0.75 0', '0.25 0.25 0', theColor, theAlpha, 0); - } - } -} - vector HUD_Get_Num_Color (float x, float maxvalue) { float blinkingamt; @@ -206,28 +120,6 @@ vector HUD_GetTableSize_BestItemAR(int item_count, vector psize, float item_aspe return eX * best_columns + eY * best_rows; } -float stringwidth_colors(string s, vector theSize) -{ - return stringwidth(s, true, theSize); -} - -float stringwidth_nocolors(string s, vector theSize) -{ - return stringwidth(s, false, theSize); -} - -void drawstringright(vector position, string text, vector theScale, vector rgb, float theAlpha, int flag) -{ - position.x -= 2 / 3 * strlen(text) * theScale.x; - drawstring(position, text, theScale, rgb, theAlpha, flag); -} - -void drawstringcenter(vector position, string text, vector theScale, vector rgb, float theAlpha, int flag) -{ - position.x = 0.5 * (vid_conwidth - 0.6025 * strlen(text) * theScale.x); - drawstring(position, text, theScale, rgb, theAlpha, flag); -} - // return the string of the onscreen race timer string MakeRaceString(int cp, float mytime, float theirtime, float lapdelta, string theirname) { @@ -307,30 +199,6 @@ int race_CheckName(string net_name) return 0; } -int GetPlayerColorForce(int i) -{ - if(!teamplay) - return 0; - else - return stof(getplayerkeyvalue(i, "colors")) & 15; -} - -int GetPlayerColor(int i) -{ - if(!playerslots[i].gotscores) // unconnected - return NUM_SPECTATOR; - else if(stof(getplayerkeyvalue(i, "frags")) == FRAGS_SPECTATOR) - return NUM_SPECTATOR; - else - return GetPlayerColorForce(i); -} - -string GetPlayerName(int i) -{ - return ColorTranslateRGB(getplayerkeyvalue(i, "name")); -} - - /* ================== HUD panels @@ -466,7 +334,7 @@ void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float theA // Weapon icons (#0) // -entity weaponorder[WEP_MAXCOUNT]; +entity weaponorder[Weapons_MAX]; void weaponorder_swap(int i, int j, entity pass) { entity h = weaponorder[i]; @@ -484,7 +352,7 @@ int weaponorder_cmp(int i, int j, entity pass) } void HUD_Weapons(void) -{ +{SELFPARAM(); // declarations WepSet weapons_stat = WepSet_GetFromStat(); int i; @@ -545,14 +413,14 @@ void HUD_Weapons(void) weapon_cnt = 0; for(i = WEP_FIRST; i <= WEP_LAST; ++i) { - self = get_weaponinfo(i); + setself(get_weaponinfo(i)); if(self.impulse >= 0) { weaponorder[weapon_cnt] = self; ++weapon_cnt; } } - for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i) + for(i = weapon_cnt; i < Weapons_MAX; ++i) weaponorder[i] = world; heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world); @@ -573,7 +441,7 @@ void HUD_Weapons(void) if(cvar("wep_add")) { weapons_stat = '0 0 0'; - float countw = 1 + floor((floor(time * cvar("wep_add"))) % WEP_COUNT); + float countw = 1 + floor((floor(time * cvar("wep_add"))) % (Weapons_COUNT - 1)); for(i = WEP_FIRST; i <= countw; ++i) weapons_stat |= WepSet_FromWeapon(i); } @@ -604,7 +472,15 @@ void HUD_Weapons(void) vector padded_panel_size = panel_size - '2 2 0' * panel_bg_padding; // get the all-weapons layout - vector table_size = HUD_GetTableSize_BestItemAR(WEP_COUNT, padded_panel_size, aspect); + int nHidden = 0; + WepSet weapons_stat = WepSet_GetFromStat(); + for (int i = WEP_FIRST; i <= WEP_LAST; ++i) { + WepSet weapons_wep = WepSet_FromWeapon(i); + if (weapons_stat & weapons_wep) continue; + Weapon w = get_weaponinfo(i); + if (w.spawnflags & WEP_FLAG_MUTATORBLOCKED) nHidden += 1; + } + vector table_size = HUD_GetTableSize_BestItemAR((Weapons_COUNT - 1) - nHidden, padded_panel_size, aspect); columns = table_size.x; rows = table_size.y; weapon_size.x = padded_panel_size.x / columns; @@ -659,7 +535,7 @@ void HUD_Weapons(void) panel_pos.y += (old_panel_size.y - panel_size.y) / 2; } else - weapon_count = WEP_COUNT; + weapon_count = (Weapons_COUNT - 1); // animation for fading in/out the panel respectively when not in use if(!autocvar__hud_configure) @@ -764,7 +640,7 @@ void HUD_Weapons(void) if(!rows) // if rows is > 0 onlyowned code has already updated these vars { - vector table_size = HUD_GetTableSize_BestItemAR(WEP_COUNT, panel_size, aspect); + vector table_size = HUD_GetTableSize_BestItemAR((Weapons_COUNT - 1), panel_size, aspect); columns = table_size.x; rows = table_size.y; weapon_size.x = panel_size.x / columns; @@ -805,7 +681,7 @@ void HUD_Weapons(void) for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i) { // retrieve information about the current weapon to be drawn - self = weaponorder[i]; + setself(weaponorder[i]); weapon_id = self.impulse; isCurrent = (self.weapon == switchweapon); @@ -1407,7 +1283,7 @@ void HUD_Powerups() if(superTime) addPowerupItem("Superweapons", "superweapons", autocvar_hud_progressbar_superweapons_color, superTime, 30); - FOREACH(BUFFS, it.m_itemid & allBuffs, LAMBDA( + FOREACH(Buffs, it.m_itemid & allBuffs, LAMBDA( addPowerupItem(it.m_prettyName, strcat("buff_", it.m_name), it.m_color, bound(0, getstatf(STAT_BUFF_TIME) - time, 99), 60); )); @@ -1948,18 +1824,6 @@ void HUD_Notify(void) notify_count = count; } -// Timer (#5) -// -// TODO: macro -string seconds_tostring(float sec) -{ - float minutes; - minutes = floor(sec / 60); - - sec -= minutes * 60; - return sprintf("%d:%02d", minutes, sec); -} - void HUD_Timer(void) { if(intermission == 2) return; @@ -2875,7 +2739,7 @@ void HUD_Vote(void) { vote_yescount = 0; vote_nocount = 0; - print(_("^1You must answer before entering hud configure mode\n")); + LOG_INFO(_("^1You must answer before entering hud configure mode\n")); cvar_set("_hud_configure", "0"); } if(vote_called_vote) @@ -4813,250 +4677,15 @@ void HUD_CenterPrint (void) } } -// ItemsTime (#XX) -// -const float ITEMSTIME_MAXITEMS = 10; -float ItemsTime_time[ITEMSTIME_MAXITEMS]; -float ItemsTime_availableTime[ITEMSTIME_MAXITEMS]; -string GetItemsTimePicture(float i) -{ - switch(i) - { - case 0: return "item_large_armor"; - case 1: return "item_mega_health"; - case 2: return "strength"; - case 3: return "shield"; - case 4: return "item_mega_health"; - case 5: return "strength"; - case 6: return "shield"; - case 7: return "fuelregen"; - case 8: return "jetpack"; - case 9: return "superweapons"; - default: return ""; - } -} - -void DrawItemsTimeItem(vector myPos, vector mySize, float ar, float itemcode, float item_time, bool item_available, float item_availableTime) -{ - float t = 0; - vector color = '0 0 0'; - float picalpha; - - if(autocvar_hud_panel_itemstime_hidespawned == 2) - picalpha = 1; - else if(item_available) - { - float BLINK_FACTOR = 0.15; - float BLINK_BASE = 0.85; - float BLINK_FREQ = 5; - picalpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); - } - else - picalpha = 0.5; - t = floor(item_time - time + 0.999); - if(t < 5) - color = '0.7 0 0'; - else if(t < 10) - color = '0.7 0.7 0'; - else - color = '1 1 1'; - - vector picpos, numpos; - if(autocvar_hud_panel_itemstime_iconalign) - { - numpos = myPos; - picpos = myPos + eX * (ar - 1) * mySize_y; - } - else - { - numpos = myPos + eX * mySize_y; - picpos = myPos; - } - - if(t > 0 && autocvar_hud_panel_itemstime_progressbar) - { - vector p_pos, p_size; - if(autocvar_hud_panel_itemstime_progressbar_reduced) - { - p_pos = numpos; - p_size = eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y; - } - else - { - p_pos = myPos; - p_size = mySize; - } - HUD_Panel_DrawProgressBar(p_pos, p_size, autocvar_hud_panel_itemstime_progressbar_name, t/autocvar_hud_panel_itemstime_progressbar_maxtime, 0, autocvar_hud_panel_itemstime_iconalign, color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - } - - if(t > 0 && autocvar_hud_panel_itemstime_text) - drawstring_aspect(numpos, ftos(t), eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL); - else - picpos.x = myPos.x + mySize.x / 2 - mySize.y / 2; - if(item_availableTime) - drawpic_aspect_skin_expanding(picpos, GetItemsTimePicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL, item_availableTime); - drawpic_aspect_skin(picpos, GetItemsTimePicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL); -} - -void HUD_ItemsTime(void) -{ - if(!autocvar__hud_configure) - { - if(!( - (autocvar_hud_panel_itemstime == 1 && spectatee_status != 0) - || (autocvar_hud_panel_itemstime == 2 && (spectatee_status != 0 || warmup_stage)) - )) { return; } - - ItemsTime_time[0] = getstatf(STAT_ARMOR_LARGE_TIME); - ItemsTime_time[1] = getstatf(STAT_HEALTH_MEGA_TIME); - ItemsTime_time[2] = getstatf(STAT_INVISIBLE_TIME); - ItemsTime_time[3] = getstatf(STAT_SPEED_TIME); - ItemsTime_time[4] = getstatf(STAT_EXTRALIFE_TIME); - ItemsTime_time[5] = getstatf(STAT_STRENGTH_TIME); - ItemsTime_time[6] = getstatf(STAT_SHIELD_TIME); - ItemsTime_time[7] = getstatf(STAT_FUELREGEN_TIME); - ItemsTime_time[8] = getstatf(STAT_JETPACK_TIME); - ItemsTime_time[9] = getstatf(STAT_SUPERWEAPONS_TIME); - } - else - { - // do not show here mutator-dependent items - ItemsTime_time[0] = time + 0; - ItemsTime_time[1] = time + 8; - ItemsTime_time[2] = -1; // mutator-dependent - ItemsTime_time[3] = -1; // mutator-dependent - ItemsTime_time[4] = -1; // mutator-dependent - ItemsTime_time[5] = time + 0; - ItemsTime_time[6] = time + 4; - ItemsTime_time[7] = time + 49; - ItemsTime_time[8] = -1; - ItemsTime_time[9] = time + 28; - } - - float i; - float count = 0; - if(autocvar_hud_panel_itemstime_hidespawned == 1) - for (i = 0; i < ITEMSTIME_MAXITEMS; ++i) - count += (ItemsTime_time[i] > time || -ItemsTime_time[i] > time); - else if(autocvar_hud_panel_itemstime_hidespawned == 2) - for (i = 0; i < ITEMSTIME_MAXITEMS; ++i) - count += (ItemsTime_time[i] > time); - else - for (i = 0; i < ITEMSTIME_MAXITEMS; ++i) - count += (ItemsTime_time[i] != -1); - if (count == 0) - return; - - HUD_Panel_UpdateCvars(); - - vector pos, mySize; - pos = panel_pos; - mySize = panel_size; - - if(panel_bg_padding) - { - pos += '1 1 0' * panel_bg_padding; - mySize -= '2 2 0' * panel_bg_padding; - } - - float rows, columns; - float ar = max(2, autocvar_hud_panel_itemstime_ratio) + 1; - rows = HUD_GetRowCount(count, mySize, ar); - columns = ceil(count/rows); - - vector itemstime_size = eX * mySize.x*(1/columns) + eY * mySize.y*(1/rows); - - vector offset = '0 0 0'; - float newSize; - if(autocvar_hud_panel_itemstime_dynamicsize) - { - if(autocvar__hud_configure) - if(menu_enabled != 2) - HUD_Panel_DrawBg(1); // also draw the bg of the entire panel - - // reduce panel to avoid spacing items - if(itemstime_size.x / itemstime_size.y < ar) - { - newSize = rows * itemstime_size.x / ar; - pos.y += (mySize.y - newSize) / 2; - mySize.y = newSize; - itemstime_size.y = mySize.y / rows; - } - else - { - newSize = columns * itemstime_size.y * ar; - pos.x += (mySize.x - newSize) / 2; - mySize.x = newSize; - itemstime_size.x = mySize.x / columns; - } - panel_pos = pos - '1 1 0' * panel_bg_padding; - panel_size = mySize + '2 2 0' * panel_bg_padding; - } - else - { - if(itemstime_size.x/itemstime_size.y > ar) - { - newSize = ar * itemstime_size.y; - offset.x = itemstime_size.x - newSize; - pos.x += offset.x/2; - itemstime_size.x = newSize; - } - else - { - newSize = 1/ar * itemstime_size.x; - offset.y = itemstime_size.y - newSize; - pos.y += offset.y/2; - itemstime_size.y = newSize; - } - } - - HUD_Panel_DrawBg(1); - - float row = 0, column = 0; - bool item_available; - for (i = 0; i < ITEMSTIME_MAXITEMS; ++i) { - if (ItemsTime_time[i] == -1) - continue; - - float item_time = ItemsTime_time[i]; - if(item_time < -1) - { - item_available = true; - item_time = -item_time; - } - else - item_available = (item_time <= time); - - if(ItemsTime_time[i] >= 0) - { - if(time <= ItemsTime_time[i]) - ItemsTime_availableTime[i] = 0; - else if(ItemsTime_availableTime[i] == 0) - ItemsTime_availableTime[i] = time; - } - else if(ItemsTime_availableTime[i] == 0) - ItemsTime_availableTime[i] = time; - float f = (time - ItemsTime_availableTime[i]) * 2; - f = (f > 1) ? 0 : bound(0, f, 1); - - if(autocvar_hud_panel_itemstime_hidespawned == 1) - if(!(ItemsTime_time[i] > time || -ItemsTime_time[i] > time)) - continue; +// Minigame +// +#include "../common/minigames/cl_minigames_hud.qc" - if(autocvar_hud_panel_itemstime_hidespawned == 2) - if(!(ItemsTime_time[i] > time)) - continue; - DrawItemsTimeItem(pos + eX * column * (itemstime_size.x + offset.x) + eY * row * (itemstime_size.y + offset.y), itemstime_size, ar, i, item_time, item_available, f); - ++row; - if(row >= rows) - { - row = 0; - column = column + 1; - } - } -} +// QuickMenu (#23) +// +#include "quickmenu.qc" /* @@ -5065,6 +4694,20 @@ Main HUD system ================== */ +bool HUD_Panel_CheckFlags(int showflags) +{ + if ( HUD_Minigame_Showpanels() ) + return showflags & PANEL_SHOW_MINIGAME; + return showflags & PANEL_SHOW_MAINGAME; +} + +void HUD_Panel_Draw(entity panent) +{ + panel = panent; + if ( HUD_Panel_CheckFlags(panel.panel_showflags) ) + panel.panel_draw(); +} + void HUD_Reset (void) { // reset gametype specific icons @@ -5090,12 +4733,17 @@ void HUD_Main (void) // they must fade only when the menu does if(scoreboard_fade_alpha == 1) { - (panel = HUD_PANEL(CENTERPRINT)).panel_draw(); + HUD_Panel_Draw(HUD_PANEL(CENTERPRINT)); return; } if(!autocvar__hud_configure && !hud_fade_alpha) + { + hud_fade_alpha = 1; + HUD_Panel_Draw(HUD_PANEL(VOTE)); + hud_fade_alpha = 0; return; + } // Drawing stuff if (hud_skin_prev != autocvar_hud_skin) @@ -5177,7 +4825,7 @@ void HUD_Main (void) } } if (warning) - dprint("Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"); + LOG_TRACE("Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"); cvar_set("_hud_panelorder", s); if(hud_panelorder_prev) @@ -5194,14 +4842,16 @@ void HUD_Main (void) hud_draw_maximized = 0; // draw panels in the order specified by panel_order array for(i = HUD_PANEL_NUM - 1; i >= 0; --i) - (panel = hud_panel[panel_order[i]]).panel_draw(); + HUD_Panel_Draw(hud_panel[panel_order[i]]); hud_draw_maximized = 1; // panels that may be maximized must check this var // draw maximized panels on top if(hud_panel_radar_maximized) - (panel = HUD_PANEL(RADAR)).panel_draw(); + HUD_Panel_Draw(HUD_PANEL(RADAR)); if(autocvar__con_chat_maximized) - (panel = HUD_PANEL(CHAT)).panel_draw(); + HUD_Panel_Draw(HUD_PANEL(CHAT)); + if(hud_panel_quickmenu) + HUD_Panel_Draw(HUD_PANEL(QUICKMENU)); HUD_Configure_PostDraw();