248 lines
11 KiB
Lua
248 lines
11 KiB
Lua
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(("<font color='#00ff00'>Now playing: " .. track.name) .. "</font>", 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
|