local players = {} local music_volume = 1 local SOUNDVOLUME = 1 -- compatibility with soundset mod local get_volume if (minetest.get_modpath("soundset")) ~= nil then get_volume = soundset.get_gain else get_volume = function (player_name, sound_type) return SOUNDVOLUME end -- set volume command minetest.register_chatcommand("svol", { params = "", description = "set sound volume (0.1 to 1.0)", privs = {server=true}, func = function(name, param) if tonumber(param) then SOUNDVOLUME = tonumber(param) minetest.chat_send_player(name, "Sound volume set.") else minetest.chat_send_player(name, "Sound volume no set, bad param.") end end, }) end local musics = { --{name="StrangelyBeautifulShort", length=3*60+.5, gain=music_volume*.7}, --{name="Loneliness", length=3*60+51, gain=music_volume*.9}, --{name="AvalonShort", length=2*60+58, gain=music_volume*1.4}, --{name="Aube", length=2*60+24, gain=music_volume*1.8}, --{name="Interlude", length=3*60+30.5, gain=music_volume*1.8}, --{name="mtest", length=4*60+33, gain=music_volume}, --{name="echos", length=2*60+26, gain=music_volume}, --{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, {name="Ambivalent", length=2*60+31, gain=music_volume*.9}, --{name="eastern_feeling", length=3*60+51, gain=music_volume}, --{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, {name="EtherealShort", length=3*60+4, gain=music_volume*.7}, --{name="Mute", length=3*60+43, gain=music_volume*.9}, --{name="FarawayShort", length=3*60+5, gain=music_volume*.7}, {name="dark_ambiance", length=44, gain=music_volume} } -- stops all sounds that are not in still_playing local stop_sound = function(player_name) if players[player_name] ~= nil then minetest.sound_stop(players[player_name]) players[player_name] = nil end end -- start playing the sound, set the handler and delete the handler after sound is played local play_sound = function(player_name, music, gain) if players[player_name] == nil then local handler = minetest.sound_play(music.name, {to_player=player_name, gain=music.gain*gain}) if handler ~= nil then players[player_name] = handler minetest.after(music.length, stop_sound, player_name) end end end local function tick() for _, player in ipairs(minetest.get_connected_players()) do local player_name = player:get_player_name() local gain = get_volume(player_name, "music") if gain > 0 and players[player_name] == nil then local music = musics[math.random(#musics)] play_sound(player_name, music, gain) end end minetest.after(math.random(15,30)*60, tick) end minetest.register_on_leaveplayer(function(player) local player_name = player:get_player_name() stop_sound(player_name) end) minetest.after(60, tick)