94 lines
2.0 KiB
Lua
94 lines
2.0 KiB
Lua
local function numk(tbl)
|
|
local i = 0
|
|
for a, b in pairs(tbl) do
|
|
i = i + 1
|
|
end
|
|
return i
|
|
end
|
|
|
|
mg_villages.import_scm = function(scm, we_origin)
|
|
local c_ignore = minetest.get_content_id("ignore")
|
|
|
|
-- this table will contain the nodes read
|
|
local nodes = {}
|
|
|
|
-- check if it is a worldedit file
|
|
-- (no idea why reading that is done in such a complicated way; a simple deserialize and iteration over all nodes ought to do as well)
|
|
local f, err = io.open( scm..".we", "r")
|
|
if not f then
|
|
f, err = io.open( scm..".wem", "r")
|
|
if not f then
|
|
error("Could not open schematic '" .. scm .. ".we': " .. err)
|
|
return {};
|
|
end
|
|
end
|
|
|
|
local value = f:read("*a")
|
|
f:close()
|
|
|
|
local version = worldedit.read_header(value)
|
|
-- some very old worldedit schematics may have an internal offset and not start at 0,0,0
|
|
if( version==3 or version=="3") then
|
|
originx = 0;
|
|
originy = 0;
|
|
originz = 0;
|
|
if( we_origin and #we_origin == 3 ) then
|
|
originx = we_origin[1];
|
|
originy = we_origin[2];
|
|
originz = we_origin[3];
|
|
end
|
|
end
|
|
|
|
local nodes = worldedit.load_schematic(value)
|
|
|
|
scm = {}
|
|
local maxx, maxy, maxz = -1, -1, -1
|
|
for i = 1, #nodes do
|
|
local ent = nodes[i]
|
|
ent.x = ent.x + 1
|
|
ent.y = ent.y + 1
|
|
ent.z = ent.z + 1
|
|
if ent.x > maxx then
|
|
maxx = ent.x
|
|
end
|
|
if ent.y > maxy then
|
|
maxy = ent.y
|
|
end
|
|
if ent.z > maxz then
|
|
maxz = ent.z
|
|
end
|
|
if scm[ent.y] == nil then
|
|
scm[ent.y] = {}
|
|
end
|
|
if scm[ent.y][ent.x] == nil then
|
|
scm[ent.y][ent.x] = {}
|
|
end
|
|
if ent.param2 == nil then
|
|
ent.param2 = 0
|
|
end
|
|
if ent.meta == nil then
|
|
ent.meta = {fields={}, inventory={}}
|
|
end
|
|
|
|
scm[ent.y][ent.x][ent.z] = mg_villages.decode_one_node( ent.name, ent.param2, ent.meta );
|
|
|
|
end
|
|
local c_air = minetest.get_content_id("air")
|
|
for x = 1, maxx do
|
|
for y = 1, maxy do
|
|
for z = 1, maxz do
|
|
if scm[y] == nil then
|
|
scm[y] = {}
|
|
end
|
|
if scm[y][x] == nil then
|
|
scm[y][x] = {}
|
|
end
|
|
if scm[y][x][z] == nil then
|
|
scm[y][x][z] = c_air
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return scm
|
|
end
|