digiline_routing/multiblock.lua

103 lines
3.1 KiB
Lua
Raw Permalink Normal View History

2017-01-08 16:03:29 -08:00
-- © 2017 numberZero
-- License: GNU Lesser General Public License, version 2 (or any later version)
digiline_routing.multiblock = {}
digiline_routing.multiblock.build2 = function(node1, node2, itemstack, placer, pointed_thing)
local under = pointed_thing.under
local above = pointed_thing.above
2017-01-08 16:03:29 -08:00
local pos
if minetest.registered_items[minetest.get_node(under).name].buildable_to then
pos = under
elseif minetest.registered_items[minetest.get_node(above).name].buildable_to then
pos = above
2017-01-08 16:03:29 -08:00
else
return itemstack, false
2017-01-08 16:03:29 -08:00
end
2018-11-29 04:24:08 -08:00
if digiline_routing.is_protected(pos, placer) then
2017-01-08 16:03:29 -08:00
return itemstack, false
end
local dir = minetest.dir_to_facedir(placer:get_look_dir())
local botpos = vector.add(pos, minetest.facedir_to_dir(dir))
2018-11-29 04:24:08 -08:00
if digiline_routing.is_protected(botpos, placer) then
2017-01-08 16:03:29 -08:00
return itemstack, false
end
if not minetest.registered_nodes[minetest.get_node(botpos).name].buildable_to then
return itemstack, false
end
minetest.set_node(pos, {name = node1, param2 = dir})
minetest.set_node(botpos, {name = node2, param2 = dir})
2017-01-11 13:51:31 -08:00
digiline:update_autoconnect(pos)
digiline:update_autoconnect(botpos)
2017-01-08 16:03:29 -08:00
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack, true
end
2017-01-11 13:51:47 -08:00
digiline_routing.multiblock.rotate2 = function(pos, node, user, mode, new_param2)
local dir = minetest.facedir_to_dir(node.param2)
local p = vector.add(pos, dir)
local node2 = minetest.get_node_or_nil(p)
2018-11-29 04:24:08 -08:00
if not node2 or node.param2 ~= node2.param2 then
2017-01-11 13:51:47 -08:00
return false
end
2018-11-29 04:24:08 -08:00
-- protection at `pos` is checked by the screwdriver
if digiline_routing.is_protected(p, user) then
2017-01-11 13:51:47 -08:00
return false
end
if mode ~= screwdriver.ROTATE_FACE then
return false
end
local newp = vector.add(pos, minetest.facedir_to_dir(new_param2))
local node3 = minetest.get_node_or_nil(newp)
local node_def = node3 and minetest.registered_nodes[node3.name]
if not node_def or not node_def.buildable_to then
return false
end
2018-11-29 04:24:08 -08:00
if digiline_routing.is_protected(newp, user) then
2017-01-11 13:51:47 -08:00
return false
end
node.param2 = new_param2
minetest.set_node(p, {name = "air"})
minetest.set_node(pos, node)
minetest.set_node(newp, {name = node2.name, param2 = new_param2})
digiline:update_autoconnect(p)
digiline:update_autoconnect(pos)
digiline:update_autoconnect(newp)
return true
end
digiline_routing.multiblock.rotate2b = function(pos, node, user, mode, new_param2)
minetest.log("action", ("%s tries to rotate invisible node at %s"):format(user:get_player_name(), minetest.pos_to_string(pos)))
return false
end
2017-01-08 16:03:29 -08:00
digiline_routing.multiblock.dig2 = function(pos, node)
local dir = minetest.facedir_to_dir(node.param2)
local tail = vector.add(pos, dir)
2018-11-29 04:29:57 -08:00
minetest.remove_node(tail)
digiline:update_autoconnect(tail)
2017-01-08 16:03:29 -08:00
end
2018-11-29 04:29:57 -08:00
digiline_routing.multiblock.dig2b = function(pos, node, digger)
2017-01-08 16:03:29 -08:00
local dir = minetest.facedir_to_dir(node.param2)
local head = vector.subtract(pos, dir)
2018-11-29 04:29:57 -08:00
local node2 = minetest.get_node_or_nil(head)
if not node2 then -- master unloaded, lets not break the structure
return
end
if node2.param2 == node.param2 then
minetest.node_dig(head, node2, digger)
else -- broken multinode structure, just remove it
minetest.remove_node(pos)
2017-01-11 13:51:31 -08:00
end
2017-01-08 16:03:29 -08:00
end