-- 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