diff --git a/sparkcore/energy.lua b/sparkcore/energy.lua index ff43b48..eceb6dd 100644 --- a/sparkcore/energy.lua +++ b/sparkcore/energy.lua @@ -65,8 +65,8 @@ local function net_build(pos, callerpos, master_arg) local node = minetest.get_node(nodepos) local meta = minetest.get_meta(nodepos) local net_passive = minetest.get_item_group(node.name,"sparktech_net_passive") - if (not net_passive and meta:get_int("sparktech_net_passive") == 1) then - net_passive = true + if (net_passive == 0 and meta:get_int("sparktech_net_passive") == 1) then + net_passive = 1 end local net_trigger = minetest.get_item_group(node.name,"sparktech_net_trigger") -- net passives are followed along to create the network (aka cables) but they do not get power, @@ -86,8 +86,8 @@ local function net_build(pos, callerpos, master_arg) -- Now the node shouldn’t be processed by the net_build anymore processed[#processed + 1] = nodepos end - if (net_passive == 1 or ntrigontrig) then - net_build(nodepos, pos) + if (net_passive ~= 0 or ntrigontrig) then + net_build(nodepos, pos) end end end @@ -102,32 +102,38 @@ local function net_build(pos, callerpos, master_arg) return -- at this point all nodes have been processed, so we can return to the calling node end +local function add_node(pos, newnode) + local meta = minetest.get_meta(pos) + if (minetest.get_item_group(newnode.name, "sparktech_net_passive") == 1 or meta:get_int("sparktech_net_passive") ~= 0) then + net_build(pos) -- only call this with none if the node really is not a trigger, otherwise the net will be build from it but it will not be contained + elseif (minetest.get_item_group(newnode.name, "sparktech_net_trigger") == 1 ) then + meta:set_string("net_master", nil) + net_build(pos, nil, pos) + end +end minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - if (minetest.get_item_group(itemstack:get_name(), "sparktech_net_passive") == 1 ) then - net_build(pos) -- only call this with none if the node really is not a trigger, otherwise the net will be build from it but it will not be contained - elseif (minetest.get_item_group(itemstack:get_name(), "sparktech_net_trigger") == 1 ) then - net_build(pos, nil, pos) - end + add_node(pos, newnode) end) -minetest.register_on_dignode(function(pos, oldnode, digger) - if ((minetest.get_item_group(oldnode.name, "sparktech_net_passive") == 1) or (minetest.get_item_group(oldnode.name, "sparktech_net_trigger") == 1)) then - local top = {x = pos.x, y = pos.y + 1, z = pos.z} - local bottom = {x = pos.x, y = pos.y - 1, z = pos.z} - local left = {x = pos.x - 1, y = pos.y, z = pos.z} - local right = {x = pos.x + 1, y = pos.y, z = pos.z} - local front = {x = pos.x, y = pos.y, z = pos.z - 1} - local back = {x = pos.x, y = pos.y, z = pos.z + 1} - for sidename, nodepos in pairs({top=top, bottom=bottom, left=left, right=right, front=front, back=back}) do - local target_node = minetest.get_node(nodepos) - local meta = minetest.get_meta(nodepos) - if (minetest.get_item_group(target_node.name, "sparktech_net_passive") == 1) then - net_build(nodepos) - elseif (minetest.get_item_group(target_node.name, "sparktech_net_trigger") == 1) then - meta:set_string("net_master", nil) - net_build(nodepos, nil, nodepos) - end - end +local function remove_node(pos, oldnode, force) + if (force or (minetest.get_item_group(oldnode.name, "sparktech_net_passive") == 1) or (minetest.get_item_group(oldnode.name, "sparktech_net_trigger") == 1)) then + local top = {x = pos.x, y = pos.y + 1, z = pos.z} + local bottom = {x = pos.x, y = pos.y - 1, z = pos.z} + local left = {x = pos.x - 1, y = pos.y, z = pos.z} + local right = {x = pos.x + 1, y = pos.y, z = pos.z} + local front = {x = pos.x, y = pos.y, z = pos.z - 1} + local back = {x = pos.x, y = pos.y, z = pos.z + 1} + for sidename, nodepos in pairs({top=top, bottom=bottom, left=left, right=right, front=front, back=back}) do + local target_node = minetest.get_node(nodepos) + add_node(nodepos, target_node) + end end +end + +minetest.register_on_dignode(function(pos, oldnode, digger) + remove_node(pos, oldnode, true) -- FIXME Get rid of this! Somehow detect if a dynamic net_passive node is destroyed instead of updating speculatively end) + +sparktech.add_node_to_net = add_node +sparktech.remove_node_from_net = remove_node diff --git a/sparkwrench/cableinserter.lua b/sparkwrench/cableinserter.lua new file mode 100644 index 0000000..5b57971 --- /dev/null +++ b/sparkwrench/cableinserter.lua @@ -0,0 +1,33 @@ +local NAME = minetest.get_current_modname() + +minetest.register_tool(NAME .. ":cableinserter", { + description = "Cable Inserter", + inventory_image = "multimeter.png", + stack_max = 1, + on_place = function(itemstack, placer, pointed_thing) + -- TODO Check that nodes does not already interact with the grid + if pointed_thing["type"] == "node" then + local node = minetest.get_node(pointed_thing.under) + local meta = minetest.get_meta(pointed_thing.under) + if meta:get_int("sparktech_net_passive") == 1 then + meta:set_int("sparktech_net_passive", 0) + sparktech.remove_node_from_net(pointed_thing.under, node, true) + minetest.debug("Removed cable") + else + meta:set_int("sparktech_net_passive", 1) + sparktech.add_node_to_net(pointed_thing.under, node) + minetest.debug("Added cable") + end + end + return itemstack + end +}) + +minetest.register_craft({ + output = NAME .. ":cableinserter", + recipe = { + { "group:steelplate", "", "" }, + { "", "group:steelplate", "" }, + { "", "group:steelplate", ""}, + } +})