335 lines
5.7 KiB
Lua
335 lines
5.7 KiB
Lua
|
|
|
|
|
|
local connections = { }
|
|
|
|
|
|
|
|
function connections:new (mod_storage, name)
|
|
local obj = { }
|
|
|
|
setmetatable (obj, self)
|
|
self.__index = self
|
|
|
|
obj.connector_list = { }
|
|
obj.name = tostring (name)
|
|
obj.storage = mod_storage
|
|
|
|
if mod_storage then
|
|
local stored = mod_storage:get_string (obj.name)
|
|
|
|
if stored == "" then
|
|
stored = "{ }"
|
|
end
|
|
|
|
obj.connector_list = minetest.deserialize (stored)
|
|
|
|
if not obj.connector_list then
|
|
obj.connector_list = { }
|
|
end
|
|
end
|
|
|
|
return obj
|
|
end
|
|
|
|
|
|
|
|
function connections:load ()
|
|
if self.storage then
|
|
local stored = self.storage:get_string (self.name)
|
|
|
|
if stored == "" then
|
|
stored = "{ }"
|
|
end
|
|
|
|
self.connector_list = minetest.deserialize (stored)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
function connections:store ()
|
|
if self.storage then
|
|
self.storage:set_string (self.name, minetest.serialize (self.connector_list))
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
function connections:add_node (pos, id)
|
|
self.connector_list[minetest.pos_to_string (pos, 0)] =
|
|
{
|
|
id = (id and tostring (id)) or nil,
|
|
checked = false
|
|
}
|
|
|
|
self:store ()
|
|
end
|
|
|
|
|
|
|
|
function connections:remove_node (pos)
|
|
self.connector_list[minetest.pos_to_string (pos, 0)] = nil
|
|
|
|
self:store ()
|
|
end
|
|
|
|
|
|
|
|
function connections:set_id (pos, id)
|
|
local con = self.connector_list[minetest.pos_to_string (pos, 0)]
|
|
|
|
if con then
|
|
con.id = (id and tostring (id)) or nil
|
|
|
|
self:store ()
|
|
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
|
|
|
|
local function is_connected (self, pos, id, tally, test_coords)
|
|
if not id then
|
|
return nil
|
|
end
|
|
|
|
local con = self.connector_list[minetest.pos_to_string (pos, 0)]
|
|
|
|
if con and not con.checked then
|
|
con.checked = true
|
|
|
|
if con.id == id then
|
|
con.checked = false
|
|
|
|
return pos, tally
|
|
end
|
|
|
|
for i = 1, #test_coords do
|
|
local result, agg = is_connected (self,
|
|
{
|
|
x = pos.x + test_coords[i].x,
|
|
y = pos.y + test_coords[i].y,
|
|
z = pos.z + test_coords[i].z
|
|
},
|
|
id,
|
|
tally,
|
|
test_coords)
|
|
|
|
if result then
|
|
con.checked = false
|
|
|
|
return result, (tally + agg + 1)
|
|
end
|
|
end
|
|
|
|
con.checked = false
|
|
end
|
|
|
|
return nil, 0
|
|
end
|
|
|
|
|
|
|
|
function connections:is_connected (pos, id)
|
|
return is_connected (self,
|
|
pos,
|
|
tostring (id),
|
|
0,
|
|
{
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 },
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 },
|
|
{ x = 0, y = 1, z = 0 },
|
|
{ x = 0, y = -1, z = 0 }
|
|
})
|
|
end
|
|
|
|
|
|
|
|
function connections:is_connected_horizontal (pos, id)
|
|
return is_connected (self,
|
|
pos,
|
|
tostring (id),
|
|
0,
|
|
{
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 },
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 }
|
|
})
|
|
end
|
|
|
|
|
|
|
|
function connections:is_connected_vertical (pos, id)
|
|
return is_connected (self,
|
|
pos,
|
|
tostring (id),
|
|
0,
|
|
{
|
|
{ x = 0, y = 1, z = 0 },
|
|
{ x = 0, y = -1, z = 0 }
|
|
})
|
|
end
|
|
|
|
|
|
|
|
local function get_connected_ids (self, pos, test_coords, list)
|
|
local con = self.connector_list[minetest.pos_to_string (pos, 0)]
|
|
|
|
if con and not con.checked then
|
|
con.checked = true
|
|
|
|
if con.id then
|
|
list[#list + 1] =
|
|
{
|
|
pos = { x = pos.x, y = pos.y, z = pos.z },
|
|
id = con.id
|
|
}
|
|
end
|
|
|
|
for i = 1, #test_coords do
|
|
get_connected_ids (self,
|
|
{
|
|
x = pos.x + test_coords[i].x,
|
|
y = pos.y + test_coords[i].y,
|
|
z = pos.z + test_coords[i].z
|
|
},
|
|
test_coords,
|
|
list)
|
|
end
|
|
|
|
con.checked = false
|
|
end
|
|
|
|
return list
|
|
end
|
|
|
|
|
|
|
|
function connections:get_connected_ids (pos)
|
|
local list = get_connected_ids (self,
|
|
pos,
|
|
{
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 },
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 },
|
|
{ x = 0, y = 1, z = 0 },
|
|
{ x = 0, y = -1, z = 0 }
|
|
},
|
|
{ })
|
|
|
|
for i = #list, 1, -1 do
|
|
for j = 1, i - 1, 1 do
|
|
if list[i].pos.x == list[j].pos.x and
|
|
list[i].pos.y == list[j].pos.y and
|
|
list[i].pos.z == list[j].pos.z then
|
|
|
|
list[i] = nil
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
return list
|
|
end
|
|
|
|
|
|
|
|
function connections:get_connected_ids_horizontal (pos)
|
|
return get_connected_ids (self,
|
|
pos,
|
|
{
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 },
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 }
|
|
},
|
|
{ })
|
|
end
|
|
|
|
|
|
|
|
function connections:get_connected_ids_vertical (pos)
|
|
return get_connected_ids (self,
|
|
pos,
|
|
{
|
|
{ x = 0, y = 1, z = 0 },
|
|
{ x = 0, y = -1, z = 0 }
|
|
},
|
|
{ })
|
|
end
|
|
|
|
|
|
|
|
function connections:get_connected_ids_north_south (pos)
|
|
return get_connected_ids (self,
|
|
pos,
|
|
{
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 }
|
|
},
|
|
{ })
|
|
end
|
|
|
|
|
|
|
|
function connections:get_connected_ids_east_west (pos)
|
|
return get_connected_ids (self,
|
|
pos,
|
|
{
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 }
|
|
},
|
|
{ })
|
|
end
|
|
|
|
|
|
|
|
function connections:get_id_list ()
|
|
local list = { }
|
|
|
|
for spos, data in pairs (self.connector_list) do
|
|
if data.id then
|
|
list[#list + 1] =
|
|
{
|
|
pos = minetest.string_to_pos (spos),
|
|
id = data.id
|
|
}
|
|
end
|
|
end
|
|
|
|
return list
|
|
end
|
|
|
|
|
|
|
|
function connections:get_full_list ()
|
|
local list = { }
|
|
|
|
for spos, data in pairs (self.connector_list) do
|
|
list[#list + 1] =
|
|
{
|
|
pos = minetest.string_to_pos (spos),
|
|
id = data.id
|
|
}
|
|
end
|
|
|
|
return list
|
|
end
|
|
|
|
|
|
|
|
return connections
|
|
|
|
|
|
|
|
--
|