]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/target_music.qc
Merge commit 'origin/master' into divVerent/tag_seeker
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / target_music.qc
index 97faf67900d73b77b54cc69b99949c656cbdb133..4ef9a37aeb47f80e518c899a14af583e2550dfc3 100644 (file)
@@ -1,3 +1,4 @@
+float music_disabled;
 entity music_default;
 entity music_target;
 entity music_trigger;
@@ -14,14 +15,18 @@ void TargetMusic_Advance()
                best = music_target;
        if(music_trigger)
                best = music_trigger;
-       for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); )
+       for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise)
        {
                s0 = e.state;
+               if(getsoundtime(e, CHAN_VOICE) < 0)
+               {
+                       s0 = -1;
+               }
                if(e == best)
                {
                        // increase volume
                        if(e.fade_time > 0)
-                               e.state = min(1, e.state + frametime / e.fade_time);
+                               e.state = bound(0, e.state + frametime / e.fade_time, 1);
                        else
                                e.state = 1;
                }
@@ -29,13 +34,16 @@ void TargetMusic_Advance()
                {
                        // decrease volume
                        if(e.fade_rate > 0)
-                               e.state = max(0, e.state - frametime / e.fade_rate);
+                               e.state = bound(0, e.state - frametime / e.fade_rate, 1);
                        else
                                e.state = 0;
                }
                if(e.state != s0)
                {
-                       sound(e, CHAN_VOICE, "", e.volume * e.state * cvar("bgmvolume"), ATTN_NONE);
+                       if(s0 < 0)
+                               sound(e, CHAN_VOICE, e.noise, e.volume * e.state * cvar("bgmvolume"), ATTN_NONE); // restart
+                       else
+                               sound(e, CHAN_VOICE, "", e.volume * e.state * cvar("bgmvolume"), ATTN_NONE);
                }
        }
        music_trigger = world;
@@ -72,6 +80,12 @@ void Net_TargetMusic()
        {
                precache_sound(e.noise);
                sound(e, CHAN_VOICE, e.noise, 0, ATTN_NONE);
+               if(getsoundtime(e, CHAN_VOICE) < 0)
+               {
+                       print("Cannot initialize sound ", e.noise, "\n");
+                       strunzone(e.noise);
+                       e.noise = string_null;
+               }
        }
        e.volume = vol;
        e.fade_time = fai;
@@ -81,6 +95,12 @@ void Net_TargetMusic()
                if(tim == 0)
                {
                        music_default = e;
+                       if(!music_disabled)
+                       {
+                               e.state = 2;
+                               localcmd("cd stop\n"); // just in case
+                               music_disabled = 1;
+                       }
                }
                else
                {
@@ -148,6 +168,12 @@ void Ent_ReadTriggerMusic()
                {
                        precache_sound(self.noise);
                        sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
+                       if(getsoundtime(self, CHAN_VOICE) < 0)
+                       {
+                               print("Cannot initialize sound ", self.noise, "\n");
+                               strunzone(self.noise);
+                               self.noise = string_null;
+                       }
                }
        }