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 " ) ,
2020-02-19 05:54:17 +02:00
_tt_help = S ( " Plays a musical note when powered by redstone power " ) ,
2019-03-08 02:07:41 +02:00
_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 18:54:14 +02: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 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 " ..
2020-03-28 08:20:16 +02:00
S ( " • Block of Gold: Bell " ) .. " \n " ..
S ( " • Clay: Flute " ) .. " \n " ..
S ( " • Packed Ice: Chime " ) .. " \n " ..
S ( " • Wool: Guitar " ) .. " \n " ..
S ( " • Bone Block: Xylophne " ) .. " \n " ..
S ( " • Block of Iron: Iron xylophne " ) .. " \n " ..
S ( " • Soul Sand: Cow bell " ) .. " \n " ..
S ( " • Pumpkin: Didgeridoo " ) .. " \n " ..
S ( " • Block of Emerald: Square wave " ) .. " \n " ..
S ( " • Hay Bale: Banjo " ) .. " \n " ..
S ( " • Glowstone: Electric piano " ) .. " \n " ..
2019-03-08 02:07:41 +02:00
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
2019-03-18 18:54:14 +02:00
node.param2 = ( node.param2 + 1 ) % 25
2017-03-11 07:14:26 +02:00
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 " ,
2019-03-18 18:54:14 +02:00
-- TODO: Add dedicated sound file?
" mesecons_noteblock_b2 " ,
2017-03-11 07:14:26 +02:00
}
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
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
2019-03-18 18:54:14 +02:00
local param2_to_pitch = function ( param2 )
return 2 ^ ( ( param2 - 12 ) / 12 )
end
2020-03-28 08:20:16 +02:00
local pitched = false
2019-03-18 18:54:14 +02:00
local soundname , pitch
2020-03-28 08:20:16 +02:00
if block_below_name == " mcl_core:goldblock " then
soundname = " mesecons_noteblock_bell "
elseif block_below_name == " mcl_core:clay " then
soundname = " mesecons_noteblock_flute "
elseif block_below_name == " mcl_core:packed_ice " then
soundname = " mesecons_noteblock_chime "
elseif block_below_name == " mcl_core:bone_block " then
soundname = " mesecons_noteblock_xylophone_wood "
elseif block_below_name == " mcl_core:ironblock " then
soundname = " mesecons_noteblock_xylophone_metal "
elseif block_below_name == " mcl_nether:soul_sand " then
soundname = " mesecons_noteblock_cowbell "
elseif block_below_name == " mcl_farming:pumpkin " or block_below_name == " mcl_farming:pumpkin_face " or block_below_name == " mcl_farming:pumpkin_face_light " then
soundname = " mesecons_noteblock_didgeridoo "
elseif block_below_name == " mcl_core:emeraldblock " then
soundname = " mesecons_noteblock_squarewave "
elseif block_below_name == " mcl_farming:hay_block " then
soundname = " mesecons_noteblock_banjo "
elseif block_below_name == " mcl_nether:glowstone " then
soundname = " mesecons_noteblock_piano_digital "
elseif minetest.get_item_group ( block_below_name , " wool " ) ~= 0 then
soundname = " mesecons_noteblock_guitar "
elseif minetest.get_item_group ( block_below_name , " material_glass " ) ~= 0 then
soundname = " mesecons_noteblock_hit "
2017-03-11 06:46:05 +02:00
elseif minetest.get_item_group ( block_below_name , " material_wood " ) ~= 0 then
2019-03-18 18:54:14 +02:00
soundname = " mesecons_noteblock_bass_guitar "
2017-03-11 06:46:05 +02:00
elseif minetest.get_item_group ( block_below_name , " material_sand " ) ~= 0 then
2019-03-18 18:54:14 +02:00
soundname = " mesecons_noteblock_snare "
2017-03-11 06:46:05 +02:00
elseif minetest.get_item_group ( block_below_name , " material_stone " ) ~= 0 then
2020-03-28 08:20:16 +02:00
soundname = " mesecons_noteblock_bass_drum "
2019-03-18 18:54:14 +02:00
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
2020-03-28 08:20:16 +02:00
pitched = true
end
if not pitched then
pitch = param2_to_pitch ( param2 )
2015-06-29 20:55:56 +03:00
end
2019-03-18 18:54:14 +02:00
2015-06-29 20:55:56 +03:00
minetest.sound_play ( soundname ,
2019-03-18 18:54:14 +02:00
{ pos = pos , gain = 1.0 , max_hear_distance = 48 , pitch = pitch } )
2015-06-29 20:55:56 +03:00
end