tubelib2/convert.lua

80 lines
1.9 KiB
Lua

--[[
Tube Library 2
==============
Copyright (C) 2017-2018 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
convert.lua
Optional module, only needed to convert legacy tubes into tubelib2 tubes.
This is done by means of a callback function:
dir1, dir2, num = func(pos, name, param2)
]]--
-- for lazy programmers
local M = minetest.get_meta
local Tube = tubelib2.Tube
function Tube:on_convert_tube(convert_tube_clbk)
self.convert_tube_clbk = convert_tube_clbk
end
-- Register legacy tube nodes.
function Tube:add_legacy_node_names(names)
for _,name in ipairs(names) do
self.legacy_node_names[name] = true
end
end
function Tube:convert_tube_line(pos, dir)
local convert_next_tube = function(self, pos, dir)
local npos, node = self:get_node(pos, dir)
if self.legacy_node_names[node.name] then
local dir1, dir2, num
if self.convert_tube_clbk then
dir1, dir2, num = self.convert_tube_clbk(npos, node.name, node.param2)
else
dir1, dir2, num = self:determine_dir1_dir2_and_num_conn(npos)
end
if dir1 then
self.clbk_after_place_tube(self:tube_data_to_table(npos, dir1,
dir2 or tubelib2.Turn180Deg[dir1], num))
if tubelib2.Turn180Deg[dir] == dir1 then
return npos, dir2
else
return npos, dir1
end
end
end
end
local cnt = 0
if not dir then return pos, cnt end
while cnt <= 100000 do
local new_pos, new_dir = convert_next_tube(self, pos, dir)
if not new_dir then break end
pos, dir = new_pos, new_dir
cnt = cnt + 1
end
return pos, dir, cnt
end
function Tube:set_pairing(pos, peer_pos)
M(pos):set_int("tube_dir", self:get_primary_dir(pos))
M(peer_pos):set_int("tube_dir", self:get_primary_dir(peer_pos))
local tube_dir1 = self:store_teleport_data(pos, peer_pos)
local tube_dir2 = self:store_teleport_data(peer_pos, pos)
self:delete_tube_meta_data(pos, tube_dir1)
self:delete_tube_meta_data(peer_pos, tube_dir2)
end