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