local active_tracks = {} local active_huds = {} local recorddata = { { "The Evil Sister (Jordach's Mix)", "SoundHelix", "13" } , { "The Energetic Rat (Jordach's Mix)", "SoundHelix", "wait" }, { "Eastern Feeling", "Jordach", "blocks"}, { "Minetest", "Jordach", "far" }, { "Credit Roll (Jordach's HD Mix)", "Junichi Masuda", "chirp" }, { "Moonsong (Jordach's Mix)", "HeroOfTheWinds", "strad" }, { "Synthgroove (Jordach's Mix)", "HeroOfTheWinds", "mellohi" }, { "The Clueless Frog (Jordach's Mix)", "SoundHelix", "mall" }, } local records = #recorddata for r=1, records do local doc = false local entryname, longdesc, useahelp if r == 1 then doc = true entryname = "Music Disc" longdesc = "A music disc holds a single music track which can be used in a jukebox to play music." usagehelp = "Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players." end minetest.register_craftitem("mcl_jukebox:record_"..r, { description = core.colorize("#55FFFF", "Music Disc") .. "\n" .. core.colorize("#989898", recorddata[r][2] .. "—" .. recorddata[r][1]), _doc_items_create_entry = doc, _doc_items_entry_name = entryname, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, inventory_image = "mcl_jukebox_record_"..recorddata[r][3]..".png", stack_max = 1, groups = { music_record = r }, }) end local function now_playing(player, track_id) local hud = active_huds[player:get_player_name()] local text = "Now playing: " .. recorddata[track_id][2] .. "—" .. recorddata[track_id][1] local id if hud ~= nil then player:hud_change(active_huds[player:get_player_name()], "text", text) else id = player:hud_add({ hud_elem_type = "text", position = { x=0.5, y=0.8 }, offset = { x=0, y = 0 }, size = { x=100, y=100}, number = 0x55FFFF, text = text, }) active_huds[player:get_player_name()] = id end minetest.after(5, function(tab) local player = tab[1] local id = tab[2] if not player or not player:is_player() or not active_huds[player:get_player_name()] then return end if id == active_huds[player:get_player_name()] then player:hud_remove(active_huds[player:get_player_name()]) active_huds[player:get_player_name()] = nil end end, {player, id}) end minetest.register_on_leaveplayer(function(player) active_tracks[player:get_player_name()] = nil active_huds[player:get_player_name()] = nil end) -- Jukebox crafting minetest.register_craft({ output = 'mcl_jukebox:jukebox', recipe = { {'group:wood', 'group:wood', 'group:wood'}, {'group:wood', 'mcl_core:diamond', 'group:wood'}, {'group:wood', 'group:wood', 'group:wood'}, } }) -- Jukebox minetest.register_node("mcl_jukebox:jukebox", { description = "Jukebox", _doc_items_longdesc = "Jukeboxes play music when they're supplied with a music disc.", _doc_items_usagehelp = "Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.", tiles = {"mcl_jukebox_top.png", "mcl_jukebox_side.png", "mcl_jukebox_side.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), groups = {handy=1,axey=1, deco_block=1, material_wood=1}, is_ground_content = false, on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 1) end, on_rightclick= function(pos, node, clicker, itemstack, pointed_thing) if not clicker then return end local cname = clicker:get_player_name() local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if not inv:is_empty("main") then -- Jukebox contains a disc: Stop music and remove disc if active_tracks[cname] ~= nil then minetest.sound_stop(active_tracks[cname]) end local lx = pos.x local ly = pos.y+1 local lz = pos.z local record = inv:get_stack("main", 1) minetest.add_item({x=lx, y=ly, z=lz}, record:get_name()) inv:set_stack("main", 1, "") if active_tracks[cname] ~= nil then minetest.sound_stop(active_tracks[cname]) clicker:hud_remove(active_huds[cname]) active_tracks[cname] = nil active_huds[cname] = nil end else -- Jukebox is empty: Play track if player holds music record local record_id = minetest.get_item_group(itemstack:get_name(), "music_record") if record_id ~= 0 then if active_tracks[cname] ~= nil then minetest.sound_stop(active_tracks[cname]) active_tracks[cname] = nil end active_tracks[cname] = minetest.sound_play("mcl_jukebox_track_"..record_id, { to_player = cname, --max_hear_distance = 16, gain = 1, }) now_playing(clicker, record_id) inv:set_stack("main", 1, itemstack:get_name()) itemstack:take_item() return itemstack end end end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local name = digger:get_player_name() local meta = minetest.get_meta(pos) local meta2 = meta meta:from_table(oldmetadata) local inv = meta:get_inventory() local stack = inv:get_stack("main", 1) if not stack:is_empty() then local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} minetest.add_item(p, stack) if active_tracks[name] ~= nil then minetest.sound_stop(active_tracks[name]) digger:hud_remove(active_huds[name]) active_tracks[name] = nil active_huds[name] = nil end end meta:from_table(meta2:to_table()) end, _mcl_blast_resistance = 30, _mcl_hardness = 2, }) minetest.register_craft({ type = "fuel", recipe = "mcl_jukebox:jukebox", burntime = 15, })