ThePython 285b680152 v6.0
2023-10-02 14:53:43 -07:00

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},
}
})