diff --git a/README.md b/README.md index d12ae5b..689ca01 100644 --- a/README.md +++ b/README.md @@ -19,5 +19,6 @@ Based on Immersive Sounds .36 mod by Neuromancer and optimized to run on servers - 1.4 - Re-ordered water sets to come before fire and lava, day/night sounds play when leaves around and above ground - 1.5 - Added 'flame_sound' and fire redo check, code tidy and tweak, added ephemeral flag for background sounds. - 1.6 - Finding env_sounds disables water and lava sets, added 'ambience_water_move' flag to override water walking sounds, use eye level for head node. +- 1.7 - Music will play every 20-30 minutes if found, use '/mvol 0' to stop playing music or disable in-game. Code license: MIT diff --git a/init.lua b/init.lua index 00f3a7f..1f91783 100644 --- a/init.lua +++ b/init.lua @@ -2,7 +2,7 @@ ambience = {} -- settings -local SOUNDVOLUME = 1.0 +local SOUNDVOLUME = 0.5 local MUSICVOLUME = 1.0 local play_music = minetest.settings:get_bool("ambience_music") ~= false local pplus = minetest.get_modpath("playerplus") @@ -91,7 +91,7 @@ end -- setup table when player joins minetest.register_on_joinplayer(function(player) - playing[player:get_player_name()] = {} + playing[player:get_player_name()] = {music = -1} end) -- remove table when player leaves @@ -103,24 +103,28 @@ end) -- plays music and selects sound set local get_ambience = function(player, tod, name) - -- play server or local music if available - if play_music then + -- play server or local music if music enabled and music not already playing + if play_music and MUSICVOLUME > 0 and playing[name].music < 0 then - -- play at midnight - if tod >= 0.0 and tod <= 0.01 then + -- count backwards + playing[name].music = playing[name].music -1 - if not playing[name].music then + -- play music every 20 minutes + if playing[name].music < -(60 * 20) then - playing[name].music = minetest.sound_play("ambience_music", { - to_player = name, - gain = MUSICVOLUME - }) - end + playing[name].music = minetest.sound_play("ambience_music", { + to_player = name, + gain = MUSICVOLUME + }) - elseif tod > 0.1 and playing[name].music then - - playing[name].music = nil + -- reset music timer after 10 minutes + minetest.after(60 * 10, function(name) + playing[name].music = -1 + end, name) end + +--print("-- music count", playing[name].music) + end -- get foot and head level nodes at player position @@ -198,7 +202,7 @@ minetest.register_globalstep(function(dtime) --print(string.format("elapsed time: %.4f\n", os.clock() - t1)) - ok = playing[player_name] -- everything starts off ok if player around + ok = playing[player_name] -- everything starts off ok if player found -- are we playing something already? if ok and playing[player_name].handler then @@ -295,19 +299,23 @@ minetest.register_chatcommand("svol", { -- music volume command (0 stops music) minetest.register_chatcommand("mvol", { params = "", - description = "set music volume (0.1 to 1.0)", + description = "set music volume (0.1 to 1.0, 0 to stop music)", privs = {server = true}, func = function(name, param) MUSICVOLUME = tonumber(param) or MUSICVOLUME - -- ability to stop music just as it begins - if MUSICVOLUME == 0 and playing[name].music then + -- ability to stop music by setting volume to 0 + if MUSICVOLUME == 0 and playing[name].music + and playing[name].music >= 0 then + minetest.sound_stop(playing[name].music) + + playing[name].music = -1 end - if MUSICVOLUME < 0.1 then MUSICVOLUME = 0.1 end + if MUSICVOLUME < 0 then MUSICVOLUME = 0 end if MUSICVOLUME > 1.0 then MUSICVOLUME = 1.0 end return true, "Music volume set to " .. MUSICVOLUME