From 175ac211ca06af7eec9dfbc62e11e1d6eb448c03 Mon Sep 17 00:00:00 2001 From: Uberi Date: Sun, 6 Jul 2014 19:42:02 -0400 Subject: Documentation for `//stack2`, code style fixes, add author section to README. --- worldedit/manipulations.lua | 234 +++++++++++++++++++++++--------------------- 1 file changed, 121 insertions(+), 113 deletions(-) (limited to 'worldedit') diff --git a/worldedit/manipulations.lua b/worldedit/manipulations.lua index 0a37e16..80541fc 100644 --- a/worldedit/manipulations.lua +++ b/worldedit/manipulations.lua @@ -48,8 +48,16 @@ worldedit.set = function(pos1, pos2, nodenames) for i,v in ipairs(nodenames) do node_ids[i] = minetest.get_content_id(nodenames[i]) end - for i in area:iterp(pos1, pos2) do - nodes[i] = node_ids[math.random(#node_ids)] + if #node_ids == 1 then --only one type of node + local id = node_ids[1] + for i in area:iterp(pos1, pos2) do + nodes[i] = node_ids[id] + end + else --fill randomly with all types of specified nodes + local id_count, rand = #node_ids, math.random + for i in area:iterp(pos1, pos2) do + nodes[i] = node_ids[rand(id_count)] + end end --update map nodes @@ -173,126 +181,126 @@ worldedit.copy = function(pos1, pos2, axis, amount) --wip: replace the old versi end worldedit.copy2 = function(pos1, pos2, direction, volume) - -- the overlap shouldn't matter as long as we - -- 1) start at the furthest separated corner - -- 2) complete an edge before moving inward, either edge works - -- 3) complete a face before moving inward, similarly - -- - -- to do this I - -- 1) find the furthest destination in the direction, of each axis - -- 2) call those the furthest separated corner - -- 3) make sure to iterate inward from there - -- 4) nested loop to make sure complete edge, complete face, then complete cube. - + -- the overlap shouldn't matter as long as we + -- 1) start at the furthest separated corner + -- 2) complete an edge before moving inward, either edge works + -- 3) complete a face before moving inward, similarly + -- + -- to do this I + -- 1) find the furthest destination in the direction, of each axis + -- 2) call those the furthest separated corner + -- 3) make sure to iterate inward from there + -- 4) nested loop to make sure complete edge, complete face, then complete cube. + local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node - local somemeta = get_meta(pos1) -- hax lol - local to_table = somemeta.to_table - local from_table = somemeta.from_table - somemeta = nil + local somemeta = get_meta(pos1) -- hax lol + local to_table = somemeta.to_table + local from_table = somemeta.from_table + somemeta = nil local pos1, pos2 = worldedit.sort_pos(pos1, pos2) local manip = minetest.get_voxel_manip() manip:read_from_map(pos1, pos2) - local sx,sy,sz -- direction sign - local ix,iy,iz -- initial destination - local ex,ey,ez -- final destination - local originalx,originaly,originalz -- source - -- vim -> :'<,'>s/\<\([ioes]\?\)x\>/\1y/g - if direction.x > 0 then - originalx = pos2.x - ix = originalx + direction.x - ex = pos1.x + direction.x - sx = -1 - elseif direction.x < 0 then - originalx = pos1.x - ix = originalx + direction.x - ex = pos2.x + direction.x - sx = 1 - else - originalx = pos1.x - ix = originalx -- whatever - ex = pos2.x - sx = 1 - end + local sx, sy, sz -- direction sign + local ix, iy, iz -- initial destination + local ex, ey, ez -- final destination + local originalx, originaly, originalz -- source + -- vim -> :'<,'>s/\<\([ioes]\?\)x\>/\1y/g + if direction.x > 0 then + originalx = pos2.x + ix = originalx + direction.x + ex = pos1.x + direction.x + sx = -1 + elseif direction.x < 0 then + originalx = pos1.x + ix = originalx + direction.x + ex = pos2.x + direction.x + sx = 1 + else + originalx = pos1.x + ix = originalx -- whatever + ex = pos2.x + sx = 1 + end - if direction.y > 0 then - originaly = pos2.y - iy = originaly + direction.y - ey = pos1.y + direction.y - sy = -1 - elseif direction.y < 0 then - originaly = pos1.y - iy = originaly + direction.y - ey = pos2.y + direction.y - sy = 1 - else - originaly = pos1.y - iy = originaly -- whatever - ey = pos2.y - sy = 1 - end + if direction.y > 0 then + originaly = pos2.y + iy = originaly + direction.y + ey = pos1.y + direction.y + sy = -1 + elseif direction.y < 0 then + originaly = pos1.y + iy = originaly + direction.y + ey = pos2.y + direction.y + sy = 1 + else + originaly = pos1.y + iy = originaly -- whatever + ey = pos2.y + sy = 1 + end - if direction.z > 0 then - originalz = pos2.z - iz = originalz + direction.z - ez = pos1.z + direction.z - sz = -1 - elseif direction.z < 0 then - originalz = pos1.z - iz = originalz + direction.z - ez = pos2.z + direction.z - sz = 1 - else - originalz = pos1.z - iz = originalz -- whatever - ez = pos2.z - sz = 1 - end - -- print('copy',originalx,ix,ex,sx,originaly,iy,ey,sy,originalz,iz,ez,sz) - - local ox,oy,oz - - ox = originalx - for x = ix,ex,sx do - oy = originaly - for y = iy,ey,sy do - oz = originalz - for z = iz,ez,sz do - -- reusing pos1/pos2 as source/dest here - pos1.x = ox; pos1.y = oy; pos1.z = oz - pos2.x = x; pos2.y = y; pos2.z = z - local node = get_node(pos1) + if direction.z > 0 then + originalz = pos2.z + iz = originalz + direction.z + ez = pos1.z + direction.z + sz = -1 + elseif direction.z < 0 then + originalz = pos1.z + iz = originalz + direction.z + ez = pos2.z + direction.z + sz = 1 + else + originalz = pos1.z + iz = originalz -- whatever + ez = pos2.z + sz = 1 + end + -- print('copy',originalx,ix,ex,sx,originaly,iy,ey,sy,originalz,iz,ez,sz) + + local ox,oy,oz + + ox = originalx + for x = ix, ex, sx do + oy = originaly + for y = iy, ey, sy do + oz = originalz + for z = iz, ez, sz do + -- reusing pos1/pos2 as source/dest here + pos1.x, pos1.y, pos1.z = ox, oy, oz + pos2.x, pos2.y, pos2.z = x, y, z + local node = get_node(pos1) local meta = to_table(get_meta(pos1)) --get meta of current node - add_node(pos2,node) - from_table(get_meta(pos2),meta) - oz = oz + sz - end - oy = oy + sy - end - ox = ox + sx - end -end - -worldedit.stack2 = function(pos1, pos2, direction, amount, finished) - local i = 0 - local translated = {x=0,y=0,z=0} - local function nextone() - if i <= amount then - i = i + 1 - translated.x = translated.x + direction.x - translated.y = translated.y + direction.y - translated.z = translated.z + direction.z - worldedit.copy2(pos1,pos2,translated,volume) - minetest.after(0,nextone) - else - if finished then - finished() - end - end - end - nextone() - return nil + add_node(pos2,node) + from_table(get_meta(pos2),meta) + oz = oz + sz + end + oy = oy + sy + end + ox = ox + sx + end +end + +worldedit.stack2 = function(pos1, pos2, direction, amount, finished) + local i = 0 + local translated = {x=0,y=0,z=0} + local function nextone() + if i <= amount then + i = i + 1 + translated.x = translated.x + direction.x + translated.y = translated.y + direction.y + translated.z = translated.z + direction.z + worldedit.copy2(pos1, pos2, translated, volume) + minetest.after(0, nextone) + else + if finished then + finished() + end + end + end + nextone() + return nil end --copies the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes, returning the number of nodes copied -- cgit v1.2.3