Files
Dota-Zombie-Invasion/scripts/vscripts/music_player.lua
T
2026-05-29 15:11:31 +07:00

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