minetest-mm/mods/jukebox/init.lua
2020-10-25 19:05:08 +01:00

156 lines
3.8 KiB
Lua

local S = minetest.get_translator("jukebox")
jukebox = {}
jukebox.registered_discs = {}
function jukebox.register_disc(name, def)
def.stack_max = 1
local music_name = def.music_name
def.music_name = nil
minetest.register_craftitem(":" .. name, def)
jukebox.registered_discs[name] = music_name
end
-- +-----------+
-- | The Box |
-- +-----------+
local handlers = {}
minetest.register_node("jukebox:box", {
description = S("Jukebox"),
paramtype2 = "facedir",
stack_max = 1,
tiles = {
"jukebox_top.png", "default_wood.png", "jukebox_side.png",
"jukebox_side.png", "jukebox_front.png", "jukebox_front.png"
},
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("main", 1)
end,
on_destruct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if inv:is_empty("main") then return end
local drop_pos = minetest.find_node_near(pos, 1, "air")
if not drop_pos then drop_pos = {x = pos.x, y = pos.y + 1, z = pos.z} end
minetest.add_item(drop_pos, inv:get_stack("main", 1))
inv:remove_item("main", inv:get_stack("main", 1))
local pos_string = minetest.pos_to_string(pos)
if handlers[pos_string] then
minetest.sound_stop(handlers[pos_string])
end
end,
on_rightclick = function(pos, node, clicker, itemstack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local pos_string = minetest.pos_to_string(pos)
if inv:is_empty("main") then
local item_name = itemstack:get_name()
local music_name = jukebox.registered_discs[item_name]
if not music_name then return end
inv:set_stack("main", 1, itemstack:take_item())
local handle = minetest.sound_play(music_name, {
pos = pos,
gain = 0.5,
max_hear_distance = 25,
loop = true
})
handlers[pos_string] = handle
meta:set_string("music_name", music_name) -- for LBM
else
local drop_pos = minetest.find_node_near(pos, 1, "air")
if not drop_pos then drop_pos = {x = pos.x, y = pos.y + 1, z = pos.z} end
minetest.add_item(drop_pos, inv:get_stack("main", 1))
inv:remove_item("main", inv:get_stack("main", 1))
if handlers[pos_string] then
minetest.sound_stop(handlers[pos_string])
end
end
end
})
minetest.register_lbm({
name = "jukebox:resume_playing",
nodenames = "jukebox:box",
action = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local pos_string = minetest.pos_to_string(pos)
if inv:is_empty("main") then return end
if handlers[pos_string] then return end
local music_name = meta:get_string("music_name")
local handle = minetest.sound_play(music_name, {
pos = pos,
gain = 0.5,
max_hear_distance = 25,
loop = true
})
handlers[pos_string] = handle
end
})
minetest.register_craft({
output = "jukebox:box",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "default:mese_crystal", "group:wood"},
{"group:wood", "group:wood", "group:wood"}
}
})
-- +---------+
-- | Discs |
-- +---------+
for i = 1, 9 do
local item_name = "jukebox:disc_" .. i
local description = S("Music Disc @1", i)
local inventory_image = "jukebox_disc_" .. i .. ".png"
local music_name = "jukebox_disc_" .. i
jukebox.register_disc(item_name, {
description = description,
inventory_image = inventory_image,
music_name = music_name
})
end
minetest.register_craft({
output = "jukebox:disc_1",
recipe = {
{"", "default:coal_lump", ""},
{"default:coal_lump", "default:gold_lump", "default:coal_lump"},
{"", "default:coal_lump", ""}
}
})