]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/announcer.qc
Proper precaching, plus make the net_announce system ACTUALLY work instead
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / announcer.qc
1 void Net_Announcer(string announce_snd)
2 {
3   sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
4 }
5
6 /**
7  * Checks whether the server initiated a map restart (stat_game_starttime changed)
8  *
9  * TODO: Use a better solution where a common shared entitiy is used that contains
10  * timelimit, fraglimit and game_starttime! Requires engine changes (remove STAT_TIMELIMIT
11  * and STAT_FRAGLIMIT to be auto-sent)
12  */
13 void CheckForGamestartChange() {
14         float startTime;
15         startTime = getstatf(STAT_GAMESTARTTIME);
16         if (previous_game_starttime != startTime) {
17                 if ((time + 5.0) < startTime) {
18                         //if connecting to server while restart was active don't always play prepareforbattle
19                         sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
20                 }
21                 if (time < startTime) {
22                         restartAnnouncer = spawn();
23                         restartAnnouncer.think = restartAnnouncer_Think;
24                         restartAnnouncer.nextthink = startTime - floor(startTime - time); //synchronize nextthink to startTime
25                 }
26         }
27         previous_game_starttime = startTime;
28 }
29
30 void restartAnnouncer_Think() {
31         float countdown_rounded, countdown;
32         countdown = getstatf(STAT_GAMESTARTTIME) - time;
33         countdown_rounded = floor(0.5 + countdown);
34         if(countdown <= 0) {
35                 if (!spectatee_status) //do cprint only for players
36                         centerprint_generic(CPID_GAME_STARTING, _("^1Begin!"), 1, 0);
37
38                 sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
39                 //reset maptime announcers now as well
40                 announcer_5min = announcer_1min = FALSE;
41
42                 remove(self);
43                 return;
44         }
45         else {
46                 if (!spectatee_status) //do cprint only for players
47                         centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded);
48
49                 if(countdown_rounded <= 3 && countdown_rounded >= 1) {
50                         sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
51                 }
52
53                 self.nextthink = getstatf(STAT_GAMESTARTTIME) - (countdown - 1);
54         }
55 }
56
57 /**
58  * Plays the 1minute or 5 minutes (of maptime) remaining sound, if client wants it
59  */
60 void maptimeAnnouncer() {
61         float timelimit;
62         timelimit = getstatf(STAT_TIMELIMIT);
63         float timeleft;
64         timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
65
66         float warmuplimit;
67         float warmuptimeleft;
68         if(warmup_stage) {
69                 warmuplimit = autocvar_g_warmup_limit;
70                 if(warmuplimit > 0) {
71                         warmuptimeleft = max(0, warmuplimit + getstatf(STAT_GAMESTARTTIME) - time); 
72                 }
73         }
74
75         //5 minute check
76         if (autocvar_cl_sound_maptime_warning >= 2) {
77                 //make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
78                 if(announcer_5min)
79                 {
80                         if(((!warmup_stage || warmuplimit == 0) && timeleft > 300) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 300))
81                                 announcer_5min = FALSE;
82                 }
83                 else if (((!warmup_stage || warmuplimit == 0) && timelimit > 0 && timeleft < 300 && timeleft > 299) || (warmup_stage && warmuplimit > 0 && warmuptimeleft < 300 && warmuptimeleft > 299))
84                         //if we're in warmup mode, check whether there's a warmup timelimit
85                         if not (warmuplimit == -1 && warmup_stage) {
86                                 announcer_5min = TRUE;
87                                 sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
88                         }
89         }
90
91         //1 minute check
92         if (autocvar_cl_sound_maptime_warning == 1 || autocvar_cl_sound_maptime_warning == 3) {
93                 if (announcer_1min)
94                 {
95                         if(((!warmup_stage || warmuplimit == 0) && timeleft > 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 60))
96                                 announcer_1min = FALSE;
97                 }
98                 else if (((!warmup_stage || warmuplimit == 0) && timelimit > 0 && timeleft < 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft < 60))
99                         //if we're in warmup mode, check whether there's a warmup timelimit
100                         if not (warmuplimit == -1 && warmup_stage) {
101                                 announcer_1min = TRUE;
102                                 sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
103                         }
104         }
105 }
106
107 /**
108  * Announce carried items (e.g. flags in CTF).
109  */
110 float redflag_prev;
111 float blueflag_prev;
112 void carrierAnnouncer() {
113         float stat_items, redflag, blueflag;
114         float pickup;
115         string item;
116
117         if not(autocvar_cl_notify_carried_items)
118                 return;
119
120         stat_items = getstati(STAT_ITEMS);
121
122         redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
123         blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
124
125         if (redflag == 3 && redflag != redflag_prev) {
126                 item = _("^1RED^7 flag");
127                 pickup = (redflag_prev == 2);
128         }
129
130         if (blueflag == 3 && blueflag != blueflag_prev) {
131                 item = _("^4BLUE^7 flag");
132                 pickup = (blueflag_prev == 2);
133         }
134
135         if (item)
136         {
137                 if (pickup) {
138                         if (autocvar_cl_notify_carried_items & 2)
139                                 centerprint(sprintf(_("You picked up the %s!"), item));
140                 }
141                 else {
142                         if (autocvar_cl_notify_carried_items & 1)
143                                 centerprint(sprintf(_("You got the %s!"), item));
144                 }
145         }
146
147         blueflag_prev = blueflag;
148         redflag_prev = redflag;
149 }
150
151 void Announcer()
152 {
153   CheckForGamestartChange();
154         maptimeAnnouncer();
155         carrierAnnouncer();
156 }
157
158 /**
159  * Add all future announcer sounds precaches here.
160  * TODO: announcer queues
161  */
162 void Announcer_Precache () {
163         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"));
164         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"));
165
166         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/electrobitch.wav"));
167         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/airshot.wav"));
168         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/03kills.wav"));
169         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/05kills.wav"));
170         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10kills.wav"));
171         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/15kills.wav"));
172         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/20kills.wav"));
173         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/25kills.wav"));
174         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/30kills.wav"));
175         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/botlike.wav"));
176         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/yoda.wav"));
177         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/amazing.wav"));
178         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/awesome.wav"));
179         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/headshot.wav"));
180         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/impressive.wav"));
181
182         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"));
183         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/begin.wav"));
184         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/timeoutcalled.wav"));
185         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1fragleft.wav"));
186         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2fragsleft.wav"));
187         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3fragsleft.wav"));
188         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/terminated.wav"));
189
190         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1.wav"));
191         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2.wav"));
192         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3.wav"));
193         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/4.wav"));
194         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5.wav"));
195         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/6.wav"));
196         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/7.wav"));
197         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/8.wav"));
198         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/9.wav"));
199         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10.wav"));
200
201         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/lastsecond.wav"));
202         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/narrowly.wav"));
203
204         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/voteaccept.wav"));
205         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votecall.wav"));
206         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votefail.wav"));
207 }