Advertisement
Guest User

Untitled

a guest
Dec 20th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.72 KB | None | 0 0
  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))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement