Rename mod: mpd → tutorial_music

master
Wuzzy 2022-08-02 15:36:13 +02:00
parent 288ec1a5da
commit cb1cee225c
10 changed files with 88 additions and 86 deletions

View File

@ -1 +0,0 @@
name = mpd

View File

@ -28,7 +28,7 @@ function default.get_hotbar_bg(x,y)
end end
local music = "" local music = ""
if minetest.get_modpath("mpd") then if minetest.get_modpath("tutorial_music") then
music = "button[-0.1,0.7;3,1;togglemusic;"..minetest.formspec_escape(S("Toggle music")).."]" music = "button[-0.1,0.7;3,1;togglemusic;"..minetest.formspec_escape(S("Toggle music")).."]"
end end

View File

@ -1,2 +1,2 @@
name = tutorial_default name = tutorial_default
optional_depends = intllib optional_depends = intllib, tutorial_music

View File

@ -1,46 +1,46 @@
mpd={} tutorial_music={}
--config --config
mpd.pause_between_songs=7 tutorial_music.pause_between_songs=7
--end config --end config
mpd.modpath=minetest.get_modpath("mpd") tutorial_music.modpath=minetest.get_modpath("tutorial_music")
if not mpd.modpath then if not tutorial_music.modpath then
error("mpd mod folder has to be named 'mpd'!") error("mod folder has to be named 'tutorial_music'!")
end end
--{name, length, gain~1} --{name, length, gain~1}
mpd.songs = {} tutorial_music.songs = {}
local sfile, sfileerr=io.open(mpd.modpath.."/songs.txt") local sfile, sfileerr=io.open(tutorial_music.modpath.."/songs.txt")
if not sfile then error("Error opening songs.txt: "..sfileerr) end if not sfile then error("Error opening songs.txt: "..sfileerr) end
for line in sfile:lines() do for line in sfile:lines() do
if line~="" and line[1]~="#" then if line~="" and line[1]~="#" then
local name, timeMinsStr, timeSecsStr, gainStr = string.match(line, "^(%S+)%s+(%d+):([%d%.]+)%s+([%d%.]+)$") local name, timeMinsStr, timeSecsStr, gainStr = string.match(line, "^(%S+)%s+(%d+):([%d%.]+)%s+([%d%.]+)$")
local timeMins, timeSecs, gain = tonumber(timeMinsStr), tonumber(timeSecsStr), tonumber(gainStr) local timeMins, timeSecs, gain = tonumber(timeMinsStr), tonumber(timeSecsStr), tonumber(gainStr)
if name and timeMins and timeSecs and gain then if name and timeMins and timeSecs and gain then
mpd.songs[#mpd.songs+1]={name=name, length=timeMins*60+timeSecs, lengthhr=timeMinsStr..":"..timeSecsStr, gain=gain} tutorial_music.songs[#tutorial_music.songs+1]={name=name, length=timeMins*60+timeSecs, lengthhr=timeMinsStr..":"..timeSecsStr, gain=gain}
else else
minetest.log("warning", "[mpd] Misformatted song entry in songs.txt: "..line) minetest.log("warning", "[tutorial_music] Misformatted song entry in songs.txt: "..line)
end end
end end
end end
sfile:close() sfile:close()
if #mpd.songs==0 then if #tutorial_music.songs==0 then
print("[mpd]no songs registered, not doing anything") minetest.log("error", "[tutorial_music] no songs registered, not doing anything")
return return
end end
mpd.storage = minetest.get_mod_storage() tutorial_music.storage = minetest.get_mod_storage()
mpd.handles={} tutorial_music.handles={}
mpd.playing=false tutorial_music.playing=false
mpd.id_playing=nil tutorial_music.id_playing=nil
mpd.song_time_left=nil tutorial_music.song_time_left=nil
mpd.time_next=10 --sekunden tutorial_music.time_next=10 --sekunden
mpd.id_last_played=nil tutorial_music.id_last_played=nil
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local meta = player:get_meta() local meta = player:get_meta()
@ -52,131 +52,131 @@ minetest.register_on_joinplayer(function(player)
play = false play = false
end end
if play then if play then
mpd.next_song() tutorial_music.next_song()
else else
mpd.stop_song() tutorial_music.stop_song()
end end
end) end)
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
if mpd.playing then if tutorial_music.playing then
if mpd.song_time_left<=0 then if tutorial_music.song_time_left<=0 then
mpd.stop_song() tutorial_music.stop_song()
mpd.time_next=mpd.pause_between_songs tutorial_music.time_next=tutorial_music.pause_between_songs
else else
mpd.song_time_left=mpd.song_time_left-dtime tutorial_music.song_time_left=tutorial_music.song_time_left-dtime
end end
elseif mpd.time_next then elseif tutorial_music.time_next then
if mpd.time_next<=0 then if tutorial_music.time_next<=0 then
mpd.next_song() tutorial_music.next_song()
else else
mpd.time_next=mpd.time_next-dtime tutorial_music.time_next=tutorial_music.time_next-dtime
end end
end end
end) end)
mpd.play_song=function(id) tutorial_music.play_song=function(id)
if mpd.playing then if tutorial_music.playing then
mpd.stop_song() tutorial_music.stop_song()
end end
local song=mpd.songs[id] local song=tutorial_music.songs[id]
if not song then return end if not song then return end
for _,player in ipairs(minetest.get_connected_players()) do for _,player in ipairs(minetest.get_connected_players()) do
local pname=player:get_player_name() local pname=player:get_player_name()
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname)) local pvolume=tonumber(tutorial_music.storage:get_string("vol_"..pname))
if not pvolume then pvolume=1 end if not pvolume then pvolume=1 end
if pvolume>0 then if pvolume>0 then
local handle = minetest.sound_play(song.name, {to_player=pname, gain=song.gain*pvolume}) local handle = minetest.sound_play(song.name, {to_player=pname, gain=song.gain*pvolume})
if handle then if handle then
mpd.handles[pname]=handle tutorial_music.handles[pname]=handle
end end
end end
end end
mpd.playing=id tutorial_music.playing=id
--adding 2 seconds as security --adding 2 seconds as security
mpd.song_time_left = song.length + 2 tutorial_music.song_time_left = song.length + 2
end end
mpd.stop_song=function() tutorial_music.stop_song=function()
for pname, handle in pairs(mpd.handles) do for pname, handle in pairs(tutorial_music.handles) do
minetest.sound_stop(handle) minetest.sound_stop(handle)
end end
mpd.id_last_played=mpd.playing tutorial_music.id_last_played=tutorial_music.playing
mpd.playing=nil tutorial_music.playing=nil
mpd.handles={} tutorial_music.handles={}
mpd.time_next=nil tutorial_music.time_next=nil
end end
mpd.next_song=function() tutorial_music.next_song=function()
local next local next
repeat repeat
next=math.random(1,#mpd.songs) next=math.random(1,#tutorial_music.songs)
until #mpd.songs==1 or next~=mpd.id_last_played until #tutorial_music.songs==1 or next~=tutorial_music.id_last_played
mpd.play_song(next) tutorial_music.play_song(next)
end end
mpd.song_human_readable=function(id) tutorial_music.song_human_readable=function(id)
local song=mpd.songs[id] local song=tutorial_music.songs[id]
return id..": "..song.name.." ["..song.lengthhr.."]" return id..": "..song.name.." ["..song.lengthhr.."]"
end end
minetest.register_privilege("mpd", "may control the music player daemon (mpd) mod") minetest.register_privilege("mpd", "May control the music")
minetest.register_chatcommand("mpd_stop", { minetest.register_chatcommand("music_stop", {
params = "", params = "",
description = "Stop the song currently playing", description = "Stop the song currently playing",
privs = {mpd=true}, privs = {mpd=true},
func = function(name, param) func = function(name, param)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
player:get_meta():set_string("play_music", "0") player:get_meta():set_string("play_music", "0")
mpd.stop_song() tutorial_music.stop_song()
end, end,
}) })
minetest.register_chatcommand("mpd_list", { minetest.register_chatcommand("music_list", {
params = "", params = "",
description = "List all available songs and their IDs", description = "List all available songs and their IDs",
privs = {mpd=true}, privs = {mpd=true},
func = function(name, param) func = function(name, param)
for k,v in ipairs(mpd.songs) do for k,v in ipairs(tutorial_music.songs) do
minetest.chat_send_player(name, mpd.song_human_readable(k)) minetest.chat_send_player(name, tutorial_music.song_human_readable(k))
end end
end, end,
}) })
minetest.register_chatcommand("mpd_play", { minetest.register_chatcommand("music_play", {
params = "<id>", params = "<id>",
description = "Play the songs with the given ID (see ids with /mpd_list)", description = "Play the songs with the given ID (see IDs with /music_list)",
privs = {mpd=true}, privs = {mpd=true},
func = function(name, param) func = function(name, param)
id=tonumber(param) id=tonumber(param)
if id and id>0 and id<=#mpd.songs then if id and id>0 and id<=#tutorial_music.songs then
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
player:get_meta():set_string("play_music", "1") player:get_meta():set_string("play_music", "1")
mpd.play_song(id) tutorial_music.play_song(id)
return true,"Playing: "..mpd.song_human_readable(id) return true,"Playing: "..tutorial_music.song_human_readable(id)
end end
return false, "Invalid song ID!" return false, "Invalid song ID!"
end, end,
}) })
minetest.register_chatcommand("mpd_what", { minetest.register_chatcommand("music_what", {
params = "", params = "",
description = "Display the currently played song.", description = "Display the currently played song.",
privs = {mpd=true}, privs = {mpd=true},
func = function(name, param) func = function(name, param)
if not mpd.playing then return true,"Nothing playing, "..math.floor(mpd.time_next or 0).." sec. left until next song." end if not tutorial_music.playing then return true,"Nothing playing, "..math.floor(tutorial_music.time_next or 0).." sec. left until next song." end
return true,"Playing: "..mpd.song_human_readable(mpd.playing).."\nTime Left: "..math.floor(mpd.song_time_left or 0).." sec." return true,"Playing: "..tutorial_music.song_human_readable(tutorial_music.playing).."\nTime left: "..math.floor(tutorial_music.song_time_left or 0).." sec."
end, end,
}) })
minetest.register_chatcommand("mpd_next", { minetest.register_chatcommand("music_next", {
params = "[seconds]", params = "[seconds]",
description = "Start the next song, either immediately (no parameters) or after n seconds.", description = "Start the next song, either immediately (no parameters) or after n seconds.",
privs = {mpd=true}, privs = {mpd=true},
func = function(name, param) func = function(name, param)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
player:get_meta():set_string("play_music", "1") player:get_meta():set_string("play_music", "1")
mpd.stop_song() tutorial_music.stop_song()
if param and tonumber(param) then if param and tonumber(param) then
mpd.time_next=tonumber(param) tutorial_music.time_next=tonumber(param)
return true,"Next song in "..param.." seconds!" return true,"Next song in "..param.." seconds!"
else else
mpd.next_song() tutorial_music.next_song()
return true,"Next song started!" return true,"Next song started!"
end end
end, end,
@ -187,13 +187,13 @@ minetest.register_chatcommand("mvolume", {
privs = {}, privs = {},
func = function(pname, param) func = function(pname, param)
if not param or param=="" then if not param or param=="" then
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname)) local pvolume=tonumber(tutorial_music.storage:get_string("vol_"..pname))
if not pvolume then pvolume=1 end if not pvolume then pvolume=1 end
if pvolume>0 then if pvolume>0 then
return true, "Your music volume is set to "..pvolume.."." return true, "Your music volume is set to "..pvolume.."."
else else
if mpd.handles[pname] then if tutorial_music.handles[pname] then
minetest.sound_stop(mpd.handles[pname]) minetest.sound_stop(tutorial_music.handles[pname])
end end
return true, "Background music is disabled for you. Use '/mvolume 1' to enable it again." return true, "Background music is disabled for you. Use '/mvolume 1' to enable it again."
end end
@ -204,12 +204,12 @@ minetest.register_chatcommand("mvolume", {
end end
pvolume = math.min(pvolume, 1) pvolume = math.min(pvolume, 1)
pvolume = math.max(pvolume, 0) pvolume = math.max(pvolume, 0)
mpd.storage:set_string("vol_"..pname, pvolume) tutorial_music.storage:set_string("vol_"..pname, pvolume)
if pvolume>0 then if pvolume>0 then
return true, "Music volume set to "..pvolume..". Change will take effect when the next song starts." return true, "Music volume set to "..pvolume..". Change will take effect when the next song starts."
else else
if mpd.handles[pname] then if tutorial_music.handles[pname] then
minetest.sound_stop(mpd.handles[pname]) minetest.sound_stop(tutorial_music.handles[pname])
end end
return true, "Disabled background music for you. Use /mvol to enable it again." return true, "Disabled background music for you. Use /mvol to enable it again."
end end
@ -218,11 +218,11 @@ minetest.register_chatcommand("mvolume", {
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if(fields.togglemusic) then if(fields.togglemusic) then
if mpd.playing then if tutorial_music.playing then
mpd.stop_song() tutorial_music.stop_song()
player:get_meta():set_string("play_music", "0") player:get_meta():set_string("play_music", "0")
else else
mpd.next_song() tutorial_music.next_song()
player:get_meta():set_string("play_music", "1") player:get_meta():set_string("play_music", "1")
end end
end end

View File

@ -0,0 +1 @@
name = tutorial_music

View File

@ -1,7 +1,9 @@
### mpd Mod for Minetest ### Tutorial music mod
(c) 2017 orwell96
Slightly modified for the Tutorial. Based on the MPD mod ((c) 2017 orwell96)
Modified for the Tutorial.
This mod is licensed under the MIT License. This mod is licensed under the MIT License.

View File

@ -103,11 +103,11 @@ minetest.register_node("tutorial_supplemental:loudspeaker", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_construct = set_loudspeaker_infotext, on_construct = set_loudspeaker_infotext,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
if mpd.playing then if tutorial_music.playing then
mpd.stop_song() tutorial_music.stop_song()
clicker:get_meta():set_string("play_music", "0") clicker:get_meta():set_string("play_music", "0")
else else
mpd.next_song() tutorial_music.next_song()
clicker:get_meta():set_string("play_music", "1") clicker:get_meta():set_string("play_music", "1")
end end
end, end,

View File

@ -1,3 +1,3 @@
name = tutorial_supplemental name = tutorial_supplemental
depends = tutorial_default, mpd depends = tutorial_default, tutorial_music
optional_depends = intllib optional_depends = intllib