]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/target_music.qc
properly loop the track (needs the getsoundtime function!)
[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(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         }
83         e.volume = vol;
84         e.fade_time = fai;
85         e.fade_rate = fao;
86         if(vol > 0)
87         {
88                 if(tim == 0)
89                 {
90                         music_default = e;
91                 }
92                 else
93                 {
94                         music_target = e;
95                         e.lifetime = time + tim;
96                 }
97         }
98 }
99
100 void Ent_TriggerMusic_Think()
101 {
102         if(WarpZoneLib_BoxTouchesBrush(view_origin, view_origin, self, world))
103         {
104                 music_trigger = self;
105         }
106         self.nextthink = time;
107 }
108
109 void Ent_TriggerMusic_Remove()
110 {
111         if(self.noise)
112                 strunzone(self.noise);
113         self.noise = string_null;
114 }
115
116 void Ent_ReadTriggerMusic()
117 {
118         float f;
119         string s;
120         f = ReadByte();
121         if(f & 4)
122         {
123                 self.origin_x = ReadCoord();
124                 self.origin_y = ReadCoord();
125                 self.origin_z = ReadCoord();
126         }
127         if(f & 1)
128         {
129                 self.modelindex = ReadShort();
130                 if(self.modelindex)
131                 {
132                         self.mins_x = ReadCoord();
133                         self.mins_y = ReadCoord();
134                         self.mins_z = ReadCoord();
135                         self.maxs_x = ReadCoord();
136                         self.maxs_y = ReadCoord();
137                         self.maxs_z = ReadCoord();
138                 }
139                 else
140                 {
141                         self.mins    = '0 0 0';
142                         self.maxs_x = ReadCoord();
143                         self.maxs_y = ReadCoord();
144                         self.maxs_z = ReadCoord();
145                 }
146
147                 self.volume = ReadByte() / 255.0;
148                 self.fade_time = ReadByte() / 16.0;
149                 self.fade_rate = ReadByte() / 16.0;
150                 s = self.noise;
151                 if(self.noise)
152                         strunzone(self.noise);
153                 self.noise = strzone(ReadString());
154                 if(self.noise != s)
155                 {
156                         precache_sound(self.noise);
157                         sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
158                 }
159         }
160
161         setorigin(self, self.origin);
162         setsize(self, self.mins, self.maxs);
163         self.cnt = 1;
164         self.think = Ent_TriggerMusic_Think;
165         self.nextthink = time;
166 }