2019-03-08 02:07:41 +02:00
local S = minetest.get_translator ( " mesecons_noteblock " )
2015-06-29 20:55:56 +03:00
minetest.register_node ( " mesecons_noteblock:noteblock " , {
2019-03-08 02:07:41 +02:00
description = S ( " Note Block " ) ,
_doc_items_longdesc = S ( " A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power. " ) ,
_doc_items_usagehelp = S ( " Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block: " ) .. " \n \n " ..
2017-03-11 07:26:47 +02:00
2019-03-08 02:07:41 +02:00
S ( " • Glass: Sticks " ) .. " \n " ..
S ( " • Wood: Bass guitar " ) .. " \n " ..
S ( " • Stone: Bass drum " ) .. " \n " ..
S ( " • Sand or gravel: Snare drum " ) .. " \n " ..
S ( " • Anything else: Piano " ) .. " \n \n " ..
2017-03-11 16:33:55 +02:00
2019-03-08 02:07:41 +02:00
S ( " The note block will only play a note when it is below air, otherwise, it stays silent. " ) ,
2015-06-29 20:55:56 +03:00
tiles = { " mesecons_noteblock.png " } ,
2017-03-11 06:34:58 +02:00
groups = { handy = 1 , axey = 1 , material_wood = 1 } ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2017-03-11 07:15:58 +02:00
place_param2 = 0 ,
2019-02-08 22:59:01 +02:00
on_rightclick = function ( pos , node , clicker ) -- change sound when rightclicked
local protname = clicker : get_player_name ( )
if minetest.is_protected ( pos , protname ) then
minetest.record_protection_violation ( pos , protname )
return
end
2017-03-11 07:14:26 +02:00
node.param2 = ( node.param2 + 1 ) % 24
mesecon.noteblock_play ( pos , node.param2 )
minetest.set_node ( pos , node )
2015-06-29 20:55:56 +03:00
end ,
2017-03-11 07:17:35 +02:00
on_punch = function ( pos , node ) -- play current sound when punched
mesecon.noteblock_play ( pos , node.param2 )
end ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_wood_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { effector = { -- play sound when activated
action_on = function ( pos , node )
mesecon.noteblock_play ( pos , node.param2 )
2018-01-12 02:37:32 +02:00
end ,
rules = mesecon.rules . alldirs ,
2017-02-22 17:22:28 +02:00
} } ,
_mcl_blast_resistance = 4 ,
2017-02-27 02:52:24 +02:00
_mcl_hardness = 0.8 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_craft ( {
output = ' "mesecons_noteblock:noteblock" 1 ' ,
recipe = {
{ " group:wood " , " group:wood " , " group:wood " } ,
2017-01-09 19:45:34 +02:00
{ " group:wood " , " mesecons:redstone " , " group:wood " } ,
2015-06-29 20:55:56 +03:00
{ " group:wood " , " group:wood " , " group:wood " } ,
}
} )
2017-01-10 07:43:07 +02:00
minetest.register_craft ( {
type = " fuel " ,
recipe = " mesecons_noteblock:noteblock " ,
burntime = 15
} )
2017-03-11 07:14:26 +02:00
local soundnames_piano = {
[ 0 ] = " mesecons_noteblock_c " ,
" mesecons_noteblock_csharp " ,
" mesecons_noteblock_d " ,
" mesecons_noteblock_dsharp " ,
" mesecons_noteblock_e " ,
" mesecons_noteblock_f " ,
" mesecons_noteblock_fsharp " ,
" mesecons_noteblock_g " ,
" mesecons_noteblock_gsharp " ,
" mesecons_noteblock_a " ,
" mesecons_noteblock_asharp " ,
" mesecons_noteblock_b " ,
" mesecons_noteblock_c2 " ,
" mesecons_noteblock_csharp2 " ,
" mesecons_noteblock_d2 " ,
" mesecons_noteblock_dsharp2 " ,
" mesecons_noteblock_e2 " ,
" mesecons_noteblock_f2 " ,
" mesecons_noteblock_fsharp2 " ,
" mesecons_noteblock_g2 " ,
" mesecons_noteblock_gsharp2 " ,
" mesecons_noteblock_a2 " ,
" mesecons_noteblock_asharp2 " ,
" mesecons_noteblock_b2 " ,
}
2015-06-29 20:55:56 +03:00
mesecon.noteblock_play = function ( pos , param2 )
2017-03-11 16:33:55 +02:00
local block_above_name = minetest.get_node ( { x = pos.x , y = pos.y + 1 , z = pos.z } ) . name
if block_above_name ~= " air " then
-- Don't play sound if no air is above
return
end
2017-03-11 07:14:26 +02:00
-- Default: One of 24 piano notes
2017-03-11 16:33:55 +02:00
local soundname = soundnames_piano [ param2 ]
2017-03-11 07:14:26 +02:00
2017-01-11 19:21:46 +02:00
local block_below_name = minetest.get_node ( { x = pos.x , y = pos.y - 1 , z = pos.z } ) . name
2017-03-11 16:33:55 +02:00
2017-03-11 06:46:05 +02:00
if minetest.get_item_group ( block_below_name , " material_glass " ) ~= 0 then
2017-03-11 07:51:45 +02:00
-- TODO: 24 sticks and clicks
soundname = " mesecons_noteblock_temp_stick "
2017-03-11 06:46:05 +02:00
elseif minetest.get_item_group ( block_below_name , " material_wood " ) ~= 0 then
2017-03-11 07:51:45 +02:00
-- TODO: 24 bass guitar sounds
soundname = " mesecons_noteblock_temp_bass_guitar "
2017-03-11 06:46:05 +02:00
elseif minetest.get_item_group ( block_below_name , " material_sand " ) ~= 0 then
2017-03-11 07:51:45 +02:00
-- TODO: 24 snare drum sounds
soundname = " mesecons_noteblock_temp_snare "
2017-03-11 06:46:05 +02:00
elseif minetest.get_item_group ( block_below_name , " material_stone " ) ~= 0 then
2017-03-11 07:51:45 +02:00
-- TODO: 24 bass drum sounds
soundname = " mesecons_noteblock_temp_kick "
2015-06-29 20:55:56 +03:00
end
minetest.sound_play ( soundname ,
2017-03-11 06:48:21 +02:00
{ pos = pos , gain = 1.0 , max_hear_distance = 48 , } )
2015-06-29 20:55:56 +03:00
end