1 #include "healtharmor.qh"
3 #include <client/defs.qh>
4 #include <client/miscfunctions.qh>
6 #include <common/deathtypes/all.qh>
10 void HUD_HealthArmor()
12 int armor, health, fuel, air_time;
13 if(!autocvar__hud_configure)
15 if((!autocvar_hud_panel_healtharmor) || (spectatee_status == -1))
17 if(hud != HUD_NORMAL) return;
19 health = STAT(HEALTH);
24 if(autocvar_hud_panel_healtharmor_hide_ondeath)
29 // code to check for spectatee_status changes is in ENT_CLIENT_CLIENTDATA
30 // prev_p_health and prev_health can be set to -1 there
32 if (prev_p_health == -1)
35 health_beforedamage = 0;
36 armor_beforedamage = 0;
37 health_damagetime = 0;
41 old_p_health = health;
43 prev_p_health = health;
46 else if (prev_health == -1)
48 //start the load effect
49 health_damagetime = 0;
55 air_time = bound(0, STAT(AIR_FINISHED) - time, 10);
65 HUD_Panel_LoadCvars();
73 if (autocvar_hud_panel_healtharmor_dynamichud)
80 pos += '1 1 0' * panel_bg_padding;
81 mySize -= '2 2 0' * panel_bg_padding;
84 float BLINK_FACTOR = 0.5;
85 float BLINK_BASE = 0.5;
88 if (STAT(AIR_FINISHED) && time > STAT(AIR_FINISHED))
90 air_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
94 int baralign = autocvar_hud_panel_healtharmor_baralign;
95 int iconalign = autocvar_hud_panel_healtharmor_iconalign;
97 int maxhealth = autocvar_hud_panel_healtharmor_maxhealth;
98 int maxarmor = autocvar_hud_panel_healtharmor_maxarmor;
99 if(autocvar_hud_panel_healtharmor_combined) // combined health and armor display
101 vector v = healtharmor_maxdamage(health, armor, armorblockpercent, DEATH_WEAPON.m_id);
102 float hp = floor(v.x + 1);
104 float maxtotal = maxhealth + maxarmor;
106 if(v.z) // NOT fully armored
108 biggercount = "health";
109 if(autocvar_hud_panel_healtharmor_progressbar)
110 HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_health, hp/maxtotal, 0, (baralign == 1 || baralign == 2), autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
111 if(armor && autocvar_hud_panel_healtharmor_text)
112 drawpic_aspect_skin(pos + eX * mySize.x - eX * 0.5 * mySize.y, "armor", '0.5 0.5 0' * mySize.y, '1 1 1', panel_fg_alpha * armor / health, DRAWFLAG_NORMAL);
116 biggercount = "armor";
117 if(autocvar_hud_panel_healtharmor_progressbar)
118 HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, hp/maxtotal, 0, (baralign == 1 || baralign == 2), autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
119 if(health && autocvar_hud_panel_healtharmor_text)
120 drawpic_aspect_skin(pos + eX * mySize.x - eX * 0.5 * mySize.y, "health", '0.5 0.5 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
122 if(autocvar_hud_panel_healtharmor_text)
123 DrawNumIcon(pos, mySize, hp, biggercount, 0, iconalign, HUD_Get_Num_Color(hp, maxtotal), 1);
126 HUD_Panel_DrawProgressBar(pos, vec2(mySize.x, 0.2 * mySize.y), "progressbar", fuel/100, 0, (baralign == 1 || baralign == 3), autocvar_hud_progressbar_fuel_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
128 HUD_Panel_DrawProgressBar(pos + eY * 0.8 * mySize.y, vec2(mySize.x, 0.2 * mySize.y), "progressbar", air_time / 10, 0, (baralign == 1 || baralign == 3), autocvar_hud_progressbar_oxygen_color, air_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
132 float panel_ar = mySize.x/mySize.y;
133 bool is_vertical = (panel_ar < 1);
134 vector health_offset = '0 0 0', armor_offset = '0 0 0';
135 if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
138 if (autocvar_hud_panel_healtharmor_flip)
139 health_offset.x = mySize.x;
141 armor_offset.x = mySize.x;
146 if (autocvar_hud_panel_healtharmor_flip)
147 health_offset.y = mySize.y;
149 armor_offset.y = mySize.y;
152 bool health_baralign, armor_baralign, fuel_baralign, air_align;
153 bool health_iconalign, armor_iconalign;
154 if (autocvar_hud_panel_healtharmor_flip)
156 armor_baralign = (autocvar_hud_panel_healtharmor_baralign == 2 || autocvar_hud_panel_healtharmor_baralign == 1);
157 health_baralign = (autocvar_hud_panel_healtharmor_baralign == 3 || autocvar_hud_panel_healtharmor_baralign == 1);
158 air_align = fuel_baralign = health_baralign;
159 armor_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 2 || autocvar_hud_panel_healtharmor_iconalign == 1);
160 health_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 3 || autocvar_hud_panel_healtharmor_iconalign == 1);
164 health_baralign = (autocvar_hud_panel_healtharmor_baralign == 2 || autocvar_hud_panel_healtharmor_baralign == 1);
165 armor_baralign = (autocvar_hud_panel_healtharmor_baralign == 3 || autocvar_hud_panel_healtharmor_baralign == 1);
166 air_align = fuel_baralign = armor_baralign;
167 health_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 2 || autocvar_hud_panel_healtharmor_iconalign == 1);
168 armor_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 3 || autocvar_hud_panel_healtharmor_iconalign == 1);
173 if(autocvar_hud_panel_healtharmor_progressbar)
175 float p_health, pain_health_alpha;
177 pain_health_alpha = 1;
178 if (autocvar_hud_panel_healtharmor_progressbar_gfx)
180 if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0)
182 if (fabs(prev_health - health) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth)
184 if (time - old_p_healthtime < 1)
185 old_p_health = prev_p_health;
187 old_p_health = prev_health;
188 old_p_healthtime = time;
190 if (time - old_p_healthtime < 1)
192 p_health += (old_p_health - health) * (1 - (time - old_p_healthtime));
193 prev_p_health = p_health;
196 if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0)
198 if (prev_health - health >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage)
200 if (time - health_damagetime >= 1)
201 health_beforedamage = prev_health;
202 health_damagetime = time;
204 if (time - health_damagetime < 1)
206 float health_damagealpha = 1 - (time - health_damagetime)*(time - health_damagetime);
207 HUD_Panel_DrawProgressBar(pos + health_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_health, health_beforedamage/maxhealth, is_vertical, health_baralign, autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * health_damagealpha, DRAWFLAG_NORMAL);
210 prev_health = health;
212 if (health <= autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth)
214 float BLINK_FACTOR = 0.15;
215 float BLINK_BASE = 0.85;
216 float BLINK_FREQ = 9;
217 pain_health_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
220 HUD_Panel_DrawProgressBar(pos + health_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_health, p_health/maxhealth, is_vertical, health_baralign, autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * pain_health_alpha, DRAWFLAG_NORMAL);
222 if(autocvar_hud_panel_healtharmor_text)
223 DrawNumIcon(pos + health_offset, mySize, health, "health", is_vertical, health_iconalign, HUD_Get_Num_Color(health, maxhealth), 1);
228 float p_armor = armor;
229 if(autocvar_hud_panel_healtharmor_progressbar)
231 if (autocvar_hud_panel_healtharmor_progressbar_gfx)
233 if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0)
235 if (fabs(prev_armor - armor) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth)
237 if (time - old_p_armortime < 1)
238 old_p_armor = prev_p_armor;
240 old_p_armor = prev_armor;
241 old_p_armortime = time;
243 if (time - old_p_armortime < 1)
245 p_armor += (old_p_armor - armor) * (1 - (time - old_p_armortime));
246 prev_p_armor = p_armor;
249 if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0)
251 if (prev_armor - armor >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage)
253 if (time - armor_damagetime >= 1)
254 armor_beforedamage = prev_armor;
255 armor_damagetime = time;
257 if (time - armor_damagetime < 1)
259 float armor_damagealpha = 1 - (time - armor_damagetime)*(time - armor_damagetime);
260 HUD_Panel_DrawProgressBar(pos + armor_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, armor_beforedamage/maxarmor, is_vertical, armor_baralign, autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * armor_damagealpha, DRAWFLAG_NORMAL);
266 HUD_Panel_DrawProgressBar(pos + armor_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, p_armor/maxarmor, is_vertical, armor_baralign, autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
268 if(!autocvar_hud_panel_healtharmor_progressbar || p_armor)
269 if(autocvar_hud_panel_healtharmor_text)
270 DrawNumIcon(pos + armor_offset, mySize, armor, "armor", is_vertical, armor_iconalign, HUD_Get_Num_Color(armor, maxarmor), 1);
273 vector cell_size = mySize;
274 if (fuel || air_time)
277 mySize.x *= 0.2 / 2; //if vertical always halve x to not cover too much numbers with 3 digits
281 mySize.x *= 2; //restore full panel size
282 else if (panel_ar < 1/4)
283 mySize.y *= 2; //restore full panel size
285 HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, fuel_baralign, autocvar_hud_progressbar_fuel_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
288 if (panel_ar > 1 && panel_ar < 4)
289 pos.y += cell_size.y;
290 else if (panel_ar > 1/4 && panel_ar <= 1)
291 pos.x += cell_size.x;
293 pos.x += cell_size.x - mySize.x;
295 pos.y += cell_size.y - mySize.y;
296 HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", air_time / 10, is_vertical, air_align, autocvar_hud_progressbar_oxygen_color, air_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);