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