1 /** Health/armor (#3) */
4 int armor, health, fuel;
5 if(!autocvar__hud_configure)
7 if(!autocvar_hud_panel_healtharmor) return;
8 if(hud != HUD_NORMAL) return;
9 if(spectatee_status == -1) return;
11 health = getstati(STAT_HEALTH);
17 armor = getstati(STAT_ARMOR);
19 // code to check for spectatee_status changes is in Ent_ClientData()
20 // prev_p_health and prev_health can be set to -1 there
22 if (prev_p_health == -1)
25 health_beforedamage = 0;
26 armor_beforedamage = 0;
27 health_damagetime = 0;
31 old_p_health = health;
33 prev_p_health = health;
36 else if (prev_health == -1)
38 //start the load effect
39 health_damagetime = 0;
53 HUD_Panel_UpdateCvars();
64 pos += '1 1 0' * panel_bg_padding;
65 mySize -= '2 2 0' * panel_bg_padding;
68 int baralign = autocvar_hud_panel_healtharmor_baralign;
69 int iconalign = autocvar_hud_panel_healtharmor_iconalign;
71 int maxhealth = autocvar_hud_panel_healtharmor_maxhealth;
72 int maxarmor = autocvar_hud_panel_healtharmor_maxarmor;
73 if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display
76 v = healtharmor_maxdamage(health, armor, armorblockpercent, DEATH_WEAPON.m_id);
81 float maxtotal = maxhealth + maxarmor;
83 if(v.z) // NOT fully armored
85 biggercount = "health";
86 if(autocvar_hud_panel_healtharmor_progressbar)
87 HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_health, x/maxtotal, 0, (baralign == 1 || baralign == 2), autocvar_hud_progressbar_health_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
89 if(autocvar_hud_panel_healtharmor_text)
90 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);
94 biggercount = "armor";
95 if(autocvar_hud_panel_healtharmor_progressbar)
96 HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, x/maxtotal, 0, (baralign == 1 || baralign == 2), autocvar_hud_progressbar_armor_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
98 if(autocvar_hud_panel_healtharmor_text)
99 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);
101 if(autocvar_hud_panel_healtharmor_text)
102 DrawNumIcon(pos, mySize, x, biggercount, 0, iconalign, HUD_Get_Num_Color(x, maxtotal), 1);
105 HUD_Panel_DrawProgressBar(pos, eX * mySize.x + eY * 0.2 * mySize.y, "progressbar", fuel/100, 0, (baralign == 1 || baralign == 3), autocvar_hud_progressbar_fuel_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
109 float panel_ar = mySize.x/mySize.y;
110 bool is_vertical = (panel_ar < 1);
111 vector health_offset = '0 0 0', armor_offset = '0 0 0';
112 if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
115 if (autocvar_hud_panel_healtharmor_flip)
116 health_offset.x = mySize.x;
118 armor_offset.x = mySize.x;
123 if (autocvar_hud_panel_healtharmor_flip)
124 health_offset.y = mySize.y;
126 armor_offset.y = mySize.y;
129 bool health_baralign, armor_baralign, fuel_baralign;
130 bool health_iconalign, armor_iconalign;
131 if (autocvar_hud_panel_healtharmor_flip)
133 armor_baralign = (autocvar_hud_panel_healtharmor_baralign == 2 || autocvar_hud_panel_healtharmor_baralign == 1);
134 health_baralign = (autocvar_hud_panel_healtharmor_baralign == 3 || autocvar_hud_panel_healtharmor_baralign == 1);
135 fuel_baralign = health_baralign;
136 armor_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 2 || autocvar_hud_panel_healtharmor_iconalign == 1);
137 health_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 3 || autocvar_hud_panel_healtharmor_iconalign == 1);
141 health_baralign = (autocvar_hud_panel_healtharmor_baralign == 2 || autocvar_hud_panel_healtharmor_baralign == 1);
142 armor_baralign = (autocvar_hud_panel_healtharmor_baralign == 3 || autocvar_hud_panel_healtharmor_baralign == 1);
143 fuel_baralign = armor_baralign;
144 health_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 2 || autocvar_hud_panel_healtharmor_iconalign == 1);
145 armor_iconalign = (autocvar_hud_panel_healtharmor_iconalign == 3 || autocvar_hud_panel_healtharmor_iconalign == 1);
150 if(autocvar_hud_panel_healtharmor_progressbar)
152 float p_health, pain_health_alpha;
154 pain_health_alpha = 1;
155 if (autocvar_hud_panel_healtharmor_progressbar_gfx)
157 if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0)
159 if (fabs(prev_health - health) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth)
161 if (time - old_p_healthtime < 1)
162 old_p_health = prev_p_health;
164 old_p_health = prev_health;
165 old_p_healthtime = time;
167 if (time - old_p_healthtime < 1)
169 p_health += (old_p_health - health) * (1 - (time - old_p_healthtime));
170 prev_p_health = p_health;
173 if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0)
175 if (prev_health - health >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage)
177 if (time - health_damagetime >= 1)
178 health_beforedamage = prev_health;
179 health_damagetime = time;
181 if (time - health_damagetime < 1)
183 float health_damagealpha = 1 - (time - health_damagetime)*(time - health_damagetime);
184 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);
187 prev_health = health;
189 if (health <= autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth)
191 float BLINK_FACTOR = 0.15;
192 float BLINK_BASE = 0.85;
193 float BLINK_FREQ = 9;
194 pain_health_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
197 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);
199 if(autocvar_hud_panel_healtharmor_text)
200 DrawNumIcon(pos + health_offset, mySize, health, "health", is_vertical, health_iconalign, HUD_Get_Num_Color(health, maxhealth), 1);
205 if(autocvar_hud_panel_healtharmor_progressbar)
209 if (autocvar_hud_panel_healtharmor_progressbar_gfx)
211 if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0)
213 if (fabs(prev_armor - armor) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth)
215 if (time - old_p_armortime < 1)
216 old_p_armor = prev_p_armor;
218 old_p_armor = prev_armor;
219 old_p_armortime = time;
221 if (time - old_p_armortime < 1)
223 p_armor += (old_p_armor - armor) * (1 - (time - old_p_armortime));
224 prev_p_armor = p_armor;
227 if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0)
229 if (prev_armor - armor >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage)
231 if (time - armor_damagetime >= 1)
232 armor_beforedamage = prev_armor;
233 armor_damagetime = time;
235 if (time - armor_damagetime < 1)
237 float armor_damagealpha = 1 - (time - armor_damagetime)*(time - armor_damagetime);
238 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);
243 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);
245 if(autocvar_hud_panel_healtharmor_text)
246 DrawNumIcon(pos + armor_offset, mySize, armor, "armor", is_vertical, armor_iconalign, HUD_Get_Num_Color(armor, maxarmor), 1);
252 mySize.x *= 0.2 / 2; //if vertical always halve x to not cover too much numbers with 3 digits
256 mySize.x *= 2; //restore full panel size
257 else if (panel_ar < 1/4)
258 mySize.y *= 2; //restore full panel size
259 HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, fuel_baralign, autocvar_hud_progressbar_fuel_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);