From 1a9ce8b9c140867974de66f1f54178bbfb5df8c7 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sat, 25 Aug 2012 17:23:39 -0700 Subject: [PATCH 1/3] Understands meta! Tested in copy, stack (which copies), move, flip. Transpose (and therefore rotate) do(es) not appear to be functional, but meta stuff added anyway. --- functions.lua | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/functions.lua b/functions.lua index ee549de..425a6ac 100644 --- a/functions.lua +++ b/functions.lua @@ -216,9 +216,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 @@ -234,9 +237,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 @@ -261,10 +267,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 @@ -279,11 +288,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 @@ -326,12 +338,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 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[axis1], pos[axis2] = value1, value2 env:add_node(pos, node2) + local meta2b = env:get_meta(pos) + meta2b:from_table(meta2a) end pos.z = pos.z + 1 end @@ -356,12 +374,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 From 91c24d3a609bc1e22f132f6c8a9e9b86f0850fa5 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 26 Aug 2012 13:14:47 -0700 Subject: [PATCH 2/3] Fix transpose and rotate --- functions.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/functions.lua b/functions.lua index 425a6ac..ea10760 100644 --- a/functions.lua +++ b/functions.lua @@ -340,13 +340,13 @@ worldedit.transpose = function(pos1, pos2, axis1, axis2) 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) local meta1b = env:get_meta(pos) meta1b:from_table(meta1a) - pos[axis1], pos[axis2] = value1, value2 + 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) @@ -408,16 +408,12 @@ worldedit.rotate = function(pos1, pos2, angle) 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") elseif angle == 180 then worldedit.flip(pos1, pos2, "x") worldedit.flip(pos1, pos2, "z") 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") else return 0 From 6eb08edd3005518f06c6c43f324399d8bed6a830 Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 28 Aug 2012 15:57:45 -0700 Subject: [PATCH 3/3] Rotate now works with x/y/z/? instead of just y: "//rotate x 90" --- README.md | 9 +++++---- functions.lua | 23 +++++++++++++++-------- init.lua | 13 ++++++++----- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index a83f2f4..72f75fb 100644 --- a/README.md +++ b/README.md @@ -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 (90 degree increment). +Rotate the current WorldEdit region around the axis by 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 ea10760..15eea49 100644 --- a/functions.lua +++ b/functions.lua @@ -395,10 +395,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} @@ -407,14 +414,14 @@ worldedit.rotate = function(pos1, pos2, angle) local env = minetest.env if angle == 90 then - worldedit.transpose(pos1, pos2, "x", "z") - 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") - worldedit.flip(pos1, pos2, "x") + worldedit.transpose(pos1, pos2, axes[1], axes[2]) + worldedit.flip(pos1, pos2, axes[1]) else return 0 end diff --git a/init.lua b/init.lua index 7bd79be..6820bbf 100644 --- a/init.lua +++ b/init.lua @@ -404,8 +404,8 @@ minetest.register_chatcommand("/flip", { }) minetest.register_chatcommand("/rotate", { - params = "", - description = "Rotate the current WorldEdit region around the y axis by angle (90 degree increment)", + params = " ", + description = "Rotate the current WorldEdit region around the axis by angle (90 degree increment)", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -414,17 +414,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, })