1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- -- Parameters
- local radius = 8 -- Water node search radius around player
- -- End of parameters
- 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.x = wposav.x + pos.x
- wposav.y = wposav.y + pos.y
- wposav.z = wposav.z + pos.z
- end
- wposav = vector.divide(wposav, waters)
- minetest.sound_play(
- "env_sounds_water",
- {
- pos = wposav,
- to_player = player_name,
- gain = math.min(0.04 + waters * 0.004, 0.4),
- }
- )
- 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)
|