3 #include "scoreboard.qh"
4 #include <common/t_items.qh>
8 void DrawNadeProgressBar(vector myPos, vector mySize, float progress, vector color)
10 HUD_Panel_DrawProgressBar(
11 myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x,
12 mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x,
13 autocvar_hud_panel_ammo_progressbar_name,
14 progress, 0, 0, color,
15 autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
18 void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time); // TODO: mutator
20 void DrawAmmoItem(vector myPos, vector mySize, .int ammoType, bool isCurrent, bool isInfinite)
22 TC(bool, isCurrent); TC(bool, isInfinite);
23 if(ammoType == ammo_none)
26 // Initialize variables
29 if(autocvar__hud_configure)
31 isCurrent = (ammoType == ammo_rockets); // Rockets always current
35 ammo = getstati(GetAmmoStat(ammoType));
39 float scale = bound(0, autocvar_hud_panel_ammo_noncurrent_scale, 1);
40 myPos = myPos + (mySize - mySize * scale) * 0.5;
41 mySize = mySize * scale;
44 vector iconPos, textPos;
45 if(autocvar_hud_panel_ammo_iconalign)
47 iconPos = myPos + eX * 2 * mySize.y;
53 textPos = myPos + eX * mySize.y;
56 bool isShadowed = (ammo <= 0 && !isCurrent && !isInfinite);
58 vector iconColor = isShadowed ? '0 0 0' : '1 1 1';
61 textColor = '0.2 0.95 0';
65 textColor = '0.8 0.04 0';
71 alpha = panel_fg_alpha;
73 alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_ammo_noncurrent_alpha, 1) * 0.5;
75 alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_ammo_noncurrent_alpha, 1);
77 string text = isInfinite ? "\xE2\x88\x9E" : ftos(ammo); // Use infinity symbol (U+221E)
82 drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
84 if(ammo > 0 && autocvar_hud_panel_ammo_progressbar)
85 HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x, autocvar_hud_panel_ammo_progressbar_name, ammo/autocvar_hud_panel_ammo_maxammo, 0, 0, textColor, autocvar_hud_progressbar_alpha * alpha, DRAWFLAG_NORMAL);
87 if(autocvar_hud_panel_ammo_text)
88 drawstring_aspect(textPos, text, eX * (2/3) * mySize.x + eY * mySize.y, textColor, alpha, DRAWFLAG_NORMAL);
90 drawpic_aspect_skin(iconPos, GetAmmoPicture(ammoType), '1 1 0' * mySize.y, iconColor, alpha, DRAWFLAG_NORMAL);
95 float nade_statuschange_time;
99 if(hud != HUD_NORMAL) return;
100 if(!autocvar__hud_configure)
102 if((!autocvar_hud_panel_ammo) || (spectatee_status == -1))
104 if(STAT(HEALTH) < 1 && autocvar_hud_panel_ammo_hide_ondeath)
108 if(1 - scoreboard_fade_alpha <= 0)
110 HUD_Panel_LoadCvars(1 - scoreboard_fade_alpha);
112 draw_beginBoldFont();
118 if (autocvar_hud_panel_ammo_dynamichud)
125 pos += '1 1 0' * panel_bg_padding;
126 mySize -= '2 2 0' * panel_bg_padding;
129 int rows = 0, columns, row, column;
130 float nade_cnt = STAT(NADE_BONUS), nade_score = STAT(NADE_BONUS_SCORE);
131 bool draw_nades = (nade_cnt > 0 || nade_score > 0);
132 float nade_statuschange_elapsedtime;
133 int total_ammo_count;
136 if (autocvar_hud_panel_ammo_onlycurrent)
137 total_ammo_count = 1;
139 total_ammo_count = AMMO_COUNT;
144 if (nade_cnt != nade_prevframe)
146 nade_statuschange_time = time;
147 nade_prevstatus = nade_prevframe;
148 nade_prevframe = nade_cnt;
152 nade_prevstatus = nade_prevframe = nade_statuschange_time = 0;
154 rows = HUD_GetRowCount(total_ammo_count, mySize, 3);
155 columns = ceil((total_ammo_count)/rows);
156 ammo_size = eX * mySize.x*(1/columns) + eY * mySize.y*(1/rows);
158 vector offset = '0 0 0';
160 if(ammo_size.x/ammo_size.y > 3)
162 newSize = 3 * ammo_size.y;
163 offset.x = ammo_size.x - newSize;
165 ammo_size.x = newSize;
169 newSize = 1/3 * ammo_size.x;
170 offset.y = ammo_size.y - newSize;
172 ammo_size.y = newSize;
175 Weapon wep = switchweapon;
177 bool infinite_ammo = (STAT(ITEMS) & IT_UNLIMITED_WEAPON_AMMO);
179 if(autocvar_hud_panel_ammo_onlycurrent)
181 if(autocvar__hud_configure)
183 DrawAmmoItem(pos, ammo_size, ammo_rockets, true, false);
207 for(i = 0; i < AMMO_COUNT; ++i)
209 ammotype = GetAmmoFieldFromNum(i);
211 pos + eX * column * (ammo_size.x + offset.x) + eY * row * (ammo_size.y + offset.y),
214 (wep.ammo_field == ammotype),
229 nade_statuschange_elapsedtime = time - nade_statuschange_time;
231 float f = bound(0, nade_statuschange_elapsedtime*2, 1);
233 DrawAmmoNades(pos + eX * column * (ammo_size.x + offset.x) + eY * row * (ammo_size.y + offset.y), ammo_size, nade_prevstatus < nade_cnt && nade_cnt != 0 && f < 1, f);