diff --git a/mods/rp_music/init.lua b/mods/rp_music/init.lua index 728e303..a836ae6 100644 --- a/mods/rp_music/init.lua +++ b/mods/rp_music/init.lua @@ -7,17 +7,56 @@ local S = minetest.get_translator("rp_music") local INFOTEXT_ON = S("Music Player (on)") local INFOTEXT_OFF = S("Music Player (off)") local INFOTEXT_DISABLED = S("Music Player (disabled by server)") +local NOTES_PER_SECOND = 1 local music = {} +local particlespawners = {} music.tracks = { - { name = "music_catsong", length = 30.0 }, - { name = "music_greyarms", length = 82.0 }, + { name = "music_catsong", length = 30.0, note_color = "#26b7dc", }, + { name = "music_greyarms", length = 82.0, note_color = "#d8cb2b", }, } music.volume = tonumber(minetest.settings:get("music_volume")) or 1.0 music.volume = math.max(0.0, math.min(1.0, music.volume)) + +local function note_particle(pos, texture, permanent) + local amount, time + if permanent then + amount = NOTES_PER_SECOND + time = 0 + else + amount = 1 + time = 0.01 + end + return minetest.add_particlespawner({ + amount = amount, + time = time, + pos = vector.add(pos, vector.new(0,-0.25,0)), + vel = vector.new(0, 1, 0), + exptime = 0.5, + size = 2, + drag = vector.new(2,2,2), + texture = { + name = texture, + alpha_tween = { 1, 0, start = 0.6 }, + }, + }) +end + +local function get_note(pos) + local meta = minetest.get_meta(pos) + local track = meta:get_int("music_player_track") + local note = "rp_music_note.png" + local note_color + if music.tracks[track] then + note_color = music.tracks[track].note_color + note = note .. "^[multiply:"..note_color + end + return note +end + -- Array of music players music.players = {} @@ -34,6 +73,12 @@ if minetest.settings:get_bool("music_enable") then minetest.sound_stop(music.players[dp]["handle"]) music.players[dp] = nil end + + local id = particlespawners[dp] + if id then + minetest.delete_particlespawner(id) + particlespawners[dp] = nil + end end function music.start(pos) @@ -71,6 +116,18 @@ if minetest.settings:get_bool("music_enable") then gain = music.volume, }) end + + -- Spawn a single note immediately + local note = get_note(pos) + note_particle(pos, note) + + -- Spawn a permanent particlespawner + if particlespawners[dp] then + -- Replace old particlespawener, if present + minetest.delete_particlespawner(particlespawners[dp]) + end + local particle = note_particle(pos, note, true) + particlespawners[dp] = particle end function music.update(pos) @@ -101,8 +158,10 @@ if minetest.settings:get_bool("music_enable") then if music.players[dp] == nil then music.start(pos) + return true else music.stop(pos) + return false end end @@ -146,7 +205,7 @@ if minetest.settings:get_bool("music_enable") then return end music.toggle(pos) - end, + end, groups = {oddly_breakable_by_hand = 3, attached_node = 1, creative_decoblock = 1} }) @@ -207,6 +266,14 @@ else meta:set_string("infotext", INFOTEXT_DISABLED) end, + on_rightclick = function(pos, node, clicker) + if minetest.is_protected(pos, clicker:get_player_name()) and + not minetest.check_player_privs(clicker, "protection_bypass") then + minetest.record_protection_violation(pos, clicker:get_player_name()) + return + end + note_particle(pos, "rp_music_no_music.png") + end, groups = {oddly_breakable_by_hand = 3, attached_node = 1, interactive_node = 1} }) @@ -221,18 +288,22 @@ crafting.register_craft( } }) --- Update nodes after the rename orgy after 1.5.3 +-- Update music player infotexts minetest.register_lbm( { label = "Update music players", name = "rp_music:update_music_players", + run_at_every_load = true, nodenames = {"rp_music:player"}, action = function(pos, node) local def = minetest.registered_nodes[node.name] + local meta = minetest.get_meta(pos) if minetest.settings:get_bool("music_enable") then - local meta = minetest.get_meta(pos) if meta:get_int("music_player_enabled") == 1 then meta:set_string("infotext", INFOTEXT_ON) + local particle = note_particle(pos, get_note(pos), true) + local hash = minetest.hash_node_position(pos) + particlespawners[hash] = particle else meta:set_string("infotext", INFOTEXT_OFF) end diff --git a/mods/rp_music/textures/rp_music_no_music.png b/mods/rp_music/textures/rp_music_no_music.png new file mode 100644 index 0000000..f7e63e1 Binary files /dev/null and b/mods/rp_music/textures/rp_music_no_music.png differ diff --git a/mods/rp_music/textures/rp_music_note.png b/mods/rp_music/textures/rp_music_note.png new file mode 100644 index 0000000..f3b421f Binary files /dev/null and b/mods/rp_music/textures/rp_music_note.png differ