]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/target_music.qc
handle the case that a sound cannot start
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / target_music.qc
1 entity music_default;
2 entity music_target;
3 entity music_trigger;
4
5 .float state;
6
7 void TargetMusic_Advance()
8 {
9         // run AFTER all the thinks!
10         entity best, e;
11         float s0;
12         best = music_default;
13         if(music_target && time < music_target.lifetime)
14                 best = music_target;
15         if(music_trigger)
16                 best = music_trigger;
17         for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise)
18         {
19                 s0 = e.state;
20                 if(getsoundtime(e, CHAN_VOICE) < 0)
21                 {
22                         s0 = -1;
23                 }
24                 if(e == best)
25                 {
26                         // increase volume
27                         if(e.fade_time > 0)
28                                 e.state = min(1, e.state + frametime / e.fade_time);
29                         else
30                                 e.state = 1;
31                 }
32                 else
33                 {
34                         // decrease volume
35                         if(e.fade_rate > 0)
36                                 e.state = max(0, e.state - frametime / e.fade_rate);
37                         else
38                                 e.state = 0;
39                 }
40                 if(e.state != s0)
41                 {
42                         if(s0 < 0)
43                                 sound(e, CHAN_VOICE, e.noise, e.volume * e.state * cvar("bgmvolume"), ATTN_NONE); // restart
44                         else
45                                 sound(e, CHAN_VOICE, "", e.volume * e.state * cvar("bgmvolume"), ATTN_NONE);
46                 }
47         }
48         music_trigger = world;
49 }
50
51 void Net_TargetMusic()
52 {
53         float vol, fai, fao, tim, id;
54         string noi, s;
55         entity e;
56
57         id = ReadShort();
58         vol = ReadByte() / 255.0;
59         fai = ReadByte() / 16.0;
60         fao = ReadByte() / 16.0;
61         tim = ReadByte();
62         noi = ReadString();
63
64         for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); )
65         {
66                 if(e.count == id)
67                         break;
68         }
69         if(!e)
70         {
71                 e = spawn();
72                 e.enttype = ENT_CLIENT_TRIGGER_MUSIC;
73         }
74         s = e.noise;
75         if(e.noise)
76                 strunzone(e.noise);
77         e.noise = strzone(noi);
78         if(e.noise != s)
79         {
80                 precache_sound(e.noise);
81                 sound(e, CHAN_VOICE, e.noise, 0, ATTN_NONE);
82                 if(getsoundtime(e, CHAN_VOICE) < 0)
83                 {
84                         print("Cannot initialize sound ", e.noise, "\n");
85                         strunzone(e.noise);
86                         e.noise = string_null;
87                 }
88         }
89         e.volume = vol;
90         e.fade_time = fai;
91         e.fade_rate = fao;
92         if(vol > 0)
93         {
94                 if(tim == 0)
95                 {
96                         music_default = e;
97                 }
98                 else
99                 {
100                         music_target = e;
101                         e.lifetime = time + tim;
102                 }
103         }
104 }
105
106 void Ent_TriggerMusic_Think()
107 {
108         if(WarpZoneLib_BoxTouchesBrush(view_origin, view_origin, self, world))
109         {
110                 music_trigger = self;
111         }
112         self.nextthink = time;
113 }
114
115 void Ent_TriggerMusic_Remove()
116 {
117         if(self.noise)
118                 strunzone(self.noise);
119         self.noise = string_null;
120 }
121
122 void Ent_ReadTriggerMusic()
123 {
124         float f;
125         string s;
126         f = ReadByte();
127         if(f & 4)
128         {
129                 self.origin_x = ReadCoord();
130                 self.origin_y = ReadCoord();
131                 self.origin_z = ReadCoord();
132         }
133         if(f & 1)
134         {
135                 self.modelindex = ReadShort();
136                 if(self.modelindex)
137                 {
138                         self.mins_x = ReadCoord();
139                         self.mins_y = ReadCoord();
140                         self.mins_z = ReadCoord();
141                         self.maxs_x = ReadCoord();
142                         self.maxs_y = ReadCoord();
143                         self.maxs_z = ReadCoord();
144                 }
145                 else
146                 {
147                         self.mins    = '0 0 0';
148                         self.maxs_x = ReadCoord();
149                         self.maxs_y = ReadCoord();
150                         self.maxs_z = ReadCoord();
151                 }
152
153                 self.volume = ReadByte() / 255.0;
154                 self.fade_time = ReadByte() / 16.0;
155                 self.fade_rate = ReadByte() / 16.0;
156                 s = self.noise;
157                 if(self.noise)
158                         strunzone(self.noise);
159                 self.noise = strzone(ReadString());
160                 if(self.noise != s)
161                 {
162                         precache_sound(self.noise);
163                         sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
164                         if(getsoundtime(self, CHAN_VOICE) < 0)
165                         {
166                                 print("Cannot initialize sound ", self.noise, "\n");
167                                 strunzone(self.noise);
168                                 self.noise = string_null;
169                         }
170                 }
171         }
172
173         setorigin(self, self.origin);
174         setsize(self, self.mins, self.maxs);
175         self.cnt = 1;
176         self.think = Ent_TriggerMusic_Think;
177         self.nextthink = time;
178 }