Add a tool to insert network metadata into nodes
This also involves modifications of the network update routines as the modification of metadata does not trigger the callbacks used for this purpose. Instead the tool manually forces updates to networks around the node. Currently we cannot detect the digging of a node with specific metadata associated, thus we currently need to trigger network updates for ALL nodes digged which can incur much lag for heavy recalculations.
This commit is contained in:
parent
00024a4cde
commit
f161e121fd
@ -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,7 +86,7 @@ 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
|
||||
if (net_passive ~= 0 or ntrigontrig) then
|
||||
net_build(nodepos, pos)
|
||||
end
|
||||
end
|
||||
@ -102,17 +102,22 @@ 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
|
||||
|
||||
|
||||
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
|
||||
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(itemstack:get_name(), "sparktech_net_trigger") == 1 ) then
|
||||
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)
|
||||
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 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}
|
||||
@ -121,13 +126,14 @@ minetest.register_on_dignode(function(pos, oldnode, digger)
|
||||
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)
|
||||
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
|
||||
|
33
sparkwrench/cableinserter.lua
Normal file
33
sparkwrench/cableinserter.lua
Normal file
@ -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", ""},
|
||||
}
|
||||
})
|
Loading…
x
Reference in New Issue
Block a user