diff options
| author | Anthony <azhang9@gmail.com> | 2012-08-30 21:38:00 -0700 | 
|---|---|---|
| committer | Anthony <azhang9@gmail.com> | 2012-08-30 21:38:00 -0700 | 
| commit | a25a2a1fb0c198ca427a4da6ba53fd51b344ee54 (patch) | |
| tree | 422533bd44a4d533ef97afeb2cb3f967b4c4853d | |
| parent | 340416c789fc8a2e32ae39c28b0ea6eea403bb4d (diff) | |
| parent | 6eb08edd3005518f06c6c43f324399d8bed6a830 (diff) | |
Merge pull request #5 from khonkhortisan/master
Understands meta!
| -rw-r--r-- | README.md | 9 | ||||
| -rw-r--r-- | functions.lua | 59 | ||||
| -rw-r--r-- | init.lua | 13 | 
3 files changed, 56 insertions, 25 deletions
| @@ -165,11 +165,12 @@ Flip the current WorldEdit region along the x/y/z/? axis.  ### //rotate -Rotate the current WorldEdit region around the y axis by angle <angle> (90 degree increment). +Rotate the current WorldEdit region around the axis <axis> by angle <angle> (90 degree increment). -    //rotate 90 -    //rotate 180 -    //rotate 270 +    //rotate x 90 +    //rotate y 180 +    //rotate z 270 +    //rotate ? -90  ### //dig diff --git a/functions.lua b/functions.lua index f22e15d..b2f6443 100644 --- a/functions.lua +++ b/functions.lua @@ -268,9 +268,12 @@ worldedit.copy = function(pos1, pos2, axis, amount)  				pos.z = pos1.z
  				while pos.z <= pos2.z do
  					local node = env:get_node(pos)
 +					local meta1 = env:get_meta(pos):to_table()
  					local value = pos[axis]
  					pos[axis] = value + amount
  					env:add_node(pos, node)
 +					local meta2 = env:get_meta(pos)
 +					meta2:from_table(meta1)
  					pos[axis] = value
  					pos.z = pos.z + 1
  				end
 @@ -286,9 +289,12 @@ worldedit.copy = function(pos1, pos2, axis, amount)  				pos.z = pos2.z
  				while pos.z >= pos1.z do
  					local node = minetest.env:get_node(pos)
 +					local meta1 = env:get_meta(pos):to_table()
  					local value = pos[axis]
  					pos[axis] = value + amount
  					minetest.env:add_node(pos, node)
 +					local meta2 = env:get_meta(pos)
 +					meta2:from_table(meta1)
  					pos[axis] = value
  					pos.z = pos.z - 1
  				end
 @@ -313,10 +319,13 @@ worldedit.move = function(pos1, pos2, axis, amount)  				pos.z = pos1.z
  				while pos.z <= pos2.z do
  					local node = env:get_node(pos)
 +					local meta1 = env:get_meta(pos):to_table()
  					env:remove_node(pos)
  					local value = pos[axis]
  					pos[axis] = value + amount
  					env:add_node(pos, node)
 +					local meta2 = env:get_meta(pos)
 +					meta2:from_table(meta1)
  					pos[axis] = value
  					pos.z = pos.z + 1
  				end
 @@ -331,11 +340,14 @@ worldedit.move = function(pos1, pos2, axis, amount)  			while pos.y >= pos1.y do
  				pos.z = pos2.z
  				while pos.z >= pos1.z do
 -					local node = minetest.env:get_node(pos)
 +					local node = env:get_node(pos)
 +					local meta1 = env:get_meta(pos):to_table()
  					env:remove_node(pos)
  					local value = pos[axis]
  					pos[axis] = value + amount
 -					minetest.env:add_node(pos, node)
 +					env:add_node(pos, node)
 +					local meta2 = env:get_meta(pos)
 +					meta2:from_table(meta1)
  					pos[axis] = value
  					pos.z = pos.z - 1
  				end
 @@ -378,12 +390,18 @@ worldedit.transpose = function(pos1, pos2, axis1, axis2)  				local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2]
  				if extent1 < extent2 then
  					local node1 = env:get_node(pos)
 +					local meta1a = env:get_meta(pos):to_table()
  					local value1, value2 = pos[axis1], pos[axis2]
 -					pos[axis1], pos[axis2] = pos1[axis1] + extent1, pos1[axis2] + extent2
 +					pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1
  					local node2 = env:get_node(pos)
 +					local meta2a = env:get_meta(pos):to_table()
  					env:add_node(pos, node1)
 -					pos[axis1], pos[axis2] = value1, value2
 +					local meta1b = env:get_meta(pos)
 +					meta1b:from_table(meta1a)
 +					pos[axis1], pos[axis2] = pos1[axis1] + extent1, pos1[axis2] + extent2
  					env:add_node(pos, node2)
 +					local meta2b = env:get_meta(pos)
 +					meta2b:from_table(meta2a)
  				end
  				pos.z = pos.z + 1
  			end
 @@ -408,12 +426,18 @@ worldedit.flip = function(pos1, pos2, axis)  			pos.z = pos1.z
  			while pos.z <= pos2.z do
  				local node1 = env:get_node(pos)
 +				local meta1a = env:get_meta(pos):to_table()
  				local value = pos[axis]
  				pos[axis] = start - value
  				local node2 = env:get_node(pos)
 +				local meta2a = env:get_meta(pos):to_table()
  				env:add_node(pos, node1)
 +				local meta1b = env:get_meta(pos)
 +				meta1b:from_table(meta1a)
  				pos[axis] = value
  				env:add_node(pos, node2)
 +				local meta2b = env:get_meta(pos)
 +				meta2b:from_table(meta2a)
  				pos.z = pos.z + 1
  			end
  			pos.y = pos.y + 1
 @@ -423,10 +447,17 @@ worldedit.flip = function(pos1, pos2, axis)  	return worldedit.volume(pos1, pos2)
  end
 ---rotates a region defined by the positions `pos1` and `pos2` by `angle` degrees clockwise around the y axis (supporting 90 degree increments only), returning the number of nodes rotated
 -worldedit.rotate = function(pos1, pos2, angle)
 +--rotates a region defined by the positions `pos1` and `pos2` by `angle` degrees clockwise (if you are looking in the negative direction) around the `axis` (supporting 90 degree increments only), returning the number of nodes rotated
 +worldedit.rotate = function(pos1, pos2, axis, angle)
  	local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
 +	if axis == 'x' then
 +		axes = {'z', 'y'}
 +	elseif axis == 'y' then
 +		axes = {'x', 'z'}
 +	else--if axis == 'z' then
 +		axes = {'y', 'x'}
 +	end
  	angle = angle % 360
  	local pos = {x=pos1.x, y=0, z=0}
 @@ -435,18 +466,14 @@ worldedit.rotate = function(pos1, pos2, angle)  	local env = minetest.env
  	if angle == 90 then
 -		worldedit.transpose(pos1, pos2, "x", "z")
 -		pos1.x, pos1.z = pos1.z, pos1.x
 -		pos2.x, pos2.z = pos2.z, pos2.x
 -		worldedit.flip(pos1, pos2, "z")
 +		worldedit.transpose(pos1, pos2, axes[1], axes[2])
 +		worldedit.flip(pos1, pos2, axes[2])
  	elseif angle == 180 then
 -		worldedit.flip(pos1, pos2, "x")
 -		worldedit.flip(pos1, pos2, "z")
 +		worldedit.flip(pos1, pos2, axes[1])
 +		worldedit.flip(pos1, pos2, axes[2])
  	elseif angle == 270 then
 -		worldedit.transpose(pos1, pos2, "x", "z")
 -		pos1.x, pos1.z = pos1.z, pos1.x
 -		pos2.x, pos2.z = pos2.z, pos2.x
 -		worldedit.flip(pos1, pos2, "x")
 +		worldedit.transpose(pos1, pos2, axes[1], axes[2])
 +		worldedit.flip(pos1, pos2, axes[1])
  	else
  		return 0
  	end
 @@ -410,8 +410,8 @@ minetest.register_chatcommand("/flip", {  })
  minetest.register_chatcommand("/rotate", {
 -	params = "<angle>",
 -	description = "Rotate the current WorldEdit region around the y axis by angle <angle> (90 degree increment)",
 +	params = "<axis> <angle>",
 +	description = "Rotate the current WorldEdit region around the axis <axis> by angle <angle> (90 degree increment)",
  	privs = {worldedit=true},
  	func = function(name, param)
  		local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
 @@ -420,17 +420,20 @@ minetest.register_chatcommand("/rotate", {  			return
  		end
 -		angle = tonumber(param)
 -		if angle == nil then
 +		local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$")
 +		if found == nil then
  			minetest.chat_send_player(name, "Invalid usage: " .. param)
  			return
  		end
 +		if axis == "?" then
 +			axis = worldedit.player_axis(name)
 +		end
  		if angle % 90 ~= 0 then
  			minetest.chat_send_player(name, "Invalid usage: angle must be multiple of 90")
  			return
  		end
 -		local count = worldedit.rotate(pos1, pos2, angle)
 +		local count = worldedit.rotate(pos1, pos2, axis, angle)
  		minetest.chat_send_player(name, count .. " nodes rotated")
  	end,
  })
 | 
