initial commit
This commit is contained in:
@@ -0,0 +1,247 @@
|
||||
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
|
||||
Reference in New Issue
Block a user