2019-03-08 01:07:41 +01:00
local S = minetest.get_translator ( " mesecons_noteblock " )
2015-06-29 19:55:56 +02:00
minetest.register_node ( " mesecons_noteblock:noteblock " , {
2019-03-08 01:07:41 +01: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. " ) ,
2019-03-18 17:54:14 +01:00
_doc_items_usagehelp = S ( " Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block: " ) .. " \n \n " ..
2017-03-11 06:26:47 +01:00
2019-03-08 01:07:41 +01: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 15:33:55 +01:00
2019-03-08 01:07:41 +01:00
S ( " The note block will only play a note when it is below air, otherwise, it stays silent. " ) ,
2015-06-29 19:55:56 +02:00
tiles = { " mesecons_noteblock.png " } ,
2017-03-11 05:34:58 +01:00
groups = { handy = 1 , axey = 1 , material_wood = 1 } ,
2017-01-04 22:36:51 +01:00
is_ground_content = false ,
2017-03-11 06:15:58 +01:00
place_param2 = 0 ,
2019-02-08 21:59:01 +01: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
2019-03-18 17:54:14 +01:00
node.param2 = ( node.param2 + 1 ) % 25
2017-03-11 06:14:26 +01:00
mesecon.noteblock_play ( pos , node.param2 )
minetest.set_node ( pos , node )
2015-06-29 19:55:56 +02:00
end ,
2017-03-11 06:17:35 +01:00
on_punch = function ( pos , node ) -- play current sound when punched
mesecon.noteblock_play ( pos , node.param2 )
end ,
2017-02-11 18:46:23 +01:00
sounds = mcl_sounds.node_sound_wood_defaults ( ) ,
2015-06-29 19:55:56 +02:00
mesecons = { effector = { -- play sound when activated
action_on = function ( pos , node )
mesecon.noteblock_play ( pos , node.param2 )
2018-01-12 01:37:32 +01:00
end ,
rules = mesecon.rules . alldirs ,
2017-02-22 16:22:28 +01:00
} } ,
_mcl_blast_resistance = 4 ,
2017-02-27 01:52:24 +01:00
_mcl_hardness = 0.8 ,
2015-06-29 19:55:56 +02:00
} )
minetest.register_craft ( {
output = ' "mesecons_noteblock:noteblock" 1 ' ,
recipe = {
{ " group:wood " , " group:wood " , " group:wood " } ,
2017-01-09 18:45:34 +01:00
{ " group:wood " , " mesecons:redstone " , " group:wood " } ,
2015-06-29 19:55:56 +02:00
{ " group:wood " , " group:wood " , " group:wood " } ,
}
} )
2017-01-10 06:43:07 +01:00
minetest.register_craft ( {
type = " fuel " ,
recipe = " mesecons_noteblock:noteblock " ,
burntime = 15
} )
2017-03-11 06:14:26 +01: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 " ,
2019-03-18 17:54:14 +01:00
-- TODO: Add dedicated sound file?
" mesecons_noteblock_b2 " ,
2017-03-11 06:14:26 +01:00
}
2015-06-29 19:55:56 +02:00
mesecon.noteblock_play = function ( pos , param2 )
2017-03-11 15:33:55 +01: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 06:14:26 +01:00
2017-01-11 18:21:46 +01:00
local block_below_name = minetest.get_node ( { x = pos.x , y = pos.y - 1 , z = pos.z } ) . name
2019-03-18 17:54:14 +01:00
local param2_to_pitch = function ( param2 )
return 2 ^ ( ( param2 - 12 ) / 12 )
end
local soundname , pitch
2017-03-11 05:46:05 +01:00
if minetest.get_item_group ( block_below_name , " material_glass " ) ~= 0 then
2019-03-18 17:54:14 +01:00
soundname = " mesecons_noteblock_stick "
pitch = param2_to_pitch ( param2 )
2017-03-11 05:46:05 +01:00
elseif minetest.get_item_group ( block_below_name , " material_wood " ) ~= 0 then
2019-03-18 17:54:14 +01:00
soundname = " mesecons_noteblock_bass_guitar "
pitch = param2_to_pitch ( param2 )
2017-03-11 05:46:05 +01:00
elseif minetest.get_item_group ( block_below_name , " material_sand " ) ~= 0 then
2019-03-18 17:54:14 +01:00
soundname = " mesecons_noteblock_snare "
pitch = param2_to_pitch ( param2 )
2017-03-11 05:46:05 +01:00
elseif minetest.get_item_group ( block_below_name , " material_stone " ) ~= 0 then
2019-03-18 17:54:14 +01:00
soundname = " mesecons_noteblock_kick "
pitch = param2_to_pitch ( param2 )
else
-- Default: One of 25 piano notes
soundname = soundnames_piano [ param2 ]
-- Workaround: Final sound gets automatic higher pitch instead
if param2 == 24 then
pitch = 2 ^ ( 1 / 12 )
end
2015-06-29 19:55:56 +02:00
end
2019-03-18 17:54:14 +01:00
2015-06-29 19:55:56 +02:00
minetest.sound_play ( soundname ,
2019-03-18 17:54:14 +01:00
{ pos = pos , gain = 1.0 , max_hear_distance = 48 , pitch = pitch } )
2015-06-29 19:55:56 +02:00
end