Camas/mods/music/init.lua

221 lines
4.9 KiB
Lua
Raw Normal View History

2015-09-01 17:15:24 +02:00
--
-- Music player mod
-- By Kaadmy, for Pixture
--
2019-08-28 17:31:41 +02:00
local S = minetest.get_translator("music")
2015-09-01 17:15:24 +02:00
music = {}
music.tracks = {
{ name = "music_catsong", length = 30.0 },
{ name = "music_greyarms", length = 82.0 },
}
music.volume = tonumber(minetest.settings:get("music_volume")) or 1.0
-- Array of music players
music.players = {}
2015-09-01 17:15:24 +02:00
if minetest.settings:get_bool("music_enable") then
2015-09-01 17:15:24 +02:00
function music.stop(pos)
local dp = minetest.hash_node_position(pos)
2015-09-01 17:15:24 +02:00
local meta = minetest.get_meta(pos)
2019-08-28 17:31:41 +02:00
meta:set_string("infotext", S("Music Player (off)"))
2015-09-01 17:15:24 +02:00
meta:set_int("music_player_enabled", 0)
if music.players[dp] ~= nil then
minetest.sound_stop(music.players[dp]["handle"])
2015-09-01 17:15:24 +02:00
music.players[dp] = nil
end
end
2015-09-01 17:15:24 +02:00
function music.start(pos)
local dp = minetest.hash_node_position(pos)
2015-09-01 17:15:24 +02:00
local meta = minetest.get_meta(pos)
2019-08-28 17:31:41 +02:00
meta:set_string("infotext", S("Music Player (on)"))
2015-09-01 17:15:24 +02:00
meta:set_int("music_player_enabled", 1)
-- Get track or set random track if not set
local track = meta:get_int("music_player_track")
if track == nil or not music.tracks[track] then
track = math.random(1, #music.tracks)
meta:set_int("music_player_track", track)
end
2015-09-01 17:15:24 +02:00
if music.players[dp] == nil then
music.players[dp] = {
["handle"] = minetest.sound_play(
music.tracks[track].name,
2015-09-01 17:15:24 +02:00
{
pos = pos,
2017-05-11 23:21:03 +02:00
gain = music.volume,
}),
2015-09-01 17:15:24 +02:00
["timer"] = 0,
["pos"] = pos,
}
else
music.players[dp]["timer"] = 0
minetest.sound_stop(music.players[dp]["handle"])
music.players[dp]["handle"] = minetest.sound_play(
music.tracks[track].name,
2015-09-01 17:15:24 +02:00
{
pos = pos,
2017-05-11 23:21:03 +02:00
gain = music.volume,
})
2015-09-01 17:15:24 +02:00
end
end
function music.update(pos)
local dp = minetest.hash_node_position(pos)
2015-09-01 17:15:24 +02:00
if music.players[dp] ~= nil then
local node = minetest.get_node(pos)
2015-09-01 17:15:24 +02:00
if node.name ~= "music:player" then
music.stop(pos)
return
end
local meta = minetest.get_meta(pos)
local track = meta:get_int("music_player_track")
if music.tracks[track] then
if music.players[dp]["timer"] > music.tracks[track].length then
music.start(pos)
end
end
2015-09-01 17:15:24 +02:00
end
end
function music.toggle(pos)
local dp = minetest.hash_node_position(pos)
2015-09-01 17:15:24 +02:00
if music.players[dp] == nil then
music.start(pos)
else
music.stop(pos)
end
end
minetest.register_node(
2015-09-01 17:15:24 +02:00
"music:player",
{
2019-08-28 17:31:41 +02:00
description = S("Music Player"),
2015-09-01 17:15:24 +02:00
tiles = {"music_top.png", "music_bottom.png", "music_side.png"},
inventory_image = "music_inventory.png",
wield_image = "music_inventory.png",
is_ground_content = false,
floodable = true,
2015-09-01 17:15:24 +02:00
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-4/16, -0.5, -4/16, 4/16, -0.5 + (4/16), 4/16}
},
2019-08-29 14:58:02 +02:00
sounds = default.node_sound_defaults(),
2015-09-01 17:15:24 +02:00
on_construct = function(pos)
music.start(pos)
end,
2015-09-01 17:15:24 +02:00
after_destruct = function(pos)
music.stop(pos)
end,
2015-09-01 17:15:24 +02:00
on_rightclick = function(pos)
music.toggle(pos)
end,
2015-09-01 17:15:24 +02:00
2019-09-04 14:58:05 +02:00
groups = {oddly_breakable_by_hand = 3, attached_node = 1}
})
2015-09-01 17:15:24 +02:00
2019-08-29 14:42:50 +02:00
local function step(dtime)
2015-09-01 17:15:24 +02:00
for dp, _ in pairs(music.players) do
music.players[dp]["timer"] = music.players[dp]["timer"] + dtime
2015-09-01 17:15:24 +02:00
music.update(music.players[dp]["pos"])
end
end
minetest.register_globalstep(step)
2015-09-01 17:15:24 +02:00
minetest.register_abm(
2015-09-01 17:15:24 +02:00
{
label = "Music Player",
2015-09-01 17:15:24 +02:00
nodenames = {"music:player"},
chance = 1,
interval = 1,
action = function(pos, node)
if music.players[minetest.hash_node_position(pos)] == nil then
local meta = minetest.get_meta(pos)
if meta:get_int("music_player_enabled") == 1 then
music.start(pos)
end
end
end
})
2015-09-01 17:15:24 +02:00
else
minetest.register_node(
2015-09-01 17:15:24 +02:00
"music:player",
{
2019-08-28 17:31:41 +02:00
description = S("Music Player"),
2015-09-01 17:15:24 +02:00
tiles = {"music_top.png", "music_bottom.png", "music_side.png"},
inventory_image = "music_inventory.png",
wield_image = "music_inventory.png",
is_ground_content = false,
floodable = true,
2015-09-01 17:15:24 +02:00
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-4/16, -0.5, -4/16, 4/16, -0.5 + (4/16), 4/16}
},
2019-08-29 14:58:02 +02:00
sounds = default.node_sound_defaults(),
2015-09-01 17:15:24 +02:00
on_construct = function(pos)
local meta = minetest.get_meta(pos)
2015-09-01 17:15:24 +02:00
2019-08-28 17:31:41 +02:00
meta:set_string("infotext", S("Music Player (disabled by server)"))
end,
2015-09-01 17:15:24 +02:00
2019-09-04 14:58:05 +02:00
groups = {oddly_breakable_by_hand = 3, attached_node = 1}
})
2015-09-01 17:15:24 +02:00
end
crafting.register_craft(
2015-09-01 17:15:24 +02:00
{
output = "music:player",
items = {
"group:planks 5",
"default:ingot_steel",
2015-09-01 17:15:24 +02:00
}
})
-- Achievements
achievements.register_achievement(
"musician",
{
2019-09-06 00:31:13 +02:00
title = S("Sound Engineer"),
2019-08-28 17:31:41 +02:00
description = S("Craft a music player."),
times = 1,
craftitem = "music:player",
})
default.log("mod:music", "loaded")