-- Parameters local radius = 8 -- Water node search radius around player -- End of parameters local handles = {} local river_source_sounds = minetest.settings:get_bool("river_source_sounds") -- Update sound for player local function update_sound(player) local player_name = player:get_player_name() local ppos = player:get_pos() local areamin = vector.subtract(ppos, radius) local areamax = vector.add(ppos, radius) local water_nodes = {"default:water_flowing", "default:river_water_flowing"} if river_source_sounds then table.insert(water_nodes, "default:river_water_source") end local wpos, _ = minetest.find_nodes_in_area(areamin, areamax, water_nodes) local waters = #wpos if waters == 0 then return end -- Find average position of water positions local wposav = vector.new() for _, pos in ipairs(wpos) do wposav = vector.add(wposav, pos) end wposav = vector.divide(wposav, waters) local handle = minetest.sound_play( "env_sounds_water", { pos = wposav, to_player = player_name, gain = math.min(0.04 + waters * 0.004, 0.4), } ) -- Store sound handle for this player if handle then handles[player_name] = handle end end -- Update sound 'on joinplayer' minetest.register_on_joinplayer(function(player) update_sound(player) end) -- Cyclic sound update local function cyclic_update() for _, player in pairs(minetest.get_connected_players()) do update_sound(player) end minetest.after(3.5, cyclic_update) end minetest.after(0, cyclic_update) -- Stop sound and clear handle on player leave minetest.register_on_leaveplayer(function(player) local player_name = player:get_player_name() if handles[player_name] then minetest.sound_stop(handles[player_name]) handles[player_name] = nil end end)