Imported from trollstream "ContentDB"

master
OldCoder 2022-09-04 22:03:23 -07:00
commit bcfea8adfa
29 changed files with 357 additions and 0 deletions

1
depends.txt Normal file
View File

@ -0,0 +1 @@
vote?

214
init.lua Normal file
View File

@ -0,0 +1,214 @@
mpd={}
mpd.pause_between_songs=minetest.settings:get("mpd.pause_between_songs") or 30
--end config
mpd.modpath=minetest.get_modpath("nk9mpd")
if not mpd.modpath then
error("mpd mod folder has to be named 'nk9mpd'!")
end
--{name, length, gain~1}
mpd.songs = {}
local sfile, sfileerr=io.open(mpd.modpath..DIR_DELIM.."songs.txt")
if not sfile then error("Error opening songs.txt: "..sfileerr) end
for linent in sfile:lines() do
-- trim leading and trailing spaces away
local line = string.match(linent, "^%s*(.-)%s*$")
if line~="" and string.sub(line,1,1)~="#" then
local name, timeMinsStr, timeSecsStr, gainStr, title = string.match(line, "^(%S+)%s+(%d+):([%d%.]+)%s+([%d%.]+)%s*(.*)$")
local timeMins, timeSecs, gain = tonumber(timeMinsStr), tonumber(timeSecsStr), tonumber(gainStr)
if title=="" then title = name end
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, title=title}
else
minetest.log("warning", "[mpd] Misformatted song entry in songs.txt: "..line)
end
end
end
sfile:close()
if #mpd.songs==0 then
print("[mpd]no songs registered, not doing anything")
return
end
mpd.storage = minetest.get_mod_storage()
mpd.handles={}
mpd.playing=false
mpd.id_playing=nil
mpd.song_time_left=nil
mpd.time_next=10 --sekunden
mpd.id_last_played=nil
minetest.register_globalstep(function(dtime)
if mpd.playing then
if mpd.song_time_left<=0 then
mpd.stop_song()
mpd.time_next=mpd.pause_between_songs
else
mpd.song_time_left=mpd.song_time_left-dtime
end
elseif mpd.time_next then
if mpd.time_next<=0 then
mpd.next_song()
else
mpd.time_next=mpd.time_next-dtime
end
end
end)
mpd.play_song=function(id)
if mpd.playing then
mpd.stop_song()
end
local song=mpd.songs[id]
if not song then return end
for _,player in ipairs(minetest.get_connected_players()) do
local pname=player:get_player_name()
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname))
if not pvolume then pvolume=1 end
if pvolume>0 then
local handle = minetest.sound_play(song.name, {to_player=pname, gain=song.gain*pvolume})
if handle then
mpd.handles[pname]=handle
end
end
end
mpd.playing=id
--adding 2 seconds as security
mpd.song_time_left = song.length + 2
end
mpd.stop_song=function()
for pname, handle in pairs(mpd.handles) do
minetest.sound_stop(handle)
end
mpd.id_last_played=mpd.playing
mpd.playing=nil
mpd.handles={}
mpd.time_next=nil
end
mpd.next_song=function()
local next
repeat
next=math.random(1,#mpd.songs)
until #mpd.songs==1 or next~=mpd.id_last_played
mpd.play_song(next)
end
mpd.song_human_readable=function(id)
if not tonumber(id) then return "<error>" end
local song=mpd.songs[id]
if not song then return "<error>" end
return id..": "..song.title.." ["..song.lengthhr.."]"
end
minetest.register_privilege("mpd", "may control the music player daemon (mpd) mod")
minetest.register_chatcommand("mpd_stop", {
params = "",
description = "Stop the song currently playing",
privs = {mpd=true},
func = function(name, param)
mpd.stop_song()
end,
})
minetest.register_chatcommand("mpd_list", {
params = "",
description = "List all available songs and their IDs",
privs = {mpd=true},
func = function(name, param)
for k,v in ipairs(mpd.songs) do
minetest.chat_send_player(name, mpd.song_human_readable(k))
end
end,
})
minetest.register_chatcommand("mpd_play", {
params = "<id>",
description = "Play the songs with the given ID (see ids with /mpd_list)",
privs = {mpd=true},
func = function(name, param)
if param=="" then
mpd.next_song()
return true,"Playing: "..mpd.song_human_readable(mpd.playing)
end
id=tonumber(param)
if id and id>0 and id<=#mpd.songs then
mpd.play_song(id)
return true,"Playing: "..mpd.song_human_readable(id)
end
return false, "Invalid song ID!"
end,
})
minetest.register_chatcommand("mpd_what", {
params = "",
description = "Display the currently played song.",
privs = {mpd=true},
func = function(name, param)
if not mpd.playing then
if mpd.time_next and mpd.time_next~=0 then
return true,"Nothing playing, "..math.floor(mpd.time_next or 0).." sec. left until next song."
else
return true,"Nothing playing."
end
end
return true,"Playing: "..mpd.song_human_readable(mpd.playing).."\nTime Left: "..math.floor(mpd.song_time_left or 0).." sec."
end,
})
minetest.register_chatcommand("mpd_next", {
params = "[seconds]",
description = "Start the next song, either immediately (no parameters) or after n seconds.",
privs = {mpd=true},
func = function(name, param)
mpd.stop_song()
if param and tonumber(param) then
mpd.time_next=tonumber(param)
return true,"Next song in "..param.." seconds!"
else
mpd.next_song()
return true,"Next song started!"
end
end,
})
minetest.register_chatcommand("mvolume", {
params = "[volume level (0-1)]",
description = "Set your background music volume. Use /mvolume 0 to turn off background music for you. Without parameters, show your current setting.",
privs = {},
func = function(pname, param)
if not param or param=="" then
local pvolume=tonumber(mpd.storage:get_string("vol_"..pname))
if not pvolume then pvolume=1 end
if pvolume>0 then
return true, "Your music volume is set to "..pvolume.."."
else
if mpd.handles[pname] then
minetest.sound_stop(mpd.handles[pname])
end
return true, "Background music is disabled for you. Use '/mvolume 1' to enable it again."
end
end
local pvolume=tonumber(param)
if not pvolume then
return false, "Invalid usage: /mvolume [volume level (0-1)]"
end
pvolume = math.min(pvolume, 1)
pvolume = math.max(pvolume, 0)
mpd.storage:set_string("vol_"..pname, pvolume)
if pvolume>0 then
return true, "Music volume set to "..pvolume..". Change will take effect when the next song starts."
else
if mpd.handles[pname] then
minetest.sound_stop(mpd.handles[pname])
end
return true, "Disabled background music for you. Use /mvolume to enable it again."
end
end,
})
if vote then
dofile(mpd.modpath..DIR_DELIM.."vote.lua")
end

4
mod.conf Normal file
View File

@ -0,0 +1,4 @@
name = nk9mpd
author = orwell, Nemokitty9
description = A background music mod containing music from audiotool as well as other songs not made by Nemokitty9. Does not work if you have the mod mpd enabled alongside this mod. Thanks to orwell for the base of this mod.
title = Minetest Music Pack by Nemokitty9.

44
readme.txt Normal file
View File

@ -0,0 +1,44 @@
### mpd Mod for Minetest
(c) 2017 orwell96
This mod is licensed under the LGPL 2.1 license.
Adds an easy but powerful background music backend.
## Usage:
For all players:
/mvolume <volume>
Set your individual music volume or disable background music (/mvolume 0). Saved across server restarts.
/mpd_list: list available music
With mpd privilege:
/mpd_play <id>: play a song
/mpd_stop: stop the current song. Unless /mpd_play or /mpd_next are invoked, no more music is played
/mpd_next [time]: Play the next song after [time] seconds, immediately if omitted.
## Votes:
This mod integrates with the [vote] mod by rubenwardy (https://github.com/minetest-mods/vote)
/vote_mpd_next - vote to start next song
/vote_mpd_play <id> - Vote to play certain sing
## Music credits:
StrangelyBeautifulShort 3:01 0.7
AvalonShort 2:58 1.4
EtherealShort 3:04 0.7
FarawayShort 3:05 0.7
-> Music from [ambience] mod
-> Author is Amethystium <http://amethystium.com/>.
eastern_feeling 3:51 1.0
-> created by Jordach. It can be found in the BFD subgame. License is GPLv3 (license of BFD).
bensound_deepblue 4:48 1.0
bensound_ofeliasdream 4:59 1.0
bensound_slowmotion 3:26 1.0
-> (c) bensound (AFAIK public domain)
rainymemory 2:10 1.0
anonnp4014 2:30 1.6
-> (c) Deemo collection (game music collection)

3
settingtypes.txt Normal file
View File

@ -0,0 +1,3 @@
# How many seconds MPD waits before starting the next song
mpd_pause_between_songs (Pause between songs) int 30 0 3600

23
songs.txt Normal file
View File

@ -0,0 +1,23 @@
#File Name Time Gain Title
calm2 3:54 0.7 Calm2
calm4 8:10 0.7 Calm4
calm5 2:40 0.7 Calm5
calm3 4:16 0.7 Steam Town v2 and extended
calm6 3:36 0.7 Live Comp November 22 2020
fun0 3:55 0.7 fun0
calm1 2:45 0.7 calm1
calm7 3:28 0.7 stupiddumbstupiddraft by Snowfire
calm8 3:05 0.7 Sega Saturn by Vizil
calm9 2:56 0.7 foggy by aeiter
calm10 2:56 0.7 habit by aeiter
calm11 4:14 0.7 Falling by Kitty Jamz
calm12 1:12 0.7 insertrandomdraftname by Snowfire
calm13 0:56 0.7 First try at Hip-Hop by Vizil
calm14 1:43 0.7 anotherlittlequickdraftthing by Snowfire
calm15 0:55 0.7 littlequickdraftthing by Snowfire
calm16 5:52 0.7 I dont have a name for this yet by Kitty Jamz
calm17 3:16 0.7 I can't fix myself I only break down by Vizil
calm18 2:50 0.7 organic machines oblique challenge 4 by nico / sim
calm19 4:58 0.5 i'm so so sorry by dreamweaver
calm20 1:03 0.7 arrival by aeiter
calm21 1:28 0.7 stressed out by aeiter

BIN
sounds/calm1.ogg Normal file

Binary file not shown.

BIN
sounds/calm10.ogg Normal file

Binary file not shown.

BIN
sounds/calm11.ogg Normal file

Binary file not shown.

BIN
sounds/calm12.ogg Normal file

Binary file not shown.

BIN
sounds/calm13.ogg Normal file

Binary file not shown.

BIN
sounds/calm14.ogg Normal file

Binary file not shown.

BIN
sounds/calm15.ogg Normal file

Binary file not shown.

BIN
sounds/calm16.ogg Normal file

Binary file not shown.

BIN
sounds/calm17.ogg Normal file

Binary file not shown.

BIN
sounds/calm18.ogg Normal file

Binary file not shown.

BIN
sounds/calm19.ogg Normal file

Binary file not shown.

BIN
sounds/calm2.ogg Normal file

Binary file not shown.

BIN
sounds/calm20.ogg Normal file

Binary file not shown.

BIN
sounds/calm21.ogg Normal file

Binary file not shown.

BIN
sounds/calm3.ogg Normal file

Binary file not shown.

BIN
sounds/calm4.ogg Normal file

Binary file not shown.

BIN
sounds/calm5.ogg Normal file

Binary file not shown.

BIN
sounds/calm6.ogg Normal file

Binary file not shown.

BIN
sounds/calm7.ogg Normal file

Binary file not shown.

BIN
sounds/calm8.ogg Normal file

Binary file not shown.

BIN
sounds/calm9.ogg Normal file

Binary file not shown.

BIN
sounds/fun0.ogg Normal file

Binary file not shown.

68
vote.lua Normal file
View File

@ -0,0 +1,68 @@
--mpd
--vote.lua - vote module to change songs
function mpd.vote_play(name, param)
id=tonumber(param)
if id and id>0 and id<=#mpd.songs then
vote.new_vote(name, {
description = "Play "..mpd.song_human_readable(id),
help = "/yes or /no",
duration = 20,
perc_needed = 0.4,
on_result = function(self, result, results)
if result == "yes" then
minetest.chat_send_all("Vote to play " .. mpd.song_human_readable(id) .. " passed " ..
#results.yes .. " to " .. #results.no)
mpd.play_song(id)
else
minetest.chat_send_all("Vote to play " .. mpd.song_human_readable(id) .. " failed " ..
#results.yes .. " to " .. #results.no)
end
end,
on_vote = function(self, name, value)
minetest.chat_send_all(name .. " voted " .. value .. " to '" ..
self.description .. "'")
end,
})
return true
end
return false,"Invalid song ID! See available song IDs using /mpd_list"
end
minetest.register_chatcommand("vote_mpd_play", {
func = mpd.vote_play
})
function mpd.vote_next(name, param)
vote.new_vote(name, {
description = "Play next song",
help = "/yes or /no",
duration = 20,
perc_needed = 0.4,
on_result = function(self, result, results)
minetest.chat_send_all(result..dump(results))
if result == "yes" then
minetest.chat_send_all("Vote to play next song passed " ..
#results.yes .. " to " .. #results.no)
mpd.next_song()
else
minetest.chat_send_all("Vote to play next song failed " ..
#results.yes .. " to " .. #results.no)
end
end,
on_vote = function(self, name, value)
minetest.chat_send_all(name .. " voted " .. value .. " to '" ..
self.description .. "'")
end
})
return true
end
minetest.register_chatcommand("vote_mpd_next", {
func = mpd.vote_next
})