function worldedit.copy(pos1, pos2, axis, amount)\r
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
\r
- local dim = vector.add(vector.subtract(pos2, pos1), 1)\r
- if amount > 0 and amount < dim[axis] then\r
- -- Source and destination region are overlapping and moving needs to\r
- -- happen in reverse.\r
- -- FIXME: I can't be bothered, so just defer to the legacy code for now.\r
- return worldedit.legacy_copy(pos1, pos2, axis, amount)\r
- end\r
+ -- Decide if we need to copy stuff backwards (only applies to metadata)\r
+ local backwards = amount > 0 and amount < (pos2[axis] - pos1[axis] + 1)\r
\r
local off = {x=0, y=0, z=0}\r
off[axis] = amount\r
- return worldedit.copy2(pos1, pos2, off)\r
-end\r
-\r
--- This function is not offical part of the API and may be removed at any time.\r
-function worldedit.legacy_copy(pos1, pos2, axis, amount)\r
- local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-\r
- worldedit.keep_loaded(pos1, pos2)\r
-\r
- local get_node, get_meta, set_node = minetest.get_node,\r
- minetest.get_meta, minetest.set_node\r
- -- Copy things backwards\r
- local pos = {}\r
- pos.x = pos2.x\r
- while pos.x >= pos1.x do\r
- pos.y = pos2.y\r
- while pos.y >= pos1.y do\r
- pos.z = pos2.z\r
- while pos.z >= pos1.z do\r
- local node = get_node(pos) -- Obtain current node\r
- local meta = get_meta(pos):to_table() -- Get meta of current node\r
- local value = pos[axis] -- Store current position\r
- pos[axis] = value + amount -- Move along axis\r
- set_node(pos, node) -- Copy node to new position\r
- get_meta(pos):from_table(meta) -- Set metadata of new node\r
- pos[axis] = value -- Restore old position\r
- pos.z = pos.z - 1\r
- end\r
- pos.y = pos.y - 1\r
- end\r
- pos.x = pos.x - 1\r
- end\r
- return worldedit.volume(pos1, pos2)\r
+ return worldedit.copy2(pos1, pos2, off, backwards)\r
end\r
\r
--- Copies a region by offset vector `off`.\r
-- @param pos1\r
-- @param pos2\r
-- @param off\r
+-- @param meta_backwards (not officially part of API)\r
-- @return The number of nodes copied.\r
-function worldedit.copy2(pos1, pos2, off)\r
+function worldedit.copy2(pos1, pos2, off, meta_backwards)\r
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
\r
local src_manip, src_area = mh.init(pos1, pos2)\r
\r
-- Copy metadata\r
local get_meta = minetest.get_meta\r
+ if meta_backwards then\r
+ for z = dim.z-1, 0, -1 do\r
+ for y = dim.y-1, 0, -1 do\r
+ for x = dim.x-1, 0, -1 do\r
+ local pos = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z}\r
+ local meta = get_meta(pos):to_table()\r
+ pos = vector.add(pos, off)\r
+ get_meta(pos):from_table(meta)\r
+ end\r
+ end\r
+ end\r
+ else\r
for z = 0, dim.z-1 do\r
for y = 0, dim.y-1 do\r
for x = 0, dim.x-1 do\r
end\r
end\r
end\r
+ end\r
\r
return worldedit.volume(pos1, pos2)\r
end\r