157 lines
3.8 KiB
Lua
157 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", ""}
|
||
|
}
|
||
|
})
|
||
|
|