Add lava environment sounds

This commit is contained in:
sfan5 2020-05-16 00:38:07 +02:00
parent b3d91a487d
commit 3e9d263f9e
4 changed files with 58 additions and 30 deletions

View file

@ -11,3 +11,7 @@ Authors of media (sounds)
Yuval (CC0 1.0) Yuval (CC0 1.0)
https://freesound.org/people/Yuval/sounds/197023/ https://freesound.org/people/Yuval/sounds/197023/
env_sounds_water.*.ogg env_sounds_water.*.ogg
Halion (CC0 1.0)
https://freesound.org/people/Halion/sounds/17785/
env_sounds_lava.*.ogg

View file

@ -1,11 +1,30 @@
-- Parameters -- Parameters
local radius = 8 -- Water node search radius around player -- Node search radius around player
local radius = 8
-- End of parameters local allsounds = {
["env_sounds_water"] = {
trigger = {"default:water_flowing", "default:river_water_flowing"},
base_volume = 0.04,
max_volume = 0.4,
per_node = 0.004,
},
["env_sounds_lava"] = {
trigger = {"default:lava_source", "default:lava_flowing"},
base_volume = 0,
max_volume = 0.6,
per_node = {
["default:lava_source"] = 0.008,
["default:lava_flowing"] = 0.002,
},
},
}
if minetest.settings:get_bool("river_source_sounds") then
local river_source_sounds = minetest.settings:get_bool("river_source_sounds") table.insert(allsounds["env_sounds_water"].trigger,
"default:river_water_source")
end
-- Update sound for player -- Update sound for player
@ -13,39 +32,44 @@ local river_source_sounds = minetest.settings:get_bool("river_source_sounds")
local function update_sound(player) local function update_sound(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local ppos = player:get_pos() local ppos = player:get_pos()
ppos = vector.add(ppos, player:get_properties().eye_height)
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 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 for sound, def in pairs(allsounds) do
local wposav = vector.new() local pos, counts = minetest.find_nodes_in_area(areamin, areamax,
for _, pos in ipairs(wpos) do def.trigger)
wposav.x = wposav.x + pos.x if #pos > 0 then
wposav.y = wposav.y + pos.y -- Find average position
wposav.z = wposav.z + pos.z local posav = vector.new()
end for _, p in ipairs(pos) do
wposav = vector.divide(wposav, waters) posav.x = posav.x + p.x
posav.y = posav.y + p.y
posav.z = posav.z + p.z
end
posav = vector.divide(posav, #pos)
minetest.sound_play( -- Calculate gain
"env_sounds_water", local gain = def.base_volume
{ if type(def.per_node) == 'table' then
pos = wposav, for nodename, n in pairs(counts) do
to_player = player_name, gain = gain + n * def.per_node[nodename]
gain = math.min(0.04 + waters * 0.004, 0.4), end
} else
) gain = gain + #pos * def.per_node
end
gain = math.min(gain, def.max_volume)
minetest.sound_play(sound, {
pos = posav,
to_player = player_name,
gain = gain,
}, true)
end
end
end end
-- Update sound 'on joinplayer' -- Update sound when player joins
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
update_sound(player) update_sound(player)

Binary file not shown.

Binary file not shown.