diff options
Diffstat (limited to 'worldedit')
| -rw-r--r-- | worldedit/manipulations.lua | 234 | 
1 files changed, 121 insertions, 113 deletions
| 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
 | 
