mirror of
https://github.com/D00Med/scifi_nodes.git
synced 2025-02-05 20:30:21 +01:00
d531ad4eda
* add ambience sounds and helper function * minor tweaks * fix deps --------- Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
74 lines
1.9 KiB
Lua
74 lines
1.9 KiB
Lua
|
|
-- currently playing sounds per mapblock
|
|
-- mapblock_pos[number]
|
|
local currently_playing = {}
|
|
|
|
-- clear the currently playing tracker every few seconds
|
|
local function clear_currently_playing()
|
|
currently_playing = {}
|
|
minetest.after(5, clear_currently_playing)
|
|
end
|
|
minetest.after(5, clear_currently_playing)
|
|
|
|
-- mapblock resolution
|
|
local function get_key(pos)
|
|
return minetest.pos_to_string(vector.round(vector.divide(pos, 16)))
|
|
end
|
|
|
|
local function add_currently_playing(pos, value)
|
|
local key = get_key(pos)
|
|
local count = currently_playing[key]
|
|
if not count then
|
|
-- new entry
|
|
count = value
|
|
else
|
|
-- update entry
|
|
count = count + value
|
|
end
|
|
currently_playing[key] = count
|
|
end
|
|
|
|
-- limit plaing sounds per mapblock
|
|
local function can_play(pos)
|
|
local count = currently_playing[get_key(pos)]
|
|
return not count or count < 25
|
|
end
|
|
|
|
-- register ambience sounds with node-timer
|
|
function scifi_nodes.register_ambience(nodename, soundname, opts)
|
|
assert(opts)
|
|
opts.interval = opts.interval or 60
|
|
|
|
local function play(pos)
|
|
minetest.sound_play(soundname ,{
|
|
max_hear_distance = opts.max_hear_distance or 16,
|
|
pos = pos,
|
|
gain = opts.gain or 0.7
|
|
})
|
|
end
|
|
|
|
minetest.override_item(nodename, {
|
|
on_timer = function(pos)
|
|
local timer = minetest.get_node_timer(pos)
|
|
|
|
if not can_play(pos) then
|
|
-- too many sounds playing, recheck again soon
|
|
timer:start(1)
|
|
return
|
|
end
|
|
|
|
-- increment usage count
|
|
add_currently_playing(pos, 1)
|
|
play(pos)
|
|
|
|
-- restart timer
|
|
timer:start(opts.interval)
|
|
end,
|
|
on_construct = function(pos)
|
|
play(pos)
|
|
local timer = minetest.get_node_timer(pos)
|
|
timer:start(opts.interval)
|
|
end
|
|
})
|
|
end
|