This commit is contained in:
sfan5 2020-05-18 00:34:36 +02:00
parent 3e9d263f9e
commit cbbd47982a

View file

@ -27,6 +27,17 @@ if minetest.settings:get_bool("river_source_sounds") then
end end
-- Cache the union of all trigger nodes
local cache_triggers = {}
for sound, def in pairs(allsounds) do
for _, name in ipairs(def.trigger) do
table.insert(cache_triggers, name)
end
end
-- Update sound for player -- Update sound for player
local function update_sound(player) local function update_sound(player)
@ -36,29 +47,42 @@ local function update_sound(player)
local areamin = vector.subtract(ppos, radius) local areamin = vector.subtract(ppos, radius)
local areamax = vector.add(ppos, radius) local areamax = vector.add(ppos, radius)
local pos = minetest.find_nodes_in_area(areamin, areamax, cache_triggers, true)
if next(pos) == nil then -- If table empty
return
end
for sound, def in pairs(allsounds) do for sound, def in pairs(allsounds) do
local pos, counts = minetest.find_nodes_in_area(areamin, areamax, -- Find average position
def.trigger) local posav = {0, 0, 0}
if #pos > 0 then local count = 0
-- Find average position for _, name in ipairs(def.trigger) do
local posav = vector.new() if pos[name] then
for _, p in ipairs(pos) do for _, p in ipairs(pos[name]) do
posav.x = posav.x + p.x posav[1] = posav[1] + p.x
posav.y = posav.y + p.y posav[2] = posav[2] + p.y
posav.z = posav.z + p.z posav[3] = posav[3] + p.z
end
count = count + #pos[name]
end end
posav = vector.divide(posav, #pos) end
if count > 0 then
posav = vector.new(posav[1] / count, posav[2] / count,
posav[3] / count)
-- Calculate gain -- Calculate gain
local gain = def.base_volume local gain = def.base_volume
if type(def.per_node) == 'table' then if type(def.per_node) == 'table' then
for nodename, n in pairs(counts) do for name, multiplier in pairs(def.per_node) do
gain = gain + n * def.per_node[nodename] if pos[name] then
gain = gain + #pos[name] * multiplier
end
end end
else else
gain = gain + #pos * def.per_node gain = gain + count * def.per_node
end end
gain = math.min(gain, def.max_volume) gain = math.min(gain, def.max_volume)
minetest.sound_play(sound, { minetest.sound_play(sound, {
pos = posav, pos = posav,
to_player = player_name, to_player = player_name,