]> git.lizzy.rs Git - worldedit.git/commitdiff
Many thanks to Smitje for providing a working example of roations.
authorAnthony Zhang <azhang9@gmail.com>
Wed, 12 Dec 2012 22:17:56 +0000 (17:17 -0500)
committerAnthony Zhang <azhang9@gmail.com>
Wed, 12 Dec 2012 22:17:56 +0000 (17:17 -0500)
Changes: fixed rotation and transposition of non-sqaure regions, makers are now moved to the new region boundaries after rotation/transposition, small consistency fixes, finally fix the /hide command.

Chat Commands.md
WorldEdit API.md
worldedit/manipulations.lua
worldedit_commands/init.lua

index b90318b996fed3a4d95014775d4744f109bd7c7c..28db902bbd098da56d6622495a69fa593ff407fb 100644 (file)
@@ -137,7 +137,7 @@ Stack the current WorldEdit region along the x/y/z/? axis <count> times.
 \r
 ### //transpose x/y/z/? x/y/z/?\r
 \r
-Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes.\r
+Transpose the current WorldEdit positions and region along the x/y/z/? and x/y/z/? axes.\r
 \r
     //transpose x y\r
     //transpose x z\r
@@ -155,7 +155,7 @@ Flip the current WorldEdit region along the x/y/z/? axis.
 \r
 ### //rotate x/y/z/? <angle>\r
 \r
-Rotate the current WorldEdit region along the x/y/z/? axis by angle <angle> (90 degree increment).\r
+Rotate the current WorldEdit positions and region along the x/y/z/? axis by angle <angle> (integer multiple of 90 degrees).\r
 \r
     //rotate x 90\r
     //rotate y 180\r
index ddf9a1e3330a106d5837f16f71222ef774563693..c6f1ace5b8d4f68ec5a34b607c943abbf28bb94d 100644 (file)
@@ -38,11 +38,11 @@ Duplicates the region defined by positions `pos1` and `pos2` along the `axis` ax
 \r
 Returns the number of nodes stacked.\r
 \r
-### count = worldedit.transpose(pos1, pos2, axis1, axis2)\r
+### count, newpos1, newpos2 = worldedit.transpose(pos1, pos2, axis1, axis2)\r
 \r
 Transposes a region defined by the positions `pos1` and `pos2` between the `axis1` and `axis2` axes ("x" or "y" or "z").\r
 \r
-Returns the number of nodes transposed.\r
+Returns the number of nodes transposed, the new position 1, and the new position 2.\r
 \r
 ### count = worldedit.flip(pos1, pos2, axis)\r
 \r
@@ -50,11 +50,11 @@ Flips a region defined by the positions `pos1` and `pos2` along the `axis` axis
 \r
 Returns the number of nodes flipped.\r
 \r
-### count = worldedit.rotate(pos1, pos2, angle)\r
+### count, newpos2, newpos2 = worldedit.rotate(pos1, pos2, angle)\r
 \r
 Rotates a region defined by the positions `pos1` and `pos2` by `angle` degrees clockwise around the y axis (supporting 90 degree increments only).\r
 \r
-Returns the number of nodes rotated.\r
+Returns the number of nodes rotated, the new position 1, and the new position 2.\r
 \r
 ### count = worldedit.dig(pos1, pos2)\r
 \r
@@ -100,6 +100,8 @@ Returns the number of nodes added.
 \r
 Adds a spiral at `pos` with width `width`, height `height`, space between walls `spacer`, composed of `nodename`.\r
 \r
+Returns the number of nodes added.\r
+\r
 Visualization\r
 -------------\r
 Contained in visualization.lua, this module allows nodes to be visualized in different ways.\r
index ad64df6118fe4e606c0954bd552be73a65983740..02490ffde25be2bba10e1aa483cf66e506cbe688 100644 (file)
@@ -191,10 +191,28 @@ worldedit.stack = function(pos1, pos2, axis, count)
        return worldedit.volume(pos1, pos2)\r
 end\r
 \r
---transposes a region defined by the positions `pos1` and `pos2` between the `axis1` and `axis2` axes, returning the number of nodes transposed\r
+--transposes a region defined by the positions `pos1` and `pos2` between the `axis1` and `axis2` axes, returning the number of nodes transposed, the new position 1, and the new position 2\r
 worldedit.transpose = function(pos1, pos2, axis1, axis2)\r
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
 \r
+       local compare\r
+       local extent1, extent2 = pos2[axis1] - pos1[axis1], pos2[axis2] - pos1[axis2]\r
+\r
+       if extent1 > extent2 then\r
+               compare = function(extent1, extent2)\r
+                       return extent1 > extent2\r
+               end\r
+       else\r
+               compare = function(extent1, extent2)\r
+                       return extent1 < extent2\r
+               end\r
+       end\r
+\r
+       --calculate the new position 2 after transposition\r
+       local newpos2 = {x=pos1.x, y=pos1.y, z=pos1.z}\r
+       newpos2[axis1] = pos1[axis1] + extent2\r
+       newpos2[axis2] = pos1[axis2] + extent1\r
+\r
        local pos = {x=pos1.x, y=0, z=0}\r
        local env = minetest.env\r
        while pos.x <= pos2.x do\r
@@ -203,16 +221,16 @@ worldedit.transpose = function(pos1, pos2, axis1, axis2)
                        pos.z = pos1.z\r
                        while pos.z <= pos2.z do\r
                                local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2]\r
-                               if extent1 < extent2 then\r
+                               if compare(extent1, extent2) then --transpose only if below the diagonal\r
                                        local node1 = env:get_node(pos)\r
                                        local meta1 = env:get_meta(pos):to_table()\r
-                                       local value1, value2 = pos[axis1], pos[axis2]\r
-                                       pos[axis1], pos[axis2] = value1 + extent2, value2 + extent1\r
+                                       local value1, value2 = pos[axis1], pos[axis2] --save position values\r
+                                       pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1 --swap axis extents\r
                                        local node2 = env:get_node(pos)\r
                                        local meta2 = env:get_meta(pos):to_table()\r
                                        env:add_node(pos, node1)\r
                                        env:get_meta(pos):from_table(meta1)\r
-                                       pos[axis1], pos[axis2] = value1, value2\r
+                                       pos[axis1], pos[axis2] = value1, value2 --restore position values\r
                                        env:add_node(pos, node2)\r
                                        env:get_meta(pos):from_table(meta2)\r
                                end\r
@@ -222,7 +240,7 @@ worldedit.transpose = function(pos1, pos2, axis1, axis2)
                end\r
                pos.x = pos.x + 1\r
        end\r
-       return worldedit.volume(pos1, pos2)\r
+       return worldedit.volume(pos1, pos2), pos1, newpos2\r
 end\r
 \r
 --flips a region defined by the positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z"), returning the number of nodes flipped\r
@@ -272,17 +290,18 @@ worldedit.rotate = function(pos1, pos2, axis, angle)
        end\r
        angle = angle % 360\r
 \r
+       local count\r
        if angle == 90 then\r
-               worldedit.transpose(pos1, pos2, axis1, axis2)\r
-               worldedit.flip(pos1, pos2, axis2)\r
+               worldedit.flip(pos1, pos2, axis1)\r
+               count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2)\r
        elseif angle == 180 then\r
                worldedit.flip(pos1, pos2, axis1)\r
-               worldedit.flip(pos1, pos2, axis2)\r
+               count = worldedit.flip(pos1, pos2, axis2)\r
        elseif angle == 270 then\r
-               worldedit.transpose(pos1, pos2, axis1, axis2)\r
-               worldedit.flip(pos1, pos2, axis1)\r
+               worldedit.flip(pos1, pos2, axis2)\r
+               count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2)\r
        end\r
-       return worldedit.volume(pos1, pos2)\r
+       return count, pos1, pos2\r
 end\r
 \r
 --digs a region defined by positions `pos1` and `pos2`, returning the number of nodes dug\r
index ad6dac8efb70862990ab3cbf42f386c1ed7aebb9..4529470a2120088a266c756bab210ab18d969ffc 100644 (file)
@@ -115,17 +115,17 @@ minetest.register_on_punchnode(function(pos, node, puncher)
                        worldedit.pos1[name] = pos\r
                        worldedit.mark_pos1(name)\r
                        worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation\r
-                       minetest.chat_send_player(name, "WorldEdit region position 1 set to " .. minetest.pos_to_string(pos))\r
+                       minetest.chat_send_player(name, "WorldEdit position 1 set to " .. minetest.pos_to_string(pos))\r
                elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only\r
                        worldedit.pos1[name] = pos\r
                        worldedit.mark_pos1(name)\r
                        worldedit.set_pos[name] = nil --finished setting positions\r
-                       minetest.chat_send_player(name, "WorldEdit region position 1 set to " .. minetest.pos_to_string(pos))\r
+                       minetest.chat_send_player(name, "WorldEdit position 1 set to " .. minetest.pos_to_string(pos))\r
                elseif worldedit.set_pos[name] == "pos2" then --setting position 2\r
                        worldedit.pos2[name] = pos\r
                        worldedit.mark_pos2(name)\r
                        worldedit.set_pos[name] = nil --finished setting positions\r
-                       minetest.chat_send_player(name, "WorldEdit region position 2 set to " .. minetest.pos_to_string(pos))\r
+                       minetest.chat_send_player(name, "WorldEdit position 2 set to " .. minetest.pos_to_string(pos))\r
                end\r
        end\r
 end)\r
@@ -472,7 +472,14 @@ minetest.register_chatcommand("/transpose", {
                        return\r
                end\r
 \r
-               local count = worldedit.transpose(pos1, pos2, axis1, axis2)\r
+               local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2)\r
+\r
+               --reset markers to transposed positions\r
+               worldedit.pos1[name] = pos1\r
+               worldedit.pos2[name] = pos2\r
+               worldedit.mark_pos1(name)\r
+               worldedit.mark_pos2(name)\r
+\r
                minetest.chat_send_player(name, count .. " nodes transposed")\r
        end,\r
 })\r
@@ -525,7 +532,14 @@ minetest.register_chatcommand("/rotate", {
                        return\r
                end\r
 \r
-               local count = worldedit.rotate(pos1, pos2, axis, angle)\r
+               local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle)\r
+\r
+               --reset markers to rotated positions\r
+               worldedit.pos1[name] = pos1\r
+               worldedit.pos2[name] = pos2\r
+               worldedit.mark_pos1(name)\r
+               worldedit.mark_pos2(name)\r
+\r
                minetest.chat_send_player(name, count .. " nodes rotated")\r
        end,\r
 })\r
@@ -547,8 +561,24 @@ minetest.register_chatcommand("/dig", {
 })\r
 \r
 minetest.register_chatcommand("/hide", {\r
+       params = "",\r
+       description = "Hide all nodes in the current WorldEdit region non-destructively",\r
+       privs = {worldedit=true},\r
+       func = function(name, param)\r
+               local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
+               if pos1 == nil or pos2 == nil then\r
+                       minetest.chat_send_player(name, "No WorldEdit region selected")\r
+                       return\r
+               end\r
+\r
+               local count = worldedit.hide(pos1, pos2)\r
+               minetest.chat_send_player(name, count .. " nodes hidden")\r
+       end,\r
+})\r
+\r
+minetest.register_chatcommand("/suppress", {\r
        params = "<node>",\r
-       description = "Hide all <node> in the current WorldEdit region non-destructively",\r
+       description = "Suppress all <node> in the current WorldEdit region non-destructively",\r
        privs = {worldedit=true},\r
        func = function(name, param)\r
                local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
@@ -562,8 +592,8 @@ minetest.register_chatcommand("/hide", {
                        return\r
                end\r
 \r
-               local count = worldedit.hide(pos1, pos2, param)\r
-               minetest.chat_send_player(name, count .. " nodes hidden")\r
+               local count = worldedit.suppress(pos1, pos2, param)\r
+               minetest.chat_send_player(name, count .. " nodes suppressed")\r
        end,\r
 })\r
 \r