2021-05-29 16:12:33 +02:00
local S = minetest.get_translator ( minetest.get_current_modname ( ) )
local math = math
2019-03-08 01:07:41 +01:00
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 " ) ,
2020-02-19 04:54:17 +01:00
_tt_help = S ( " Plays a musical note when powered by redstone power " ) ,
2019-03-08 01:07:41 +01: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 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 " ..
2020-03-28 07:20:16 +01: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 01:07:41 +01:00
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 " } ,
2020-04-18 23:24:42 +02:00
groups = { handy = 1 , axey = 1 , material_wood = 1 , flammable =- 1 } ,
2017-01-04 22:36:51 +01:00
is_ground_content = false ,
2017-03-11 06:15:58 +01:00
place_param2 = 0 ,
2021-05-29 16:12:33 +02:00
on_rightclick = function ( pos , node , clicker ) -- change sound when rightclicked
2019-02-08 21:59:01 +01:00
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 ,
2021-05-29 16:12:33 +02:00
on_punch = function ( pos , node ) -- play current sound when punched
2017-03-11 06:17:35 +01:00
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
2021-05-29 16:12:33 +02:00
action_on = function ( pos , node )
2015-06-29 19:55:56 +02:00
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
} } ,
2020-04-17 21:40:13 +02:00
_mcl_blast_resistance = 0.8 ,
2017-02-27 01:52:24 +01:00
_mcl_hardness = 0.8 ,
2015-06-29 19:55:56 +02:00
} )
minetest.register_craft ( {
2021-05-29 16:12:33 +02:00
output = " mesecons_noteblock:noteblock " ,
2015-06-29 19:55:56 +02:00
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
}
2020-08-19 12:20:12 +02:00
local function param2_to_note_color ( param2 )
local r , g , b
if param2 < 8 then -- 0..7
-- More red, less green
r = param2 / 8 * 255
g = ( 8 - param2 ) / 8 * 255
b = 0
elseif param2 < 16 then -- 0..15
-- More blue, less red
r = ( 8 - ( param2 - 8 ) ) / 8 * 255
g = 0
b = ( param2 - 8 ) / 8 * 255
else -- 16..24
-- More green, less blue
r = 0
g = ( param2 - 16 ) / 9 * 255
b = ( 9 - ( param2 - 16 ) ) / 9 * 255
end
r = math.floor ( r )
g = math.floor ( g )
b = math.floor ( b )
local color = 0x10000 * r + 0x100 * g + b
-- Convert to ColorString
return string.format ( " #%06X " , color )
end
2021-05-29 16:12:33 +02:00
local function param2_to_pitch ( param2 )
return 2 ^ ( ( param2 - 12 ) / 12 )
end
function mesecon . noteblock_play ( 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
2020-03-28 07:20:16 +01:00
local pitched = false
2019-03-18 17:54:14 +01:00
local soundname , pitch
2020-03-28 07:20:16 +01: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 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 "
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 "
2017-03-11 05:46:05 +01:00
elseif minetest.get_item_group ( block_below_name , " material_stone " ) ~= 0 then
2020-03-28 07:20:16 +01:00
soundname = " mesecons_noteblock_bass_drum "
2019-03-18 17:54:14 +01: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 07:20:16 +01:00
pitched = true
end
if not pitched then
pitch = param2_to_pitch ( param2 )
2015-06-29 19:55:56 +02:00
end
2019-03-18 17:54:14 +01:00
2020-08-19 12:20:12 +02:00
local note_color = param2_to_note_color ( param2 )
minetest.add_particle ( {
2020-08-19 13:29:13 +02:00
texture = " mcl_particles_note.png^[colorize: " .. note_color .. " :92 " ,
2020-08-19 12:20:12 +02:00
pos = { x = pos.x , y = pos.y + 0.35 , z = pos.z } ,
velocity = { x = 0 , y = 2 , z = 0 } ,
acceleration = { x = 0 , y = - 2 , z = 0 } ,
expirationtime = 1.0 ,
collisiondetection = false ,
size = 3 ,
} )
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