local ____lualib = require("lualib_bundle") local __TS__Class = ____lualib.__TS__Class local Map = ____lualib.Map local __TS__New = ____lualib.__TS__New local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter local __TS__ArrayReduce = ____lualib.__TS__ArrayReduce local __TS__ArrayIndexOf = ____lualib.__TS__ArrayIndexOf local ____exports = {} local ____DayNightCycleManager = require("DayNightCycleManager") local DayNightCycleManager = ____DayNightCycleManager.DayNightCycleManager ____exports.MusicPlayer = __TS__Class() local MusicPlayer = ____exports.MusicPlayer MusicPlayer.name = "MusicPlayer" MusicPlayer.____file_path = "scripts/vscripts/music_player.lua" function MusicPlayer.prototype.____constructor(self) self.musicController = { playlists = {day = {tracks = { {name = "zvezdi_v_luzhax_30_02", duration = 186}, {name = "DSPRITE_Iyul", duration = 138}, {name = "Parnishka_ELLA_-_My_umrem_gde_to_posredi_nochi", duration = 194}, {name = "AHa-TakeOnMe", duration = 226}, {name = "AJR_WorldsSmallestViolin", duration = 71}, {name = "BangersOnlyfawlinPrestonPabloChillOnly-Circles", duration = 96}, {name = "jump", duration = 38}, {name = "DaftPunk-GetLucky", duration = 98}, {name = "EarthWindAndFire-LetsGroove", duration = 92}, {name = "EarthWindAndFire-September", duration = 81}, {name = "GroverWashingtonJrBillWithers-JustTheTwoOfUs", duration = 61}, {name = "HOLLYFLAME-Sorvannye_plany", duration = 151}, {name = "GarikPogorelov-Rozovye_tapochki", duration = 163}, {name = "Redbone-ComeandGetYourLove", duration = 66}, {name = "SergejjTrofimov-GorodSochi", duration = 181} }, currentTrackIndex = 0}, night = {tracks = {{name = "zvezdi_v_luzhax_30_02", duration = 186}}, currentTrackIndex = 0}}, currentSound = nil, soundState = __TS__New(Map), timer = nil } self:Initialize() end function MusicPlayer.getInstance(self) if not ____exports.MusicPlayer.instance then ____exports.MusicPlayer.instance = __TS__New(____exports.MusicPlayer) end return ____exports.MusicPlayer.instance end function MusicPlayer.prototype.Initialize(self) local dayNightManager = DayNightCycleManager:getInstance() self.musicController.playlists.day.currentTrackIndex = RandomInt(0, #self.musicController.playlists.day.tracks - 1) self.musicController.playlists.night.currentTrackIndex = RandomInt(0, #self.musicController.playlists.night.tracks - 1) self:registerEventHandlers() self:startInitialTrack(dayNightManager) end function MusicPlayer.prototype.registerEventHandlers(self) CustomGameEventManager:RegisterListener( "toggle_music", function(userId, event) local playerId = event.PlayerID local ____temp_0 = self.musicController.soundState:get(playerId) if ____temp_0 == nil then ____temp_0 = true end local currentState = ____temp_0 self.musicController.soundState:set(playerId, not currentState) if self.musicController.currentSound then if not currentState then self:EmitSoundToClient(playerId, self.musicController.currentSound, true) else self:EmitSoundToClient(playerId, self.musicController.currentSound, false) end end CustomGameEventManager:Send_ServerToAllClients("update_music_state", {isEnabled = not currentState, playerId = playerId}) end ) CustomGameEventManager:RegisterListener( "day_night_timer_update", function(_, data) local dayNightManager = DayNightCycleManager:getInstance() local expectedDuration = data.isDay == 1 and dayNightManager:GetDayDuration() or dayNightManager:GetNightDuration() if data.timeLeft == 1 then local currentIsNight = data.isDay == 0 self:StopCurrentTrack() Timers:CreateTimer( 0.5, function() self:PlayNextTrack(currentIsNight) return nil end ) end end ) end function MusicPlayer.prototype.getRandomTrackWithDuration(self, playlist, maxDuration, currentTrackName) local availableTracks = __TS__ArrayFilter( playlist.tracks, function(____, track) return track.duration <= maxDuration and (not currentTrackName or track.name ~= currentTrackName) end ) if #availableTracks == 0 then local shortestTrack = __TS__ArrayReduce( playlist.tracks, function(____, shortest, current) return current.duration < shortest.duration and (not currentTrackName or current.name ~= currentTrackName) and current or shortest end ) local index = __TS__ArrayIndexOf(playlist.tracks, shortestTrack) return {track = shortestTrack, index = index} end local randomIndex = RandomInt(0, #availableTracks - 1) local track = availableTracks[randomIndex + 1] local originalIndex = __TS__ArrayIndexOf(playlist.tracks, track) return {track = track, index = originalIndex} end function MusicPlayer.prototype.getTimeLeft(self, dayNightManager, isNight) return dayNightManager:GetTimeLeft() end function MusicPlayer.prototype.updatePlaylistAndTimer(self, playlist, track, isNight) if self.musicController.timer then Timers:RemoveTimer(self.musicController.timer) end self.musicController.timer = Timers:CreateTimer( track.duration, function() local dayNightManager = DayNightCycleManager:getInstance() local currentIsNight = not dayNightManager:IsDaytime() if currentIsNight ~= isNight then local newPlaylist = currentIsNight and self.musicController.playlists.night or self.musicController.playlists.day local timeLeft = self:getTimeLeft(dayNightManager, currentIsNight) local ____temp_1 = self:getRandomTrackWithDuration(newPlaylist, timeLeft) local newTrack = ____temp_1.track local randomIndex = ____temp_1.index newPlaylist.currentTrackIndex = randomIndex self:PlayNextTrackWithTrack(currentIsNight, newTrack, randomIndex) return nil end local timeLeft = self:getTimeLeft(dayNightManager, currentIsNight) local ____temp_2 = self:getRandomTrackWithDuration(playlist, timeLeft, track.name) local nextTrack = ____temp_2.track local nextIndex = ____temp_2.index playlist.currentTrackIndex = nextIndex self:PlayNextTrackWithTrack(currentIsNight, nextTrack, nextIndex) return nil end ) end function MusicPlayer.prototype.startInitialTrack(self, dayNightManager) local isNight = not dayNightManager:IsDaytime() local playlist = isNight and self.musicController.playlists.night or self.musicController.playlists.day local timeLeft = self:getTimeLeft(dayNightManager, isNight) local ____temp_3 = self:getRandomTrackWithDuration(playlist, timeLeft) local track = ____temp_3.track local randomIndex = ____temp_3.index playlist.currentTrackIndex = randomIndex self:playTrack(track) self:updatePlaylistAndTimer(playlist, track, isNight) local ____CustomGameEventManager_Send_ServerToAllClients_5 = CustomGameEventManager.Send_ServerToAllClients local ____temp_4 = self.musicController.soundState:get(0) if ____temp_4 == nil then ____temp_4 = true end ____CustomGameEventManager_Send_ServerToAllClients_5(CustomGameEventManager, "update_music_state", {isEnabled = ____temp_4}) end function MusicPlayer.prototype.StopCurrentTrack(self) if self.musicController.currentSound then self:broadcastSoundToValidPlayers(self.musicController.currentSound, false) end end function MusicPlayer.prototype.ResumeCurrentTrack(self) if self.musicController.currentSound then self:broadcastSoundToValidPlayers(self.musicController.currentSound, true) end end function MusicPlayer.prototype.PlayNextTrackWithTrack(self, isNight, track, trackIndex) self:StopCurrentTrack() Timers:CreateTimer( 0.5, function() self:playTrack(track) local playlist = isNight and self.musicController.playlists.night or self.musicController.playlists.day self:updatePlaylistAndTimer(playlist, track, isNight) return nil end ) end function MusicPlayer.prototype.PlayNextTrack(self, isNight) local playlist = isNight and self.musicController.playlists.night or self.musicController.playlists.day local track = playlist.tracks[playlist.currentTrackIndex + 1] self:PlayNextTrackWithTrack(isNight, track, playlist.currentTrackIndex) end function MusicPlayer.prototype.playTrack(self, track) self.musicController.currentSound = track.name GameRules:SendCustomMessage(("Now playing: " .. track.name) .. "", 0, 0) self:broadcastSoundToValidPlayers(track.name, true) end function MusicPlayer.prototype.broadcastSoundToValidPlayers(self, soundName, play) do local playerID = 0 while playerID < DOTA_MAX_TEAM_PLAYERS do if PlayerResource:IsValidPlayer(playerID) then local ____temp_6 = self.musicController.soundState:get(playerID) if ____temp_6 == nil then ____temp_6 = true end local playerState = ____temp_6 if playerState then self:EmitSoundToClient(playerID, soundName, play) end end playerID = playerID + 1 end end end function MusicPlayer.prototype.EmitSoundToClient(self, playerId, soundName, play) local player = PlayerResource:GetPlayer(playerId) if player then if play then EmitSoundOnClient(soundName, player) else StopSoundOn(soundName, player) end end end function MusicPlayer.prototype.ToggleSound(self) self.musicController.soundState:forEach(function(____, state, playerId) self.musicController.soundState:set(playerId, not state) if self.musicController.currentSound then if not state then self:EmitSoundToClient(playerId, self.musicController.currentSound, true) else self:EmitSoundToClient(playerId, self.musicController.currentSound, false) end end CustomGameEventManager:Send_ServerToAllClients("update_music_state", {isEnabled = not state, playerId = playerId}) end) local ____CustomGameEventManager_Send_ServerToAllClients_8 = CustomGameEventManager.Send_ServerToAllClients local ____temp_7 = self.musicController.soundState:get(0) if ____temp_7 == nil then ____temp_7 = true end ____CustomGameEventManager_Send_ServerToAllClients_8(CustomGameEventManager, "update_music_state", {isEnabled = ____temp_7}) end function MusicPlayer.prototype.IsSoundEnabled(self) local ____temp_9 = self.musicController.soundState:get(0) if ____temp_9 == nil then ____temp_9 = true end return ____temp_9 end ____exports.InitializeMusicPlayer = function() return ____exports.MusicPlayer:getInstance() end return ____exports