]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/notify.qc
Merge branch 'master' into Mirio/balance
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / notify.qc
1 #include "notify.qh"
2
3
4 // Notifications (#4)
5
6 void HUD_Notify_Push(string icon, string attacker, string victim)
7 {
8         if (icon == "")
9                 return;
10
11         ++notify_count;
12         --notify_index;
13
14         if (notify_index == -1)
15                 notify_index = NOTIFY_MAX_ENTRIES-1;
16
17         // Free old strings
18         if (notify_attackers[notify_index])
19                 strunzone(notify_attackers[notify_index]);
20
21         if (notify_victims[notify_index])
22                 strunzone(notify_victims[notify_index]);
23
24         if (notify_icons[notify_index])
25                 strunzone(notify_icons[notify_index]);
26
27         // Allocate new strings
28         if (victim != "")
29         {
30                 notify_attackers[notify_index] = strzone(attacker);
31                 notify_victims[notify_index] = strzone(victim);
32         }
33         else
34         {
35                 // In case of a notification without a victim, the attacker
36                 // is displayed on the victim's side. Instead of special
37                 // treatment later on, we can simply switch them here.
38                 notify_attackers[notify_index] = string_null;
39                 notify_victims[notify_index] = strzone(attacker);
40         }
41
42         notify_icons[notify_index] = strzone(icon);
43         notify_times[notify_index] = time;
44 }
45
46 void HUD_Notify()
47 {
48         if (!autocvar__hud_configure)
49                 if (!autocvar_hud_panel_notify)
50                         return;
51
52         HUD_Panel_LoadCvars();
53
54         if (autocvar_hud_panel_notify_dynamichud)
55                 HUD_Scale_Enable();
56         else
57                 HUD_Scale_Disable();
58         HUD_Panel_DrawBg();
59
60         if (!autocvar__hud_configure)
61                 if (notify_count == 0)
62                         return;
63
64         vector pos, size;
65         pos  = panel_pos;
66         size = panel_size;
67
68         if (panel_bg_padding)
69         {
70                 pos  += '1 1 0' * panel_bg_padding;
71                 size -= '2 2 0' * panel_bg_padding;
72         }
73
74         float fade_start = max(0, autocvar_hud_panel_notify_time);
75         float fade_time = max(0, autocvar_hud_panel_notify_fadetime);
76         float icon_aspect = max(1, autocvar_hud_panel_notify_icon_aspect);
77
78         int entry_count = bound(1, floor(NOTIFY_MAX_ENTRIES * size.y / size.x), NOTIFY_MAX_ENTRIES);
79         float entry_height = size.y / entry_count;
80
81         float panel_width_half = size.x * 0.5;
82         float icon_width_half = entry_height * icon_aspect / 2;
83         float name_maxwidth = panel_width_half - icon_width_half - size.x * NOTIFY_ICON_MARGIN;
84
85         vector font_size = '0.5 0.5 0' * entry_height * autocvar_hud_panel_notify_fontsize;
86         vector icon_size = (eX * icon_aspect + eY) * entry_height;
87         vector icon_left = eX * (panel_width_half - icon_width_half);
88         vector attacker_right = eX * name_maxwidth;
89         vector victim_left = eX * (size.x - name_maxwidth);
90
91         vector attacker_pos, victim_pos, icon_pos;
92         string attacker, victim, icon;
93         int i, j, count, step, limit;
94         float alpha;
95
96         if (autocvar_hud_panel_notify_flip)
97         {
98                 // Order items from the top down
99                 i = 0;
100                 step = +1;
101                 limit = entry_count;
102         }
103         else
104         {
105                 // Order items from the bottom up
106                 i = entry_count - 1;
107                 step = -1;
108                 limit = -1;
109         }
110
111         for (j = notify_index, count = 0; i != limit; i += step, ++j, ++count)
112         {
113                 if(autocvar__hud_configure)
114                 {
115                         attacker = sprintf(_("Player %d"), count + 1);
116                         victim = sprintf(_("Player %d"), count + 2);
117                         icon = Weapons_from(min(WEP_FIRST + count * 2, WEP_LAST)).model2;
118                         alpha = bound(0, 1.2 - count / entry_count, 1);
119                 }
120                 else
121                 {
122                         if (j == NOTIFY_MAX_ENTRIES)
123                                 j = 0;
124
125                         if (notify_times[j] + fade_start > time)
126                                 alpha = 1;
127                         else if (fade_time != 0)
128                         {
129                                 alpha = bound(0, (notify_times[j] + fade_start + fade_time - time) / fade_time, 1);
130                                 if (alpha == 0)
131                                         break;
132                         }
133                         else
134                                 break;
135
136                         attacker = notify_attackers[j];
137                         victim = notify_victims[j];
138                         icon = notify_icons[j];
139                 }
140
141                 if (icon != "" && victim != "")
142                 {
143                         vector name_top = eY * (i * entry_height + 0.5 * (entry_height - font_size.y));
144
145                         icon_pos = pos + icon_left + eY * i * entry_height;
146                         drawpic_aspect_skin(icon_pos, icon, icon_size, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
147
148                         victim = textShortenToWidth(victim, name_maxwidth, font_size, stringwidth_colors);
149                         victim_pos = pos + victim_left + name_top;
150                         drawcolorcodedstring(victim_pos, victim, font_size, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
151
152                         if (attacker != "")
153                         {
154                                 attacker = textShortenToWidth(attacker, name_maxwidth, font_size, stringwidth_colors);
155                                 attacker_pos = pos + attacker_right - eX * stringwidth(attacker, true, font_size) + name_top;
156                                 drawcolorcodedstring(attacker_pos, attacker, font_size, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
157                         }
158                 }
159         }
160
161         notify_count = count;
162 }