]> git.lizzy.rs Git - worldedit.git/blobdiff - functions.lua
Add //hollowcylinder and //cylinder commands, add worldedit.hollow_cylinder and world...
[worldedit.git] / functions.lua
index 625fafb6b4a0993ff724627261fd6ee4de07ba62..270b50e130a4bedadd0babafbc05b122c27a0e5f 100644 (file)
@@ -72,6 +72,116 @@ worldedit.replace = function(pos1, pos2, searchnode, replacenode)
        return count\r
 end\r
 \r
+--adds a hollow cylinder at `pos` along the `axis` axis ("x" or "y" or "z") with length `length` and radius `radius`, returning the number of nodes added\r
+worldedit.hollow_cylinder = function(pos, axis, length, radius, nodename)\r
+       local other1, other2\r
+       if axis == "x" then\r
+               other1, other2 = "y", "z"\r
+       elseif axis == "y" then\r
+               other1, other2 = "x", "z"\r
+       else --axis == "z"\r
+               other1, other2 = "x", "y"\r
+       end\r
+\r
+       local env = minetest.env\r
+       local currentpos = {x=pos.x, y=pos.y, z=pos.z}\r
+       local node = {name=nodename}\r
+       local count = 0\r
+       for i = 1, length do\r
+               local offset1, offset2 = 0, radius\r
+               local delta = -radius\r
+               while offset1 <= offset2 do\r
+                       --add node at each octant\r
+                       local first1, first2 = pos[other1] + offset1, pos[other1] - offset1\r
+                       local second1, second2 = pos[other2] + offset2, pos[other2] - offset2\r
+                       currentpos[other1], currentpos[other2] = first1, second1\r
+                       env:add_node(currentpos, node) --octant 1\r
+                       currentpos[other1] = first2\r
+                       env:add_node(currentpos, node) --octant 4\r
+                       currentpos[other2] = second2\r
+                       env:add_node(currentpos, node) --octant 5\r
+                       currentpos[other1] = first1\r
+                       env:add_node(currentpos, node) --octant 8\r
+                       local first1, first2 = pos[other1] + offset2, pos[other1] - offset2\r
+                       local second1, second2 = pos[other2] + offset1, pos[other2] - offset1\r
+                       currentpos[other1], currentpos[other2] = first1, second1\r
+                       env:add_node(currentpos, node) --octant 2\r
+                       currentpos[other1] = first2\r
+                       env:add_node(currentpos, node) --octant 3\r
+                       currentpos[other2] = second2\r
+                       env:add_node(currentpos, node) --octant 6\r
+                       currentpos[other1] = first1\r
+                       env:add_node(currentpos, node) --octant 7\r
+\r
+                       count = count + 8 --wip: broken\r
+\r
+                       --move to next location\r
+                       delta = delta + (offset1 * 2) + 1\r
+                       if delta >= 0 then\r
+                               offset2 = offset2 - 1\r
+                               delta = delta - (offset2 * 2)\r
+                       end\r
+                       offset1 = offset1 + 1\r
+               end\r
+               currentpos[axis] = currentpos[axis] + 1\r
+       end\r
+       return count\r
+end\r
+\r
+--adds a cylinder at `pos` along the `axis` axis ("x" or "y" or "z") with length `length` and radius `radius`, returning the number of nodes added\r
+worldedit.cylinder = function(pos, axis, length, radius, nodename)\r
+       local other1, other2\r
+       if axis == "x" then\r
+               other1, other2 = "y", "z"\r
+       elseif axis == "y" then\r
+               other1, other2 = "x", "z"\r
+       else --axis == "z"\r
+               other1, other2 = "x", "y"\r
+       end\r
+\r
+       local env = minetest.env\r
+       local currentpos = {x=pos.x, y=pos.y, z=pos.z}\r
+       local node = {name=nodename}\r
+       local count = 0\r
+       for i = 1, length do\r
+               local offset1, offset2 = 0, radius\r
+               local delta = -radius\r
+               while offset1 <= offset2 do\r
+                       --connect each pair of octants\r
+                       currentpos[other1] = pos[other1] - offset1\r
+                       local second1, second2 = pos[other2] + offset2, pos[other2] - offset2\r
+                       for i = 0, offset1 * 2 do\r
+                               currentpos[other2] = second1\r
+                               env:add_node(currentpos, node) --octant 1 to 4\r
+                               currentpos[other2] = second2\r
+                               env:add_node(currentpos, node) --octant 5 to 8\r
+                               currentpos[other1] = currentpos[other1] + 1\r
+                       end\r
+                       currentpos[other1] = pos[other1] - offset2\r
+                       local second1, second2 = pos[other2] + offset1, pos[other2] - offset1\r
+                       for i = 0, offset2 * 2 do\r
+                               currentpos[other2] = second1\r
+                               env:add_node(currentpos, node) --octant 2 to 3\r
+                               currentpos[other2] = second2\r
+                               env:add_node(currentpos, node) --octant 6 to 7\r
+                               currentpos[other1] = currentpos[other1] + 1\r
+                       end\r
+\r
+                       count = count + (offset1 * 4) + (offset2 * 4) + 4 --wip: broken\r
+\r
+                       --move to next location\r
+                       delta = delta + (offset1 * 2) + 1\r
+                       offset1 = offset1 + 1\r
+                       if delta >= 0 then\r
+                               offset2 = offset2 - 1\r
+                               delta = delta - (offset2 * 2)\r
+                       end\r
+               end\r
+               currentpos[axis] = currentpos[axis] + 1\r
+       end\r
+       return count\r
+end\r
+\r
 --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\r
 worldedit.copy = function(pos1, pos2, axis, amount)\r
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r