diff --git a/Chat Commands.md b/Chat Commands.md index 4b39526..bba8762 100644 --- a/Chat Commands.md +++ b/Chat Commands.md @@ -166,6 +166,14 @@ Stack the current WorldEdit region along the x/y/z/? axis times. //stack z +5 //stack ? 12 +### //scale + +Scale the current WorldEdit positions and region by a factor of positive integer with position 1 as the origin. + + //scale 2 + //scale 1 + //scale 10 + ### //transpose x/y/z/? x/y/z/? Transpose the current WorldEdit positions and region along the x/y/z/? and x/y/z/? axes. diff --git a/WorldEdit API.md b/WorldEdit API.md index 6008a9f..c994bf7 100644 --- a/WorldEdit API.md +++ b/WorldEdit API.md @@ -46,11 +46,17 @@ Duplicates the region defined by positions `pos1` and `pos2` along the `axis` ax Returns the number of nodes stacked. +### count, newpos1, newpos2 = worldedit.scale(pos1, pos2, factor) + +Scales the region defined by positions `pos1` and `pos2` by an factor of positive integer `factor` with `pos1` as the origin. + +Returns the number of nodes scaled, the new scaled position 1, and the new scaled position 2. + ### count, newpos1, newpos2 = worldedit.transpose(pos1, pos2, axis1, axis2) Transposes a region defined by the positions `pos1` and `pos2` between the `axis1` and `axis2` axes ("x" or "y" or "z"). -Returns the number of nodes transposed, the new position 1, and the new position 2. +Returns the number of nodes transposed, the new transposed position 1, and the new transposed position 2. ### count = worldedit.flip(pos1, pos2, axis) diff --git a/worldedit/manipulations.lua b/worldedit/manipulations.lua index b5bcd3c..4b78e2a 100644 --- a/worldedit/manipulations.lua +++ b/worldedit/manipulations.lua @@ -222,7 +222,43 @@ worldedit.stack = function(pos1, pos2, axis, count, env) return worldedit.volume(pos1, pos2) end ---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 +--scales the region defined by positions `pos1` and `pos2` by an factor of positive integer `factor` with `pos1` as the origin, returning the number of nodes scaled, the new scaled position 1, and the new scaled position 2 +worldedit.scale = function(pos1, pos2, factor, env) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + if env == nil then env = minetest.env end + + local pos = {x=pos2.x, y=0, z=0} + local bigpos = {x=0, y=0, z=0} + size = factor - 1 + while pos.x >= pos1.x do + pos.y = pos2.y + while pos.y >= pos1.y do + pos.z = pos2.z + while pos.z >= pos1.z do + local node = env:get_node(pos) --obtain current node + local meta = env:get_meta(pos):to_table() --get meta of current node + local value = pos[axis] --store current position + local posx, posy, posz = pos1.x + (pos.x - pos1.x) * factor, pos1.y + (pos.y - pos1.y) * factor, pos1.z + (pos.z - pos1.z) * factor + for x = 0, size do --fill in large node + for y = 0, size do + for z = 0, size do + bigpos.x, bigpos.y, bigpos.z = posx + x, posy + y, posz + z + env:add_node(bigpos, node) --copy node to new position + env:get_meta(bigpos):from_table(meta) --set metadata of new node + end + end + end + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + local newpos2 = {x=pos1.x + (pos2.x - pos1.x) * factor + size, y=pos1.y + (pos2.y - pos1.y) * factor + size, z=pos1.z + (pos2.z - pos1.z) * factor + size} + return worldedit.volume(pos1, pos2), pos1, newpos2 +end + +--transposes a region defined by the positions `pos1` and `pos2` between the `axis1` and `axis2` axes, returning the number of nodes transposed, the new transposed position 1, and the new transposed position 2 worldedit.transpose = function(pos1, pos2, axis1, axis2, env) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) diff --git a/worldedit_commands/init.lua b/worldedit_commands/init.lua index 69e9804..f610ccb 100644 --- a/worldedit_commands/init.lua +++ b/worldedit_commands/init.lua @@ -631,6 +631,38 @@ minetest.register_chatcommand("/stack", { end, }) +minetest.register_chatcommand("/scale", { + params = "", + description = "Scale the current WorldEdit positions and region by a factor of positive integer with position 1 as the origin", + privs = {worldedit=true}, + func = function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if pos1 == nil or pos2 == nil then + worldedit.player_notify(name, "no region selected") + return + end + + local factor = tonumber(param) + if not factor or factor ~= math.floor(factor) or factor <= 0 then + worldedit.player_notify(name, "invalid scaling factor: " .. param) + end + + local tenv = minetest.env + if worldedit.ENABLE_QUEUE then + tenv = worldedit.queue_aliasenv + end + local count, pos1, pos2 = worldedit.scale(pos1, pos2, factor, tenv) + + --reset markers to scaled positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + + worldedit.player_notify(name, count .. " nodes scaled") + end, +}) + minetest.register_chatcommand("/transpose", { params = "x/y/z/? x/y/z/?", description = "Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes",