216 lines
10 KiB
Lua
216 lines
10 KiB
Lua
local sound_mod = default
|
|
local center_itemstring = "wool:black"
|
|
local copper_itemstring = "default:copper_ingot"
|
|
if why.mcl then
|
|
sound_mod = mcl_sounds
|
|
center_itemstring = "mcl_colorblocks:concrete_black"
|
|
copper_itemstring = "mcl_copper:copper_ingot"
|
|
end
|
|
|
|
local sound_machine_context = {}
|
|
|
|
local sound_machine_buttons
|
|
if why.mcl then
|
|
sound_machine_buttons = {
|
|
{{sound = "tnt_ignite", name = "Ignite TNT"}, {sound = "tnt_explode", name = "Explosion"}, {sound = "mcl_bows_bow_shoot", name = "Bow Shot",}},
|
|
{{sound = "mcl_experience_level_up", name = "XP Level Up", gain = 0.6}, {sound = "player_damage", name = "Player Damage"}, {sound = "awards_got_generic", name = "Achievement",}},
|
|
{{sound = "mobs_mc_wolf_bark", name = "Wolf"}, {sound = "mobs_mc_zombie_growl", name = "Zombie"}, {sound = "mobs_mc_pillager_ow1", name = "Ow",}},
|
|
{{sound = "mobs_mc_villager", name = "Villager"}, {sound = "mobs_mc_spider_random", name = "Spider"}, {sound = "mobs_mc_cat_idle", name = "Cat",}},
|
|
{{sound = "mobs_mc_cow", name = "Cow"}, {sound = "mobs_pig", name = "Pig"}, {sound = "mobs_mc_ender_dragon_shoot", name = "Ender Dragon"}},
|
|
}
|
|
|
|
else
|
|
sound_machine_buttons = {
|
|
{{sound = "tnt_ignite", name = "Ignite TNT"}, {sound = "tnt_explode", name = "Explosion"}, {sound = "default_break_glass", name = "Breaking Glass",}},
|
|
{{sound = "default_chest_open", name = "Open Chest"}, {sound = "default_chest_close", name = "Close Chest"}, {sound = "player_damage", name = "Player Damage",}},
|
|
{{sound = "default_cool_lava", name = "Lava cooling"}, {sound = "fire_fire", name = "Fire"}, {sound = "fire_flint_and_steel", name = "Flint and Steel",}},
|
|
{{sound = "default_tool_breaks", name = "Tool breaking"}, {sound = "default_water_footstep", name = "Water"}, {sound = "doors_fencegate_open", name = "Open Gate",}},
|
|
{{sound = "doors_door_open", name = "Open Door"}, {sound = "doors_door_close", name = "Close Door"}, {sound = "doors_fencegate_close", name = "Close Gate"}},
|
|
}
|
|
end
|
|
|
|
local function generate_formspec(sound_box, pitch)
|
|
local height = #sound_machine_buttons + 4
|
|
local formspec = "size[11,"..height.."]"..
|
|
"label[0.5,0.5;Sound Machine]"..
|
|
"field[1,"..(height-1.5)..";2,1;pitch;Pitch;"..pitch.."]"..
|
|
"button[3,"..(height-1.8)..";2,1;pitch_button;Set Pitch]"..
|
|
"field[1,"..(height-0.5)..";7,1;custom_sound;;"..sound_box.."]"..
|
|
"field_close_on_enter[pitch;false]"..
|
|
"field_close_on_enter[custom_sound;false]"..
|
|
"button[8,"..(height-0.8)..";2,1;custom_sound_button;Custom Sound]"
|
|
for row_num, row in ipairs(sound_machine_buttons) do
|
|
for column_num, column in ipairs(row) do
|
|
formspec = formspec.."button["..(column_num*3-2)..","..(row_num+1)..";3,1;"..row_num.."_"..column_num..";"..column.name.."]"
|
|
end
|
|
end
|
|
return formspec
|
|
end
|
|
|
|
local function show_portable_formspec(itemstack, player, pointed_thing)
|
|
if not player:get_player_control().sneak then
|
|
-- Call on_rightclick if the pointed node defines it
|
|
if pointed_thing and pointed_thing.type == "node" then
|
|
local pos = pointed_thing.under
|
|
local node = minetest.get_node(pos)
|
|
if player and not player:get_player_control().sneak then
|
|
local nodedef = minetest.registered_nodes[node.name]
|
|
local on_rightclick = nodedef and nodedef.on_rightclick
|
|
if on_rightclick then
|
|
return on_rightclick(pos, node, player, itemstack, pointed_thing) or itemstack
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local custom_sound = player:get_meta():get_string("sound_machine_custom_sound") or "tnt_ignite"
|
|
local pitch = player:get_meta():get_string("sound_machine_pitch") or 1.0
|
|
local formspec = generate_formspec(custom_sound, pitch)
|
|
|
|
minetest.show_formspec(player:get_player_name(), "sound_machine_portable_sound_machine", formspec)
|
|
end
|
|
|
|
local function show_sound_machine_formspec(pos, node, clicker)
|
|
local last_sound = minetest.get_meta(pos):get_string("sound_machine_last_sound")
|
|
local pitch = minetest.get_meta(pos):get_string("sound_machine_pitch") or 1.0
|
|
local formspec = generate_formspec(last_sound, pitch)
|
|
|
|
sound_machine_context[clicker:get_player_name()] = pos
|
|
minetest.show_formspec(clicker:get_player_name(), "sound_machine_sound_machine", formspec)
|
|
end
|
|
|
|
local function sound_machine_play(pos)
|
|
local last_sound = minetest.get_meta(pos):get_string("sound_machine_last_sound")
|
|
--minetest.log(last_sound)
|
|
local pitch = tonumber(minetest.get_meta(pos):get_string("sound_machine_pitch") or 1)
|
|
minetest.sound_play({name = last_sound, pitch = pitch}, { pos = pos, max_hear_distance = 20})
|
|
end
|
|
|
|
minetest.register_tool("sound_machine:portable_sound_machine", {
|
|
description = "Portable Sound Machine",
|
|
on_use = function(itemstack, player, pointed_thing)
|
|
local pitch = tonumber(player:get_meta():get_string("sound_machine_pitch") or 1)
|
|
local sound = player:get_meta():get_string("sound_machine_custom_sound") or "tnt_ignite"
|
|
minetest.sound_play({name = sound, pitch = pitch}, {pos = player:get_pos(), max_hear_distance = 20})
|
|
player:get_meta():set_string("sound_machine_custom_sound", sound)
|
|
end,
|
|
on_place = show_portable_formspec,
|
|
on_secondary_use = show_portable_formspec,
|
|
inventory_image = "sound_machine_sound_machine.png",
|
|
wield_image = "sound_machine_sound_machine.png"
|
|
})
|
|
minetest.register_node("sound_machine:sound_machine", {
|
|
description = "Sound Machine",
|
|
tiles = {"sound_machine_sound_machine.png"},
|
|
groups = {pickaxey = 1, cracky=2, material_stone = 1},
|
|
is_ground_content = false,
|
|
place_param2 = 0,
|
|
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
|
|
show_sound_machine_formspec(pos, node, clicker)
|
|
end,
|
|
on_punch = function(pos, node) -- play current sound when punched
|
|
sound_machine_play(pos)
|
|
end,
|
|
sounds = sound_mod.node_sound_wood_defaults(),
|
|
mesecons = {effector = { -- play sound when activated
|
|
action_on = function(pos, node)
|
|
sound_machine_play(pos)
|
|
end,
|
|
rules = {{x= 1, y= 0, z= 0},
|
|
{x=-1, y= 0, z= 0},
|
|
{x= 0, y= 1, z= 0},
|
|
{x= 0, y=-1, z= 0},
|
|
{x= 0, y= 0, z= 1},
|
|
{x= 0, y= 0, z=-1}},
|
|
}},
|
|
_mcl_blast_resistance = 0.8,
|
|
_mcl_hardness = 0.8,
|
|
})
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
if formname == "sound_machine_portable_sound_machine" then
|
|
if fields.quit then return end
|
|
|
|
local player_pos = player:get_pos()
|
|
|
|
if (fields.key_enter_field == "pitch" or fields.pitch_button) and fields.pitch then
|
|
if tonumber(fields.pitch) then
|
|
player:get_meta():set_string("sound_machine_pitch", fields.pitch)
|
|
end
|
|
end
|
|
|
|
if (fields.key_enter_field == "custom_sound" or fields.custom_sound_button) and fields.custom_sound then
|
|
local pitch = tonumber(player:get_meta():get_string("sound_machine_pitch") or 1)
|
|
minetest.sound_play({name = fields.custom_sound, pitch = pitch}, {pos = player_pos, max_hear_distance = 20})
|
|
player:get_meta():set_string("sound_machine_custom_sound", fields.custom_sound)
|
|
show_portable_formspec(nil, player)
|
|
end
|
|
for field, data in pairs(fields) do
|
|
local _, _, row, column = string.find(field, "^(%d+)_(%d+)$") -- 2 numbers separated by an underscore (and nothing else)
|
|
if row and column then
|
|
local sound_data = sound_machine_buttons[tonumber(row)][tonumber(column)]
|
|
local pitch = tonumber(player:get_meta():get_string("sound_machine_pitch") or 1)
|
|
minetest.sound_play({name = sound_data.sound, gain = sound_data.gain, pitch = pitch}, { pos = player_pos, max_hear_distance = 20})
|
|
player:get_meta():set_string("sound_machine_custom_sound", sound_data.sound)
|
|
show_portable_formspec(nil, player)
|
|
return
|
|
end
|
|
end
|
|
elseif formname == "sound_machine_sound_machine" then
|
|
if fields.quit then
|
|
sound_machine_context[player:get_player_name()] = nil
|
|
return
|
|
end
|
|
|
|
if sound_machine_context[player:get_player_name()] then
|
|
local pos = sound_machine_context[player:get_player_name()]
|
|
|
|
if (fields.key_enter_field == "pitch" or fields.pitch_button) then
|
|
if tonumber(fields.pitch) then
|
|
minetest.get_meta(pos):set_string("sound_machine_pitch", fields.pitch or 1)
|
|
end
|
|
end
|
|
|
|
if (fields.key_enter_field == "custom_sound" or fields.custom_sound_button) then
|
|
if fields.custom_sound then
|
|
minetest.get_meta(pos):set_string("sound_machine_last_sound", fields.custom_sound)
|
|
end
|
|
sound_machine_play(pos)
|
|
show_sound_machine_formspec(pos, nil, player)
|
|
end
|
|
for field, data in pairs(fields) do
|
|
local _, _, row, column = string.find(field, "^(%d+)_(%d+)$") -- 2 numbers separated by an underscore (and nothing else)
|
|
if row and column then
|
|
local sound_data = sound_machine_buttons[tonumber(row)][tonumber(column)]
|
|
minetest.get_meta(pos):set_string("sound_machine_last_sound", sound_data.sound)
|
|
sound_machine_play(pos)
|
|
show_sound_machine_formspec(pos, nil, player)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_craft({
|
|
output = "sound_machine:portable_sound_machine",
|
|
recipe = {{"sound_machine:sound_machine"}}
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "sound_machine:sound_machine",
|
|
recipe = {{"sound_machine:portable_sound_machine"}}
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "sound_machine:sound_machine",
|
|
recipe = {
|
|
{copper_itemstring, copper_itemstring, copper_itemstring},
|
|
{copper_itemstring, center_itemstring, copper_itemstring},
|
|
{copper_itemstring, copper_itemstring, copper_itemstring},
|
|
}
|
|
}) |