Add music player particles

This commit is contained in:
Wuzzy 2022-08-16 12:07:31 +02:00
parent 1907498899
commit bdd5b68ac3
3 changed files with 76 additions and 5 deletions

View File

@ -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
@ -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]
if minetest.settings:get_bool("music_enable") then
local meta = minetest.get_meta(pos)
if minetest.settings:get_bool("music_enable") then
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B