3 #include <client/hud/hud.qh>
4 #include <client/view.qh>
7 vector teamscore_fontsize;
8 vector teamname_fontsize;
10 void HUD_SpectHUD_Export(int fh)
12 // allow saving cvars that aesthetically change the panel into hud skin files
15 void HUD_SpectHUD_drawCurrentName(vector pos)
17 string s = entcs_GetName(current_player);
18 pos.x -= stringwidth_colors(s, hud_fontsize * 2) / 2;
19 drawcolorcodedstring(pos, s, hud_fontsize * 2, panel_fg_alpha, DRAWFLAG_NORMAL);
22 void HUD_SpectHUD_drawTeamPlayers(vector pos, entity tm, vector rgb, bool invert)
25 vector line_sz = vec2((vid_conwidth - 1) / 7, hud_fontsize.y * 1.5);
26 vector line_sz_sub = vec2((vid_conwidth - 1) / 7, hud_fontsize.y);
29 float a = panel_fg_alpha * 0.8;
33 pos.x -= line_sz.x + hud_fontsize.x;
35 pos.x += hud_fontsize.x;
37 for(pl = players.sort_next; pl; pl = pl.sort_next)
39 if(pl.team != tm.team)
45 vector icon_size = '0 0 0';
46 vector icon_rgb = '1 1 1';
48 // Position and size calculation vectors
50 vector total_sz = vec2(line_sz.x, line_sz.y + line_sz_sub.y);
53 // z411 TODO : Unhardcode luma
54 icon = "gfx/hud/luma/notify_death.tga";
57 entity entcs = entcs_receiver(pl.sv_entnum);
58 if(entcs.m_entcs_private) {
59 health = (entcs.healthvalue / autocvar_hud_panel_healtharmor_maxhealth) * line_sz.x;
60 armor = (GetResource(entcs, RES_ARMOR) / autocvar_hud_panel_healtharmor_maxarmor) * line_sz_sub.x;
62 Weapon wep = REGISTRY_GET(Weapons, entcs.activewepid);
63 icon = strcat("gfx/hud/luma/", wep.model2);
65 if(tm.team == NUM_TEAM_1)
66 icon = "gfx/hud/luma/player_red";
67 else if(tm.team == NUM_TEAM_2)
68 icon = "gfx/hud/luma/player_blue";
69 else if(tm.team == NUM_TEAM_3)
70 icon = "gfx/hud/luma/player_yellow";
71 else if(tm.team == NUM_TEAM_4)
72 icon = "gfx/hud/luma/player_pink";
74 icon = "gfx/hud/luma/player_neutral";
80 vector tmp_sz = draw_getimagesize(icon);
81 icon_size = vec2(total_sz.y*(tmp_sz.x/tmp_sz.y), total_sz.y);
82 total_sz.x += icon_size.x;
86 tmp_over.x -= icon_size.x;
88 drawpic(pos, icon, icon_size, icon_rgb, panel_fg_alpha, DRAWFLAG_NORMAL);
93 playername = textShortenToWidth(entcs_GetName(pl.sv_entnum), line_sz.x * 0.8, hud_fontsize, stringwidth_colors);
95 // Draw health and name
96 drawfill(pos, line_sz, rgb * 0.7, a * 0.3, DRAWFLAG_NORMAL);
98 drawfill(pos, vec2(health, line_sz.y), rgb * 0.7, a, DRAWFLAG_NORMAL);
99 drawcolorcodedstring(pos + eY * ((line_sz.y - hud_fontsize.y) / 2) + eX * (hud_fontsize.x * 0.5), playername, hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
104 drawfill(pos, vec2(armor, line_sz_sub.y), rgb, a, DRAWFLAG_NORMAL);
106 // Highlight current player
107 if(pl.sv_entnum == current_player && spectatee_status != -1)
108 drawfill(tmp_over, total_sz, '1 1 1', 0.3, DRAWFLAG_NORMAL);
110 drawfill(tmp_over, total_sz, '0 0 0', 0.4, DRAWFLAG_NORMAL);
113 pos.x -= icon_size.x;
114 pos.y += line_sz_sub.y * 2;
119 void HUD_SpectHUD_drawTeamScore(vector pos, entity tm, vector rgb, bool invert)
127 tmp_str = ftos(tm.(teamscores(ts_primary)));
130 pos.x -= teamscore_size.x;
132 drawfill(pos, teamscore_size, rgb * 0.8, 0.3, DRAWFLAG_NORMAL);
135 tmp.x += (teamscore_size.x - stringwidth(tmp_str, true, teamscore_fontsize)) / 2;
136 tmp.y += (teamscore_size.y - teamscore_fontsize.y) / 2;
138 draw_beginBoldFont();
139 drawstring(tmp, tmp_str, teamscore_fontsize, rgb, panel_fg_alpha, DRAWFLAG_NORMAL);
143 tmp_str = Team_CustomName(tm.team);
147 tmp.x -= stringwidth_colors(tmp_str, teamname_fontsize) + teamname_fontsize.x * 0.5;
149 tmp.x += teamscore_size.x + teamname_fontsize.x * 0.5;
150 tmp.y += (teamscore_size.y - teamname_fontsize.y) / 2;
152 drawcolorcodedstring(tmp, tmp_str, teamname_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
155 void HUD_SpectHUD_drawDuelScore(vector pos, entity pl, bool invert)
161 vector health_sz = vec2((vid_conwidth - 1) / 6, teamscore_size.y * 0.4);
162 vector armor_sz = vec2(health_sz.x, health_sz.y / 4);
167 entity entcs = entcs_receiver(pl.sv_entnum);
168 if(entcs.m_entcs_private) {
169 health = (entcs.healthvalue / autocvar_hud_panel_healtharmor_maxhealth) * health_sz.x;
170 armor = (GetResource(entcs, RES_ARMOR) / autocvar_hud_panel_healtharmor_maxarmor) * armor_sz.x;
174 tmp_str = ftos(pl.(scores(ps_primary)));
177 pos.x -= teamscore_size.x;
179 drawfill(pos, teamscore_size, '0 0 0', 0.3, DRAWFLAG_NORMAL);
182 tmp.x += (teamscore_size.x - stringwidth(tmp_str, true, teamscore_fontsize)) / 2;
183 tmp.y += (teamscore_size.y - teamscore_fontsize.y) / 2;
185 draw_beginBoldFont();
186 drawstring(tmp, tmp_str, teamscore_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
189 // Player health/armor
191 tmp_in.y += ((teamscore_size.y / 2) - health_sz.y) / 2;
196 tmp.x -= health_sz.x;
198 tmp.x += teamscore_size.x;
200 drawfill(tmp, health_sz, '0 0 0', 0.3, DRAWFLAG_NORMAL);
208 tmp.x += teamscore_size.x;
210 drawfill(tmp, vec2(health, health_sz.y), '1 0 0', 0.7, DRAWFLAG_NORMAL);
215 tmp.y += health_sz.y - armor_sz.y;
220 tmp.x += teamscore_size.x;
222 drawfill(tmp, vec2(armor, armor_sz.y), '0 1 0', 0.7, DRAWFLAG_NORMAL);
226 tmp_str = entcs_GetName(pl.sv_entnum);
230 tmp.x -= stringwidth_colors(tmp_str, teamname_fontsize) + teamname_fontsize.x * 0.5;
232 tmp.x += teamscore_size.x + teamname_fontsize.x * 0.5;
233 tmp.y += ((teamscore_size.y / 2) - teamname_fontsize.y) / 2;
234 tmp.y += teamscore_size.y / 2;
236 drawcolorcodedstring(tmp, tmp_str, teamname_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
241 if(!spectatee_status) return;
244 float ammo_y, timer_width;
248 HUD_Panel_LoadCvars();
250 hud_fontsize = HUD_GetFontsize("hud_fontsize");
253 if (autocvar_hud_spectatorplayernamedisplay)
255 if(spectatee_status != -1) {
256 ammo_y = stov(cvar_string("hud_panel_ammo_pos")).y * vid_conheight;
257 pos = panel_pos + vec2((vid_conwidth - 1) / 2, (ammo_y - (hud_fontsize.y * 2)));
258 HUD_SpectHUD_drawCurrentName(pos);
262 if (teamplay && autocvar_hud_spectatorteamdisplay)
265 teamscore_fontsize = hud_fontsize * 3;
266 teamname_fontsize = hud_fontsize * 2;
267 teamscore_size = vec2(teamscore_fontsize.x * 1.5, teamscore_fontsize.y * 1.25);
268 timer_width = stov(cvar_string("hud_panel_timer_size")).x * vid_conwidth;
271 pos = panel_pos + vec2((vid_conwidth - 1) / 2, 0);
272 tm = GetTeam(NUM_TEAM_1, false);
273 rgb = Team_ColorRGB(tm.team);
274 pos.x -= (timer_width * 1.3) / 2;
275 HUD_SpectHUD_drawTeamScore(pos, tm, rgb, true);
277 pos = panel_pos + vec2(0, (vid_conheight - 1) / 4 + hud_fontsize.y);
278 HUD_SpectHUD_drawTeamPlayers(pos, tm, rgb, false);
281 pos = panel_pos + vec2((vid_conwidth - 1) / 2, 0);
282 tm = GetTeam(NUM_TEAM_2, false);
283 rgb = Team_ColorRGB(tm.team);
284 pos.x += (timer_width * 1.3) / 2;
285 HUD_SpectHUD_drawTeamScore(pos, tm, rgb, false);
287 pos = panel_pos + vec2(vid_conwidth - 1, (vid_conheight - 1) / 4 + hud_fontsize.y);
288 HUD_SpectHUD_drawTeamPlayers(pos, tm, rgb, true);
291 pos = panel_pos + vec2((vid_conwidth - 1) / 2, 41);
292 tm = GetTeam(NUM_TEAM_3, false);
293 rgb = Team_ColorRGB(tm.team);
294 pos.x -= (timer_width * 1.3) / 2;
295 HUD_SpectHUD_drawTeamScore(pos, tm, rgb, true);
297 pos = panel_pos + vec2(0, (vid_conheight + 450) / 4 + hud_fontsize.y);
298 HUD_SpectHUD_drawTeamPlayers(pos, tm, rgb, false);
301 pos = panel_pos + vec2((vid_conwidth - 1) / 2, 41);
302 tm = GetTeam(NUM_TEAM_4, false);
303 rgb = Team_ColorRGB(tm.team);
304 pos.x += (timer_width * 1.3) / 2;
305 HUD_SpectHUD_drawTeamScore(pos, tm, rgb, false);
307 pos = panel_pos + vec2(vid_conwidth - 1, (vid_conheight + 450) / 4 + hud_fontsize.y);
308 HUD_SpectHUD_drawTeamPlayers(pos, tm, rgb, true);
309 } else if(gametype == MAPINFO_TYPE_DUEL && autocvar_hud_spectatordueldisplay) {
311 teamscore_fontsize = hud_fontsize * 3;
312 teamname_fontsize = hud_fontsize * 1.5;
313 teamscore_size = vec2(teamscore_fontsize.x * 1.5, teamscore_fontsize.y * 1.25);
314 timer_width = stov(cvar_string("hud_panel_timer_size")).x * vid_conwidth;
316 entity pl_left = players.sort_next;
317 entity pl_right = pl_left.sort_next;
320 pos = panel_pos + vec2((vid_conwidth - 1) / 2, 0);
321 pos.x -= (timer_width * 1.3) / 2;
322 HUD_SpectHUD_drawDuelScore(pos, pl_left, true);
325 pos = panel_pos + vec2((vid_conwidth - 1) / 2, 0);
326 pos.x += (timer_width * 1.3) / 2;
327 HUD_SpectHUD_drawDuelScore(pos, pl_right, false);