Compare commits

...

14 Commits

Author SHA1 Message Date
1963bfcc0d Merge remote-tracking branch 'upstream/master' 2021-04-17 13:50:01 +02:00
DS
65793514fe Fix use_texture_alpha warnings (#563) 2021-04-09 20:24:41 +02:00
6936c8c2e4 Merge remote-tracking branch 'upstream/master' 2021-04-04 21:01:12 +02:00
f5c3f798be Compatibility with mtg_craft_guide (#555)
Use group instead of wire when possible

Fixes https://github.com/minetest/minetest_game/issues/2843.
2021-04-01 18:56:08 +02:00
69d4a9584d Fix on-state effector-receptor combos (eg. gates) recepting to everywhere 2021-03-25 23:21:37 +01:00
DS
3f75c06a3b Improve performance of mesecon.turnon and mesecon.turnoff (#556) 2021-03-25 16:53:51 +01:00
2fc1682c04 Merge remote-tracking branch 'upstream/master' 2021-03-12 12:22:52 +01:00
93aa24dc42 Remove undeclared global variable corner_nodebox (#554)
To avoid warning message at load time.

Co-authored-by: sys4 <admin@sys4.fr>
2021-02-27 16:19:46 +01:00
93f155f604 Make /tell need shout priv (#553) 2021-02-27 16:12:51 +01:00
9b835053c2 Remove undeclared global variable corner_nodebox
To avoid warning message at load time.
2021-02-27 03:22:08 +01:00
583d2c1441 Replace mesecon.mergetable (#533) 2020-12-19 23:12:00 +03:00
397d449f1e Use empty string for protection check if puncher or clicker is nil. 2020-12-19 23:11:20 +03:00
29ec26a4c8 Prevent unauthorized players from toggling blinky plant. 2020-12-19 23:11:20 +03:00
0d86f2c45e Prevent unauthorized players from changing the noteblock sound. (#547) 2020-11-12 19:26:02 +01:00
16 changed files with 171 additions and 45 deletions

62
mesecons/fifo_queue.lua Normal file
View File

@ -0,0 +1,62 @@
-- a simple first-in-first-out queue
-- very similar to the one in https://github.com/minetest/minetest/pull/7683
local fifo_queue = {}
local metatable = {__index = fifo_queue}
-- creates a new empty queue
function fifo_queue.new()
local q = {n_in = 0, n_out = 0, i_out = 1, buf_in = {}, buf_out = {}}
setmetatable(q, metatable)
return q
end
-- adds an element to the queue
function fifo_queue.add(self, v)
local n = self.n_in + 1
self.n_in = n
self.buf_in[n] = v
end
-- removes and returns the next element, or nil of empty
function fifo_queue.take(self)
local i_out = self.i_out
if i_out <= self.n_out then
local v = self.buf_out[i_out]
self.i_out = i_out + 1
self.buf_out[i_out] = true
return v
end
-- buf_out is empty, try to swap
self.i_out = 1
self.n_out = 0
if self.n_in == 0 then
return nil -- empty
end
-- swap
self.n_out = self.n_in
self.n_in = 0
self.buf_out, self.buf_in = self.buf_in, self.buf_out
local v = self.buf_out[1]
self.i_out = 2
self.buf_out[1] = true
return v
end
-- returns whether the queue is empty
function fifo_queue.is_empty(self)
return self.n_out == self.i_out + 1 and self.n_in == 0
end
-- returns stuff for iteration in a for loop, like pairs
-- adding new elements while iterating is no problem
function fifo_queue.iter(self)
return fifo_queue.take, self, nil
end
return fifo_queue

View File

@ -11,7 +11,7 @@
-- RECEPTORS -- RECEPTORS
-- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor -- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor
-- mesecon.is_receptor_on(nodename --> Returns true if nodename is an receptor with state = mesecon.state.on -- mesecon.is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on
-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off -- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
-- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified) -- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified)
@ -46,6 +46,8 @@
-- mesecon.rotate_rules_down(rules) -- mesecon.rotate_rules_down(rules)
-- These functions return rules that have been rotated in the specific direction -- These functions return rules that have been rotated in the specific direction
local fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua")
-- General -- General
function mesecon.get_effector(nodename) function mesecon.get_effector(nodename)
if minetest.registered_nodes[nodename] if minetest.registered_nodes[nodename]
@ -92,8 +94,8 @@ function mesecon.get_any_inputrules(node)
end end
function mesecon.get_any_rules(node) function mesecon.get_any_rules(node)
return mesecon.mergetable(mesecon.get_any_inputrules(node) or {}, return mesecon.merge_rule_sets(mesecon.get_any_inputrules(node),
mesecon.get_any_outputrules(node) or {}) mesecon.get_any_outputrules(node))
end end
-- Receptors -- Receptors
@ -371,32 +373,39 @@ end
-- Follow all all conductor paths replacing conductors that were already -- Follow all all conductor paths replacing conductors that were already
-- looked at, activating / changing all effectors along the way. -- looked at, activating / changing all effectors along the way.
function mesecon.turnon(pos, link) function mesecon.turnon(pos, link)
local frontiers = {{pos = pos, link = link}} local frontiers = fifo_queue.new()
frontiers:add({pos = pos, link = link})
local pos_can_be_skipped = {}
local depth = 1 local depth = 1
while frontiers[1] do for f in frontiers:iter() do
local f = table.remove(frontiers, 1)
local node = mesecon.get_node_force(f.pos) local node = mesecon.get_node_force(f.pos)
if not node then if not node then
-- Area does not exist; do nothing -- Area does not exist; do nothing
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_conductor_off(node, f.link) then elseif mesecon.is_conductor_off(node, f.link) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
-- Call turnon on neighbors -- Call turnon on neighbors
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = vector.add(f.pos, r) local np = vector.add(f.pos, r)
if not pos_can_be_skipped[minetest.hash_node_position(np)] then
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
table.insert(frontiers, {pos = np, link = l}) frontiers:add({pos = np, link = l})
end
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link))
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
if mesecon.is_effector_off(node.name) then if mesecon.is_effector_off(node.name) then
mesecon.activate(f.pos, node, f.link, depth) mesecon.activate(f.pos, node, f.link, depth)
end end
else
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end end
depth = depth + 1 depth = depth + 1
end end
@ -419,25 +428,28 @@ end
-- depth = indicates order in which signals wire fired, higher is later -- depth = indicates order in which signals wire fired, higher is later
-- } -- }
function mesecon.turnoff(pos, link) function mesecon.turnoff(pos, link)
local frontiers = {{pos = pos, link = link}} local frontiers = fifo_queue.new()
frontiers:add({pos = pos, link = link})
local signals = {} local signals = {}
local pos_can_be_skipped = {}
local depth = 1 local depth = 1
while frontiers[1] do for f in frontiers:iter() do
local f = table.remove(frontiers, 1)
local node = mesecon.get_node_force(f.pos) local node = mesecon.get_node_force(f.pos)
if not node then if not node then
-- Area does not exist; do nothing -- Area does not exist; do nothing
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_conductor_on(node, f.link) then elseif mesecon.is_conductor_on(node, f.link) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = vector.add(f.pos, r) local np = vector.add(f.pos, r)
if not pos_can_be_skipped[minetest.hash_node_position(np)] then
-- Check if an onstate receptor is connected. If that is the case, -- Check if an onstate receptor is connected. If that is the case,
-- abort this turnoff process by returning false. `receptor_off` will -- abort this turnoff process by returning false. `receptor_off` will
-- discard all the changes that we made in the voxelmanip: -- discard all the changes that we made in the voxelmanip:
for _, l in ipairs(mesecon.rules_link_rule_all_inverted(f.pos, r)) do if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then
if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then
return false return false
end end
@ -445,11 +457,13 @@ function mesecon.turnoff(pos, link)
-- Call turnoff on neighbors -- Call turnoff on neighbors
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
table.insert(frontiers, {pos = np, link = l}) frontiers:add({pos = np, link = l})
end
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link))
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
table.insert(signals, { table.insert(signals, {
pos = f.pos, pos = f.pos,
@ -457,6 +471,8 @@ function mesecon.turnoff(pos, link)
link = f.link, link = f.link,
depth = depth depth = depth
}) })
else
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end end
depth = depth + 1 depth = depth + 1
end end

View File

@ -16,9 +16,9 @@ mesecon.rules.default = {
{x = 0, y = -1, z = -1}, {x = 0, y = -1, z = -1},
} }
mesecon.rules.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}}) mesecon.rules.floor = mesecon.merge_rule_sets(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, z = 0}}) mesecon.rules.pplate = mesecon.merge_rule_sets(mesecon.rules.floor, {{x = 0, y = -2, z = 0}})
mesecon.rules.buttonlike = { mesecon.rules.buttonlike = {
{x = 1, y = 0, z = 0}, {x = 1, y = 0, z = 0},

View File

@ -213,8 +213,9 @@ function mesecon.cmpAny(t1, t2)
return true return true
end end
-- does not overwrite values; number keys (ipairs) are appended, not overwritten -- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate.
function mesecon.mergetable(source, dest) function mesecon.mergetable(source, dest)
minetest.log("warning", debug.traceback("Deprecated call to mesecon.mergetable"))
local rval = mesecon.tablecopy(dest) local rval = mesecon.tablecopy(dest)
for k, v in pairs(source) do for k, v in pairs(source) do
@ -227,6 +228,32 @@ function mesecon.mergetable(source, dest)
return rval return rval
end end
-- Merges several rule sets in one. Order may not be preserved. Nil arguments
-- are ignored.
-- The rule sets must be of the same kind (either all single-level or all two-level).
-- The function may be changed to normalize the resulting set in some way.
function mesecon.merge_rule_sets(...)
local rval = {}
for _, t in pairs({...}) do -- ignores nils automatically
table.insert_all(rval, mesecon.tablecopy(t))
end
return rval
end
-- Merges two tables, with entries from `replacements` taking precedence over
-- those from `base`. Returns the new table.
-- Values are deep-copied from either table, keys are referenced.
-- Numerical indices arent handled specially.
function mesecon.merge_tables(base, replacements)
local ret = mesecon.tablecopy(replacements) -- these are never overriden so have to be copied in any case
for k, v in pairs(base) do
if ret[k] == nil then -- it could be `false`
ret[k] = mesecon.tablecopy(v)
end
end
return ret
end
function mesecon.register_node(name, spec_common, spec_off, spec_on) function mesecon.register_node(name, spec_common, spec_off, spec_on)
spec_common.drop = spec_common.drop or name .. "_off" spec_common.drop = spec_common.drop or name .. "_off"
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
@ -234,8 +261,8 @@ function mesecon.register_node(name, spec_common, spec_off, spec_on)
spec_on.__mesecon_state = "on" spec_on.__mesecon_state = "on"
spec_off.__mesecon_state = "off" spec_off.__mesecon_state = "off"
spec_on = mesecon.mergetable(spec_common, spec_on); spec_on = mesecon.merge_tables(spec_common, spec_on);
spec_off = mesecon.mergetable(spec_common, spec_off); spec_off = mesecon.merge_tables(spec_common, spec_off);
minetest.register_node(name .. "_on", spec_on) minetest.register_node(name .. "_on", spec_on)
minetest.register_node(name .. "_off", spec_off) minetest.register_node(name .. "_off", spec_off)

View File

@ -32,7 +32,13 @@ mesecon.register_node("mesecons_blinkyplant:blinky_plant", {
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
}, },
on_timer = on_timer, on_timer = on_timer,
on_rightclick = toggle_timer, on_rightclick = function(pos, node, clicker)
if minetest.is_protected(pos, clicker and clicker:get_player_name() or "") then
return
end
toggle_timer(pos)
end,
on_construct = toggle_timer on_construct = toggle_timer
},{ },{
tiles = {"jeija_blinky_plant_off.png"}, tiles = {"jeija_blinky_plant_off.png"},

View File

@ -13,6 +13,8 @@ mesecon.button_turnoff = function (pos)
mesecon.receptor_off(pos, rules) mesecon.receptor_off(pos, rules)
end end
local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil
minetest.register_node("mesecons_button:button_off", { minetest.register_node("mesecons_button:button_off", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
@ -23,6 +25,7 @@ minetest.register_node("mesecons_button:button_off", {
"jeija_wall_button_sides.png", "jeija_wall_button_sides.png",
"jeija_wall_button_off.png" "jeija_wall_button_off.png"
}, },
use_texture_alpha = use_texture_alpha,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
@ -67,6 +70,7 @@ minetest.register_node("mesecons_button:button_on", {
"jeija_wall_button_sides.png", "jeija_wall_button_sides.png",
"jeija_wall_button_on.png" "jeija_wall_button_on.png"
}, },
use_texture_alpha = use_texture_alpha,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,

View File

@ -10,6 +10,7 @@ minetest.register_chatcommand("say", {
minetest.register_chatcommand("tell", { minetest.register_chatcommand("tell", {
params = "<name> <text>", params = "<name> <text>",
description = "Say <text> to <name> privately", description = "Say <text> to <name> privately",
privs = {shout=true},
func = function(name, param) func = function(name, param)
local found, _, target, message = param:find("^([^%s]+)%s+(.*)$") local found, _, target, message = param:find("^([^%s]+)%s+(.*)$")
if found == nil then if found == nil then

View File

@ -54,6 +54,7 @@ local boxes = {
-- Delayer definition defaults -- Delayer definition defaults
local def = { local def = {
drawtype = "nodebox", drawtype = "nodebox",
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil,
walkable = true, walkable = true,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
@ -93,7 +94,7 @@ local off_state = {
wield_image = "mesecons_delayer_off_1.png", wield_image = "mesecons_delayer_off_1.png",
groups = off_groups, groups = off_groups,
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher and puncher:get_player_name()) then if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then
return return
end end
@ -134,7 +135,7 @@ local on_state = {
}, },
groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1}, groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1},
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher and puncher:get_player_name()) then if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then
return return
end end

View File

@ -30,7 +30,6 @@ minetest.register_node("mesecons_extrawires:corner_on", {
walkable = false, walkable = false,
sunlight_propagates = true, sunlight_propagates = true,
selection_box = corner_selectionbox, selection_box = corner_selectionbox,
node_box = corner_nodebox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_extrawires:corner_off", drop = "mesecons_extrawires:corner_off",
sounds = default.node_sound_defaults(), sounds = default.node_sound_defaults(),
@ -58,7 +57,6 @@ minetest.register_node("mesecons_extrawires:corner_off", {
walkable = false, walkable = false,
sunlight_propagates = true, sunlight_propagates = true,
selection_box = corner_selectionbox, selection_box = corner_selectionbox,
node_box = corner_nodebox,
groups = {dig_immediate = 3}, groups = {dig_immediate = 3},
sounds = default.node_sound_defaults(), sounds = default.node_sound_defaults(),
mesecons = {conductor = mesecons = {conductor =

View File

@ -18,7 +18,7 @@ minetest.override_item("default:mese", {
-- Copy node definition of powered mese from normal mese -- Copy node definition of powered mese from normal mese
-- and brighten texture tiles to indicate mese is powered -- and brighten texture tiles to indicate mese is powered
local powered_def = mesecon.mergetable(minetest.registered_nodes["default:mese"], { local powered_def = mesecon.merge_tables(minetest.registered_nodes["default:mese"], {
drop = "default:mese", drop = "default:mese",
light_source = 5, light_source = 5,
mesecons = {conductor = { mesecons = {conductor = {

View File

@ -175,9 +175,9 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
minetest.register_craft({ minetest.register_craft({
output = "mesecons_extrawires:vertical_off 3", output = "mesecons_extrawires:vertical_off 3",
recipe = { recipe = {
{"mesecons:wire_00000000_off"}, {"group:mesecon_conductor_craftable"},
{"mesecons:wire_00000000_off"}, {"group:mesecon_conductor_craftable"},
{"mesecons:wire_00000000_off"} {"group:mesecon_conductor_craftable"},
} }
}) })

View File

@ -12,6 +12,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
"jeija_hydro_turbine_turbine_top_bottom_off.png", "jeija_hydro_turbine_turbine_top_bottom_off.png",
"jeija_hydro_turbine_turbine_misc_off.png" "jeija_hydro_turbine_turbine_misc_off.png"
}, },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil,
inventory_image = "jeija_hydro_turbine_inv.png", inventory_image = "jeija_hydro_turbine_inv.png",
is_ground_content = false, is_ground_content = false,
wield_scale = {x=0.75, y=0.75, z=0.75}, wield_scale = {x=0.75, y=0.75, z=0.75},
@ -42,6 +43,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
{ name = "jeija_hydro_turbine_turbine_misc_on.png", { name = "jeija_hydro_turbine_turbine_misc_on.png",
animation = {type = "vertical_frames", aspect_w = 256, aspect_h = 32, length = 0.4} } animation = {type = "vertical_frames", aspect_w = 256, aspect_h = 32, length = 0.4} }
}, },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or nil,
inventory_image = "jeija_hydro_turbine_inv.png", inventory_image = "jeija_hydro_turbine_inv.png",
drop = "mesecons_hydroturbine:hydro_turbine_off 1", drop = "mesecons_hydroturbine:hydro_turbine_off 1",
groups = {dig_immediate=2,not_in_creative_inventory=1}, groups = {dig_immediate=2,not_in_creative_inventory=1},

View File

@ -86,7 +86,7 @@ minetest.register_craft({
output = "mesecons_insulated:insulated_off 3", output = "mesecons_insulated:insulated_off 3",
recipe = { recipe = {
{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, {"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},
{"mesecons:wire_00000000_off", "mesecons:wire_00000000_off", "mesecons:wire_00000000_off"}, {"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"},
{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, {"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},
} }
}) })

View File

@ -9,9 +9,12 @@ local mesecon_lamp_box = {
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125}, wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
} }
local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil
minetest.register_node("mesecons_lamp:lamp_on", { minetest.register_node("mesecons_lamp:lamp_on", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = {"jeija_meselamp_on.png"}, tiles = {"jeija_meselamp_on.png"},
use_texture_alpha = use_texture_alpha,
paramtype = "light", paramtype = "light",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
is_ground_content = false, is_ground_content = false,
@ -36,6 +39,7 @@ minetest.register_node("mesecons_lamp:lamp_on", {
minetest.register_node("mesecons_lamp:lamp_off", { minetest.register_node("mesecons_lamp:lamp_off", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = {"jeija_meselamp_off.png"}, tiles = {"jeija_meselamp_off.png"},
use_texture_alpha = use_texture_alpha,
inventory_image = "jeija_meselamp.png", inventory_image = "jeija_meselamp.png",
wield_image = "jeija_meselamp.png", wield_image = "jeija_meselamp.png",
paramtype = "light", paramtype = "light",

View File

@ -3,7 +3,11 @@ minetest.register_node("mesecons_noteblock:noteblock", {
tiles = {"mesecons_noteblock.png"}, tiles = {"mesecons_noteblock.png"},
is_ground_content = false, is_ground_content = false,
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
on_punch = function(pos, node) -- change sound when punched on_punch = function(pos, node, puncher) -- change sound when punched
if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then
return
end
node.param2 = (node.param2+1)%12 node.param2 = (node.param2+1)%12
mesecon.noteblock_play(pos, node.param2) mesecon.noteblock_play(pos, node.param2)
minetest.set_node(pos, node) minetest.set_node(pos, node)

View File

@ -195,10 +195,11 @@ local function register_wires()
}} }}
local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1,
not_in_creative_inventory = 1} not_in_creative_inventory = 1, not_in_craft_guide = 1}
local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1} local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1}
if nodeid ~= "00000000" then if nodeid ~= "00000000" then
groups_off["not_in_creative_inventory"] = 1 groups_off["not_in_creative_inventory"] = 1
groups_off["not_in_craft_guide"] = 1
end end
mesecon.register_node(":mesecons:wire_"..nodeid, { mesecon.register_node(":mesecons:wire_"..nodeid, {