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