builtin sounds

master
NatureFreshMilk 2019-04-29 12:55:15 +02:00
parent 8a3945b83d
commit b0556cca52
10 changed files with 233 additions and 58 deletions

17
.luacheckrc Normal file
View File

@ -0,0 +1,17 @@
unused_args = false
allow_defined_top = true
globals = {
"soundblocks",
}
read_globals = {
-- Stdlib
string = {fields = {"split"}},
table = {fields = {"copy", "getn"}},
-- Minetest
"minetest",
"vector", "ItemStack"
}

View File

@ -1,7 +1,6 @@
--[[
def = {
length = 2, -- seconds
filenames = {
"default_glass_footstep.ogg"
},

View File

@ -1,20 +0,0 @@
soundblocks.register({
length = 2,
filename = "default_glass_footstep.ogg",
key = "default_glass_footsteps",
name = "Glass footsteps"
})
soundblocks.register({
length = 2,
filenames = {
"default_grass_footstep.1.ogg",
"default_grass_footstep.2.ogg",
"default_grass_footstep.3.ogg"
},
key = "default_grass_footstep",
name = "Grass footsteps"
})

View File

@ -1,2 +1,3 @@
default?
mesecons?
technic?

View File

@ -3,11 +3,10 @@ local FORMNAME = "soundblock_config"
--[[
config options:
* mesecon-behavior: [repeat, single]
* state: [off, mesecon, on]
* state: [off, on]
* interval-from <float>
* interval-to <float>
* interval-min <float>
* interval-max <float>
* gain <float>
* hear-distance <int>
@ -15,7 +14,6 @@ config options:
--]]
soundblocks.showform = function(pos, node, player)
local meta = minetest.get_meta(pos)
@ -37,23 +35,34 @@ soundblocks.showform = function(pos, node, player)
selected_sound = i
end
sound_list = sound_list .. i .. ": " .. minetest.formspec_escape(sound.name)
sound_list = sound_list .. minetest.formspec_escape(sound.name)
if i < #soundblocks.sounds then
sound_list = sound_list .. ","
end
end
sound_list = sound_list .. ";" .. selected_sound .. "]";
local state = meta:get_string("state")
local interval_min = meta:get_int("interval_min")
local interval_max = meta:get_int("interval_max")
local gain = meta:get_int("gain")
local hear_distance = meta:get_int("hear_distance")
local randomize_position = meta:get_int("randomize_position")
local formspec = "size[8,8;]" ..
--left
"label[0,0;Mission editor]" ..
"button[5.5,1;2,1;add;Add]" ..
"button[5.5,2;2,1;edit;Edit]" ..
"button[5.5,3;2,1;up;Up]" ..
"button[5.5,4;2,1;down;Down]" ..
"button[5.5,5;2,1;remove;Remove]" ..
steps_list ..
"button_exit[0,7;8,1;save;Save and validate]"
"label[0,0;Soundblock <" .. state .. ">]" ..
"field[0,2;8,1;interval_min;Interval-min;" .. interval_min .. "]" ..
"field[0,2;8,1;interval_max;Interval-max;" .. interval_max .. "]" ..
"field[0,2;8,1;gain;Gain;" .. gain .. "]" ..
"field[0,2;8,1;hear_distance;Hear distance;" .. hear_distance .. "]" ..
"field[0,2;8,1;randomize_position;Randomize position;" .. randomize_position .. "]" ..
sound_list ..
"button_exit[0,7;8,1;save;Save]" ..
"button_exit[0,7;8,1;toggle_state;Toggle state]"
minetest.show_formspec(player:get_player_name(),
FORMNAME .. ";" .. minetest.pos_to_string(pos),
@ -73,22 +82,54 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local pos = minetest.string_to_pos(parts[2])
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local has_override = minetest.check_player_privs(player, "protection_bypass")
if not has_override and minetest.is_protected(pos, player:get_player_name()) then
return
end
local timer = minetest.get_node_timer(pos)
if fields.toggle_state then
local state = meta:get_string("state")
if state == "on" then
state = "mesecons"
timer:stop()
elseif state == "mesecons" then
state = "off"
timer:stop()
else -- off
state = "on"
timer:start(0)
end
meta:set_string("state", state)
end
if fields.toggle_state or fields.save then
meta:set_int("interval_min", tonumber(fields.interval_min) or 1)
meta:set_int("interval_max", tonumber(fields.interval_max) or 1)
meta:set_int("gain", tonumber(fields.gain) or 1)
meta:set_int("hear_distance", tonumber(fields.hear_distance) or 16)
meta:set_int("randomize_position", tonumber(fields.randomize_position) or 0)
end
if fields.sounds then
parts = fields.steps:split(":")
parts = fields.sounds:split(":")
if parts[1] == "CHG" then
local selected_sound = tonumber(parts[2])
--TODO
local selected_sound_name = tonumber(parts[2])
local selected_sound_key
for i,sound in ipairs(soundblocks.sounds) do
if selected_sound_name == sound.name then
selected_sound_key = sound.key
end
end
meta:set_string("selected_sound_key", selected_sound_key)
end
end
--TODO
end)

View File

@ -9,7 +9,11 @@ dofile(MP.."/form.lua")
dofile(MP.."/soundblock.lua")
if minetest.get_modpath("default") then
dofile(MP.."/builtin.lua")
dofile(MP.."/mods/builtin.lua")
end
if minetest.get_modpath("technic") then
dofile(MP.."/mods/technic.lua")
end

82
mods/builtin.lua Normal file
View File

@ -0,0 +1,82 @@
soundblocks.register({
filename = "default_glass_footstep",
key = "default_glass_footsteps",
name = "Glass footsteps"
})
soundblocks.register({
filenames = {
"default_grass_footstep.1",
"default_grass_footstep.2",
"default_grass_footstep.3"
},
key = "default_grass_footstep",
name = "Grass footsteps"
})
soundblocks.register({
filenames = {
"default_gravel_footstep.1",
"default_gravel_footstep.2",
"default_gravel_footstep.3"
},
key = "default_gravel_footstep",
name = "Gravel footsteps"
})
soundblocks.register({
filenames = {
"default_wood_footstep.1",
"default_wood_footstep.2"
},
key = "default_wood_footstep",
name = "Wood footsteps"
})
soundblocks.register({
filenames = {
"default_sand_footstep.1",
"default_sand_footstep.2"
},
key = "default_sand_footstep",
name = "Sand footsteps"
})
soundblocks.register({
filenames = {
"default_metal_footstep.1",
"default_metal_footstep.2",
"default_metal_footstep.3"
},
key = "default_metal_footstep",
name = "Metal footsteps"
})
soundblocks.register({
filenames = {
"default_snow_footstep.1",
"default_snow_footstep.2",
"default_snow_footstep.3"
"default_snow_footstep.4",
"default_snow_footstep.5"
},
key = "default_snow_footstep",
name = "Snow footsteps"
})
soundblocks.register({
filename = "default_chest_close"
key = "default_chest_close",
name = "Chest close"
})
soundblocks.register({
filename = "default_chest_open"
key = "default_chest_open",
name = "Chest open"
})

7
mods/technic.lua Normal file
View File

@ -0,0 +1,7 @@
soundblocks.register({
filename = "technic_hv_nuclear_reactor_siren_danger_loop",
key = "technic_hv_nuclear_reactor_siren_danger_loop",
name = "Nuclear reactor meltdown"
})

View File

@ -7,7 +7,6 @@ Register custom sounds:
```lua
soundblocks.register({
length = 2,
filename = "default_glass_footstep.ogg",
key = "default_glass_footsteps",
name = "Glass footsteps"
@ -15,7 +14,6 @@ soundblocks.register({
soundblocks.register({
length = 2,
filenames = {
"default_grass_footstep.1.ogg",
"default_grass_footstep.2.ogg",

View File

@ -1,8 +1,40 @@
-- minetest.sound_play("vacuum_hiss", {pos = pos, gain = 0.5, max_hear_distance=16})
-- local timer = minetest.get_node_timer(pos)
-- timer:start(3)
local execute = function(pos)
local meta = minetest.get_meta(pos)
local selected_sound_key = meta:get_string("selected_sound_key")
local def = soundblocks.sounds[selected_sound_key]
if def == nil then
return
end
local gain = meta:get_int("gain")
local hear_distance = meta:get_int("hear_distance")
local randomize_position = meta:get_int("randomize_position")
local play_pos = pos
local filename = def.filename
if def.filenames then
filename = def.filenames[math.random(1, #def.filenames)]
end
if randomize_position > 0 then
play_pos = vector.add(pos, {
x = math.random(-randomize_position, randomize_position),
y = math.random(-randomize_position, randomize_position),
z = math.random(-randomize_position, randomize_position)
})
end
minetest.sound_play(filename, {
pos = play_pos,
gain = gain,
max_hear_distance = hear_distance
})
end
minetest.register_node("soundblocks:block", {
description = "Sound Block",
@ -12,7 +44,13 @@ minetest.register_node("soundblocks:block", {
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("selected_sound_key", "")
meta:set_string("selected_sound_key", "default_grass_footstep")
meta:set_string("state", "off")
meta:set_int("interval_min", 2)
meta:set_int("interval_max", 2)
meta:set_int("gain", 1)
meta:set_int("hear_distance", 32)
meta:set_int("randomize_position", 0)
end,
can_dig = function(pos,player)
@ -25,19 +63,27 @@ minetest.register_node("soundblocks:block", {
end,
on_timer = function(pos, elapsed)
--TODO
local meta = minetest.get_meta(pos)
local state = meta:get_string("state")
if state ~= "on" then
return
end
execute(pos)
local interval_min = meta:get_int("interval_min")
local interval_max = meta:get_int("interval_max")
local new_timeout = math.random(interval_min, interval_max)
local timer = minetest.get_node_timer(pos)
timer:start(new_timeout)
end,
mesecons = {effector = {
action_on = function (pos, node)
local meta = minetest.get_meta(pos)
--TODO
update_infotext(meta)
end,
action_off = function (pos, node)
local meta = minetest.get_meta(pos)
--TODO
update_infotext(meta)
execute(pos)
end
}},