Separated out valid sides into a new table, provided additional functions for valid sides

This commit is contained in:
Cam B 2021-01-23 17:03:20 +00:00
parent f9e4856bb9
commit e27451cd1d
2 changed files with 64 additions and 24 deletions

@ -140,7 +140,7 @@ end
function Tube:is_secondary_node(pos, dir) function Tube:is_secondary_node(pos, dir)
local npos = vector.add(pos, Dir6dToVector[dir or 0]) local npos = vector.add(pos, Dir6dToVector[dir or 0])
local node = self:get_node_lvm(npos) local node = self:get_node_lvm(npos)
return self.secondary_node_names[node.name] ~= nil return self.secondary_node_names[node.name]
end end
-- Check if node at given position is a special node -- Check if node at given position is a special node
@ -337,9 +337,7 @@ function Tube:add_tube_dir(pos, dir)
local d1, d2, num = self:decode_param2(npos, param2) local d1, d2, num = self:decode_param2(npos, param2)
if not num then return end if not num then return end
-- if invalid face, do nothing -- if invalid face, do nothing
local node = self:get_node_lvm(pos) if self:is_valid_dir_pos(pos, dir) == false then return end
local valid = self:is_valid_dir(node, dir)
if valid == false then return end
-- not already connected to the new tube? -- not already connected to the new tube?
dir = Turn180Deg[dir] dir = Turn180Deg[dir]
if d1 ~= dir and dir ~= d2 then if d1 ~= dir and dir ~= d2 then
@ -387,8 +385,7 @@ end
function Tube:get_next_teleport_node(pos, dir) function Tube:get_next_teleport_node(pos, dir)
if pos then if pos then
local npos = vector.add(pos, Dir6dToVector[dir or 0]) local npos = vector.add(pos, Dir6dToVector[dir or 0])
local node = self:get_node_lvm(npos) if self:is_valid_dir_pos(npos, Turn180Deg[dir]) == false then
if self:is_valid_dir(node, Turn180Deg[dir]) == false then
return return
end end
local meta = M(npos) local meta = M(npos)

@ -198,7 +198,8 @@ function Tube:new(attr)
dirs_to_check = attr.dirs_to_check or {1,2,3,4,5,6}, dirs_to_check = attr.dirs_to_check or {1,2,3,4,5,6},
max_tube_length = attr.max_tube_length or 1000, max_tube_length = attr.max_tube_length or 1000,
primary_node_names = Tbl(attr.primary_node_names or {}), primary_node_names = Tbl(attr.primary_node_names or {}),
secondary_node_names = {}, secondary_node_names = Tbl(attr.secondary_node_names or {}),
valid_node_contact_sides = {},
show_infotext = attr.show_infotext or false, show_infotext = attr.show_infotext or false,
force_to_use_tubes = attr.force_to_use_tubes or false, force_to_use_tubes = attr.force_to_use_tubes or false,
clbk_after_place_tube = attr.after_place_tube, clbk_after_place_tube = attr.after_place_tube,
@ -210,41 +211,76 @@ function Tube:new(attr)
o.valid_dirs = Tbl(o.dirs_to_check) o.valid_dirs = Tbl(o.dirs_to_check)
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
if attr.secondary_node_names then if attr.valid_node_contact_sides then
o:add_secondary_node_names(attr.secondary_node_names) o:set_valid_sides_multiple(attr.valid_node_contact_sides)
end end
return o return o
end end
-- Register (foreign) tubelib compatible nodes. -- Register (foreign) tubelib compatible nodes.
local valid_sides_default = {B=true, R=true, F=true, L=true, D=true, U=true} function Tube:add_secondary_node_names(names)
local function complete_valid_sides(valid_sides) for _,name in ipairs(names) do
self.secondary_node_names[name] = true
end
end
-- Defaults for valid sides configuration
local function invert_booleans(tab)
local inversion = {}
for key, value in pairs(tab) do
inversion[key] = not value
end
return inversion
end
local valid_sides_default_true = {B=true, R=true, F=true, L=true, D=true, U=true}
local valid_sides_default_false = invert_booleans(valid_sides_default_true)
local function complete_valid_sides(valid_sides, existing_defaults)
local valid_sides_complete = valid_sides or {} local valid_sides_complete = valid_sides or {}
for side, defaultValue in pairs(valid_sides_default) do for side, default_value in pairs(existing_defaults) do
if valid_sides_complete[side] == nil then if valid_sides_complete[side] == nil then
valid_sides_complete[side] = defaultValue valid_sides_complete[side] = default_value
end end
end end
return valid_sides_complete return valid_sides_complete
end end
function Tube:add_secondary_node_names(names, valid_sides) -- Set sides which are valid
local valid_sides_complete = complete_valid_sides(valid_sides) -- with a table of name = valid_sides pairs
for _,name in ipairs(names) do function Tube:set_valid_sides_multiple(names)
self.secondary_node_names[name] = valid_sides_complete for name, valid_sides in pairs(names) do
self:set_valid_sides(name, valid_sides)
end end
for name,valid_sides in pairs(names) do end
if type(name) == 'string' then
local valid_sides_complete = complete_valid_sides(valid_sides) -- Set sides which are invalid
self.secondary_node_names[name] = valid_sides_complete -- with a table of name = valid_sides pairs
end function Tube:set_invalid_sides_multiple(names)
for name, invalid_sides in pairs(names) do
self:set_invalid_sides(name, invalid_sides)
end end
end end
-- Set sides which are valid
-- will assume all sides not given are invalid
-- Only sets new sides, existing sides will remain
function Tube:set_valid_sides(name, valid_sides)
local existing_defaults = self.valid_node_contact_sides[name] or valid_sides_default_false
self.valid_node_contact_sides[name] = complete_valid_sides(Tbl(valid_sides), existing_defaults)
end
-- Set sides which are invalid
-- will assume all sides not given are valid
-- Only sets new sides, existing sides will remain
function Tube:set_invalid_sides(name, invalid_sides)
local existing_defaults = self.valid_node_contact_sides[name] or valid_sides_default_true
self.valid_node_contact_sides[name] = complete_valid_sides(invert_booleans(Tbl(invalid_sides)), existing_defaults)
end
-- Checks the list of secondary nodes to see if a -- Checks the list of secondary nodes to see if a
-- given side can be connected to -- given side can be connected to
function Tube:is_valid_side(name, side) function Tube:is_valid_side(name, side)
local valid_sides = self.secondary_node_names[name] local valid_sides = self.valid_node_contact_sides[name]
if valid_sides then if valid_sides then
return valid_sides[side] or false return valid_sides[side] or false
end end
@ -253,12 +289,19 @@ end
-- Checks if a particular node can be connected to -- Checks if a particular node can be connected to
-- from a particular direction, taking into account orientation -- from a particular direction, taking into account orientation
function Tube:is_valid_dir(node, dir) function Tube:is_valid_dir(node, dir)
if node and dir ~= nil and self.secondary_node_names[node.name] then if node and dir ~= nil and self.valid_node_contact_sides[node.name] then
local side = tubelib2.dir_to_side(dir, node.param2) local side = tubelib2.dir_to_side(dir, node.param2)
return self:is_valid_side(node.name, side) return self:is_valid_side(node.name, side)
end end
end end
-- Checks if a node at a particular position can be connected to
-- from a particular direction, taking into account orientation
function Tube:is_valid_dir_pos(pos, dir)
local node = self:get_node_lvm(pos)
return self:is_valid_dir(node, dir)
end
-- Register further nodes, which should be updated after -- Register further nodes, which should be updated after
-- a node/tube is placed/dug -- a node/tube is placed/dug
function Tube:add_special_node_names(names) function Tube:add_special_node_names(names)