SHARE
TWEET

Untitled

a guest Dec 20th, 2013 32 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local load_time_start = os.clock()
  2. music = {}
  3. music.loops = {}
  4. function music.reset()
  5.         music.t1 = os.clock()
  6.         music.tab = {}
  7.         music.num = 1
  8. end
  9. music.reset()
  10.  
  11. minetest.register_node("music:play", {
  12.         description = "Play",
  13.         tiles = {"default_steel_block.png^default_papyrus.png","default_steel_block.png^default_papyrus.png",
  14.                 "default_wood.png^[transformR270^default_diamond.png^[transformR90"},
  15.         groups = {bendy=2,cracky=1},
  16.         sounds = default_stone_sounds,
  17.         on_construct = function(pos)
  18.                 minetest.get_meta(pos):set_string("infotext", "Play")
  19.         end,
  20.         on_punch = function(pos, _, puncher)
  21.                 music.status = nil
  22.                 for _,i in ipairs(music.tab) do
  23.                         minetest.after(i[2], function(pos)
  24.                                 if not music.status then
  25.                                         minetest.sound_play(i[1], {pos = pos, gain = 1, max_hear_distance = 10})
  26.                                         minetest.chat_send_player(puncher:get_player_name(), i[2]..' '..i[1])
  27.                                 end
  28.                         end, pos)
  29.                 end
  30.         end,
  31. })
  32.  
  33. minetest.register_node("music:record", {
  34.         description = "Record",
  35.         tiles = {"default_tnt_bottom.png^default_rail_crossing.png","default_tnt_bottom.png^default_rail_crossing.png",
  36.                 "default_wood.png^heart.png^[transformR180^heart.png^[transformR180"},
  37.         groups = {bendy=2,cracky=1},
  38.         sounds = default_stone_sounds,
  39.         on_construct = function(pos)
  40.                 minetest.get_meta(pos):set_string("infotext", "Record")
  41.         end,
  42.         on_punch = function(pos, _, puncher)
  43.                 music.status = "recording"
  44.                 music.t1 = os.clock()
  45.                 music.tab = {}
  46.                 music.num = 1
  47.                 minetest.chat_send_player(puncher:get_player_name(), 'num, tab and t1 reset')
  48.         end,
  49. })
  50.  
  51. minetest.register_node("music:box", {
  52.         description = "Sound Box",
  53.         tiles = {"default_steel_block.png^default_obsidian_glass.png","default_steel_block.png^default_obsidian_glass.png",
  54.                 "default_wood.png^default_grass_5.png"},
  55.         groups = {bendy=2,cracky=1},
  56.         sounds = default_stone_sounds,
  57.         on_construct = function(pos)
  58.                 local meta = minetest.get_meta(pos)
  59.                 meta:set_string("formspec", "field[text;;${text}]")
  60.                 meta:set_string("infotext", "\"\"")
  61.         end,
  62.         on_receive_fields = function(pos, formname, fields, sender)
  63.                 local meta = minetest.get_meta(pos)
  64.                 fields.text = fields.text or ""
  65.                 minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text..
  66.                                 "\" to soundbox at "..minetest.pos_to_string(pos))
  67.                 meta:set_string("text", fields.text)
  68.                 meta:set_string("infotext", '"'..fields.text..'"')
  69.         end,
  70.         on_punch = function(pos, _, puncher)
  71.                 local meta = minetest.get_meta(pos)
  72.                 local soundname = meta:get_string("text")
  73.                 if music.status == "recording" then
  74.                         local delay = tonumber(os.clock() - music.t1)
  75.                         music.tab[music.num] = {soundname, delay}
  76.                         music.num = music.num+1
  77.                         minetest.chat_send_player(puncher:get_player_name(), delay..' '..soundname)
  78.                 end
  79.                 minetest.sound_play(soundname, {pos = pos, gain = 1, max_hear_distance = 10})
  80.         end,
  81. })
  82.  
  83. minetest.register_node("music:box2", {
  84.         description = "Music Box",
  85.         tiles = {"default_steel_block.png^default_rail_crossing.png","default_steel_block.png^default_rail_crossing.png",
  86.                 "default_wood.png^default_leaves.png^default_grass_2.png"},
  87.         groups = {bendy=2,cracky=1},
  88.         sounds = default_stone_sounds,
  89.         on_construct = function(pos)
  90.                 local meta = minetest.get_meta(pos)
  91.                 meta:set_string("formspec", "field[text;;${text}]")
  92.                 meta:set_string("infotext", "\"\"")
  93.         end,
  94.         on_receive_fields = function(pos, formname, fields, sender)
  95.                 local meta = minetest.get_meta(pos)
  96.                 fields.text = fields.text or ""
  97.                 minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text..
  98.                                 "\" to musicbox at "..minetest.pos_to_string(pos))
  99.                 meta:set_string("text", fields.text)
  100.                 meta:set_string("infotext", '"'..fields.text..'"')
  101.         end,
  102.         on_punch = function(pos, _, puncher)
  103.                 local meta = minetest.get_meta(pos)
  104.                 local soundname = meta:get_string("text")
  105.                 local soundnum = tonumber(meta:get_string("hwnd"))
  106.                 if soundnum then
  107.                         minetest.sound_stop(soundnum)
  108.                         meta:set_string("hwnd", nil)
  109.                         music.loops[soundnum] = nil
  110.                         if puncher:get_player_control().sneak then
  111.                                 return
  112.                         end
  113.                 end
  114.                 local soundnum = minetest.sound_play(soundname, {pos = pos, gain = 1, max_hear_distance = 10, loop=true})
  115.                 music.loops[soundnum] = true
  116.                 meta:set_string("hwnd", soundnum)
  117.         end,
  118.         after_dig_node = function(pos)
  119.                 local soundnum = tonumber(minetest.get_meta(pos):get_string("hwnd"))
  120.                 if soundnum then
  121.                         minetest.sound_stop(soundnum)
  122.                         music.loops[soundnum] = nil
  123.                 end
  124.         end
  125. })
  126.  
  127. minetest.register_chatcommand('stoploops',{
  128.         description = 'stops looped sounds',
  129.         params = "",
  130.         privs = {},
  131.         func = function()
  132.                 for i,_ in pairs(music.loops) do
  133.                         minetest.sound_stop(i)
  134.                         music.loops[i] = nil
  135.                 end
  136.         end
  137. })
  138.  
  139. print(string.format("[music] loaded after ca. %.2fs", os.clock() - load_time_start))
RAW Paste Data
Top