From 8cf808ea83c4c964ec7553c8b8772526a61bde35 Mon Sep 17 00:00:00 2001 From: BUISSON-DEBON Quentin Date: Sun, 14 May 2017 22:41:16 +0200 Subject: [PATCH] update worldedit and fix a possible hack --- mods/WorldEdit/ChatCommands.md | 55 +++- mods/WorldEdit/WorldEdit API.md | 10 +- mods/WorldEdit/worldedit/cuboid.lua | 258 ++++++++++++++++ mods/WorldEdit/worldedit/init.lua | 1 + mods/WorldEdit/worldedit/manipulations.lua | 45 ++- mods/WorldEdit/worldedit/primitives.lua | 13 +- mods/WorldEdit/worldedit/serialization.lua | 6 +- .../worldedit/textures/worldedit_wand.png | Bin 0 -> 442 bytes mods/WorldEdit/worldedit_commands/.gitignore | 1 + mods/WorldEdit/worldedit_commands/cuboid.lua | 240 +++++++++++++++ mods/WorldEdit/worldedit_commands/init.lua | 189 +++++++++--- mods/WorldEdit/worldedit_commands/mark.lua | 47 ++- mods/WorldEdit/worldedit_commands/safe.lua | 15 +- .../textures/worldedit_cube.png | Bin 105 -> 147 bytes .../textures/worldedit_pos1.png | Bin 123 -> 142 bytes .../textures/worldedit_pos2.png | Bin 134 -> 157 bytes mods/WorldEdit/worldedit_commands/wand.lua | 24 ++ mods/WorldEdit/worldedit_gui/depends.txt | 3 +- .../WorldEdit/worldedit_gui/functionality.lua | 289 ++++++++++++------ mods/WorldEdit/worldedit_gui/init.lua | 63 +++- .../textures/inventory_plus_worldedit_gui.png | Bin 21724 -> 25175 bytes .../textures/worldedit_gui_unknown.png | Bin 0 -> 597 bytes .../worldedit_shortcommands/init.lua | 3 +- 23 files changed, 1074 insertions(+), 188 deletions(-) mode change 100755 => 100644 mods/WorldEdit/ChatCommands.md mode change 100755 => 100644 mods/WorldEdit/WorldEdit API.md create mode 100644 mods/WorldEdit/worldedit/cuboid.lua mode change 100755 => 100644 mods/WorldEdit/worldedit/manipulations.lua mode change 100755 => 100644 mods/WorldEdit/worldedit/primitives.lua mode change 100755 => 100644 mods/WorldEdit/worldedit/serialization.lua create mode 100644 mods/WorldEdit/worldedit/textures/worldedit_wand.png create mode 100644 mods/WorldEdit/worldedit_commands/.gitignore create mode 100644 mods/WorldEdit/worldedit_commands/cuboid.lua mode change 100755 => 100644 mods/WorldEdit/worldedit_commands/init.lua mode change 100755 => 100644 mods/WorldEdit/worldedit_commands/mark.lua mode change 100755 => 100644 mods/WorldEdit/worldedit_commands/safe.lua mode change 100755 => 100644 mods/WorldEdit/worldedit_commands/textures/worldedit_cube.png mode change 100755 => 100644 mods/WorldEdit/worldedit_commands/textures/worldedit_pos1.png mode change 100755 => 100644 mods/WorldEdit/worldedit_commands/textures/worldedit_pos2.png create mode 100644 mods/WorldEdit/worldedit_commands/wand.lua mode change 100755 => 100644 mods/WorldEdit/worldedit_gui/depends.txt mode change 100755 => 100644 mods/WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png create mode 100644 mods/WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png diff --git a/mods/WorldEdit/ChatCommands.md b/mods/WorldEdit/ChatCommands.md old mode 100755 new mode 100644 index 0c8b3a11..be885c0a --- a/mods/WorldEdit/ChatCommands.md +++ b/mods/WorldEdit/ChatCommands.md @@ -22,6 +22,9 @@ Many commands also have shorter names that can be typed faster. For example, if | `//hdo` | `//hollowdome` | | `//do` | `//dome` | | `//hcyl` | `//hollowcylinder` | +| `//cyl` | `//cylinder` | +| `//hpyr` | `//hollowpyramid` | +| `//pyr` | `//pyramid` | ### `//about` @@ -100,7 +103,7 @@ Display the volume of the current WorldEdit region. ### `//deleteblocks` -Delete the MapBlocks (16x16x16 units) that contain the selected region. This means that mapgen will be invoked for that area. As only whole MapBlocks get removed, the deleted area is usually larger than the selected one. Also, mapgen can trigger mechanisms like mud reflow or cavegen, which affects nodes (up to 112 nodes away) outside the MapBlock, so dont use this near buildings. +Delete the MapBlocks (16x16x16 units) that contain the selected region. This means that mapgen will be invoked for that area. As only whole MapBlocks get removed, the deleted area is usually larger than the selected one. Also, mapgen can trigger mechanisms like mud reflow or cavegen, which affects nodes (up to 112 nodes away) outside the MapBlock, so dont use this near buildings. Note that active entities are not part of a MapBlock and do not get deleted. //deleteblocks @@ -190,6 +193,15 @@ Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length ` ` + +Add hollow pyramid centered at WorldEdit position 1 along the x/y/z/? axis with height ``, composed of ``. + + //hollowpyramid x 8 Diamond Block + //hollowpyramid y -5 glass + //hollowpyramid z 2 mesecons:wire_00000000_off + //hollowpyramid ? 12 mesecons:wire_00000000_off + ### `//pyramid x/y/z? ` Add pyramid centered at WorldEdit position 1 along the x/y/z/? axis with height ``, composed of ``. @@ -291,6 +303,12 @@ Fixes the lighting in the current WorldEdit region. //fixlight +### `//drain` + +Removes any fluid node within the current WorldEdit region. + + //drain + ### `//hide` Hide all nodes in the current WorldEdit region non-destructively. @@ -380,3 +398,38 @@ This mode can be left with `//mtschemprob finish`. `//mtschemprob get` will disp Clears all objects within the WorldEdit region. //clearobjects + +### `//shift x/y/z/?/up/down/left/right/front/back [+|-]` + +Shifts the selection area by `[+|-]` without touching its contents. The shifting axis can be absolute (`x/y/z`) or +relative (`up/down/left/right/front/back`). + + //shift left 5 + +### `//expand [+|-]x/y/z/?/up/down/left/right/front/back [reverse-amount]` + +Expands the selection by `` in the selected absolute or relative axis. If specified, the selection can be expanded in the +opposite direction over the same axis by `[reverse-amount]`. + + //expand right 7 5 + +### `//contract [+|-]x/y/z/?/up/down/left/right/front/back [reverse-amount]` + +Contracts the selection by `` in the selected absolute or relative axis. If specified, the selection can be contracted in the +opposite direction over the same axis by `[reverse-amount]`. + + //expand right 7 5 + +### `//outset [hv] ` + +Expands the selection in all directions by ``. If specified, the selection can be expanded horizontally in the x and z axes `[h]` +or vertically in the y axis `[v]`. + + //outset v 5 + +### `//inset [hv] ` + +Contracts the selection in all directions by ``. If specified, the selection can be contracted horizontally in the x and z axes `[h]` +or vertically in the y axis `[v]`. + + //outset v 5 \ No newline at end of file diff --git a/mods/WorldEdit/WorldEdit API.md b/mods/WorldEdit/WorldEdit API.md old mode 100755 new mode 100644 index f50b5062..5867dfc9 --- a/mods/WorldEdit/WorldEdit API.md +++ b/mods/WorldEdit/WorldEdit API.md @@ -45,6 +45,12 @@ Copies the region defined by positions `pos1` and `pos2` along the `axis` axis ( Returns the number of nodes copied. +### count = worldedit.copy2(pos1, pos2, off) + +Copies the region defined by positions `pos1` and `pos2` by the offset vector `off`. + +Returns the number of nodes copied. + ### count = worldedit.move(pos1, pos2, axis, amount) Moves the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes. @@ -127,9 +133,9 @@ Adds a cylinder at `pos` along the `axis` axis ("x" or "y" or "z") with length ` Returns the number of nodes added. -### count = worldedit.pyramid(pos, axis, height, node_name) +### count = worldedit.pyramid(pos, axis, height, node_name, hollow) -Adds a pyramid centered at `pos` along the `axis` axis ("x" or "y" or "z") with height `height`. +Adds a pyramid centered at `pos` along the `axis` axis ("x" or "y" or "z") with height `height`, composed of `node_name`. Returns the number of nodes added. diff --git a/mods/WorldEdit/worldedit/cuboid.lua b/mods/WorldEdit/worldedit/cuboid.lua new file mode 100644 index 00000000..ce207615 --- /dev/null +++ b/mods/WorldEdit/worldedit/cuboid.lua @@ -0,0 +1,258 @@ +-- Expands or contracts the cuboid in all axes by amount (positive or negative) +worldedit.cuboid_volumetric_expand = function(name, amount) + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + + if pos1 == nil or pos2 == nil then + return false, "Undefined cuboid" + end + + local delta1 = vector.new() + local delta2 = vector.new() + local delta_dir1 + local delta_dir2 + + delta1 = vector.add(delta1, amount) + delta2 = vector.add(delta2, amount) + delta_dir1, delta_dir2 = worldedit.get_expansion_directions(pos1, pos2) + delta1 = vector.multiply(delta1, delta_dir1) + delta2 = vector.multiply(delta2, delta_dir2) + worldedit.pos1[name] = vector.add(pos1, delta1) + worldedit.pos2[name] = vector.add(pos2, delta2) + + return true +end + + +-- Expands or contracts the cuboid in a single axis by amount (positive or negative) +worldedit.cuboid_linear_expand = function(name, axis, direction, amount) + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + + if pos1 == nil or pos2 == nil then + return false, "undefined cuboid" + end + + if direction ~= 1 and direction ~= -1 then + return false, "invalid marker" + end + + local marker = worldedit.marker_get_closest_to_axis(name, axis, direction) + local deltavect = vector.new() + + if axis == 'x' then + deltavect.x = amount * direction + elseif axis == 'y' then + deltavect.y = amount * direction + elseif axis == 'z' then + deltavect.z = amount * direction + else + return false, "invalid axis" + end + + worldedit.marker_move(name, marker, deltavect) + return true +end + + +-- Shifts the cuboid by '+-amount' in axis 'axis' +worldedit.cuboid_shift = function(name, axis, amount) + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + + if pos1 == nil or pos2 == nil then + return false, "undefined cuboid" + end + + if axis == 'x' then + worldedit.pos1[name].x = pos1.x + amount + worldedit.pos2[name].x = pos2.x + amount + elseif axis == 'y' then + worldedit.pos1[name].y = pos1.y + amount + worldedit.pos2[name].y = pos2.y + amount + elseif axis == 'z' then + worldedit.pos1[name].z = pos1.z + amount + worldedit.pos2[name].z = pos2.z + amount + else + return false, "invalid axis" + end + + return true +end + + +-- Moves the location of a single marker by adding deltavector +worldedit.marker_move = function(name, marker, deltavector) + if marker ~= 1 and marker ~= 2 then + return false + end + + if marker == 1 then + local pos = worldedit.pos1[name] + worldedit.pos1[name] = vector.add(deltavector, pos) + else + local pos = worldedit.pos2[name] + worldedit.pos2[name] = vector.add(deltavector, pos) + end + + return true +end + +-- Updates the location ingame of the markers +worldedit.marker_update = function(name, marker) + if marker == nil then + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + elseif marker == 1 then + worldedit.mark_pos1(name) + elseif marker == 2 then + worldedit.mark_pos2(name) + else + minetest.debug( + "worldedit: Invalid execution of function update_markers") + end +end + + +-- Returns two vectors with the directions for volumetric expansion +worldedit.get_expansion_directions = function(mark1, mark2) + if mark1 == nil or mark2 == nil then + return + end + local dir1 = vector.new() + local dir2 = vector.new() + + if mark1.x < mark2.x then + dir1.x = -1 + dir2.x = 1 + else + dir1.x = 1 + dir2.x = -1 + end + if mark1.y < mark2.y then + dir1.y = -1 + dir2.y = 1 + else + dir1.y = 1 + dir2.y = -1 + end + if mark1.z < mark2.z then + dir1.z = -1 + dir2.z = 1 + else + dir1.z = 1 + dir2.z = -1 + end + return dir1, dir2 +end + + +-- Return the marker that is closest to the player +worldedit.marker_get_closest_to_player = function(name) + local playerpos = minetest.get_player_by_name(name):getpos() + local dist1 = vector.distance(playerpos, worldedit.pos1[name]) + local dist2 = vector.distance(playerpos, worldedit.pos2[name]) + + if dist1 < dist2 then + return 1 + else + return 2 + end +end + + +-- Returns the closest marker to the specified axis and direction +worldedit.marker_get_closest_to_axis = function(name, axis, direction) + local pos1 = vector.new() + local pos2 = vector.new() + + if direction ~= 1 and direction ~= -1 then + return nil + end + + if axis == 'x' then + pos1.x = worldedit.pos1[name].x * direction + pos2.x = worldedit.pos2[name].x * direction + if pos1.x > pos2.x then + return 1 + else + return 2 + end + elseif axis == 'y' then + pos1.y = worldedit.pos1[name].y * direction + pos2.y = worldedit.pos2[name].y * direction + if pos1.y > pos2.y then + return 1 + else + return 2 + end + elseif axis == 'z' then + pos1.z = worldedit.pos1[name].z * direction + pos2.z = worldedit.pos2[name].z * direction + if pos1.z > pos2.z then + return 1 + else + return 2 + end + else + return nil + end +end + + +-- Translates up, down, left, right, front, back to their corresponding axes and +-- directions according to faced direction +worldedit.translate_direction = function(name, direction) + local axis, dir = worldedit.player_axis(name) + local resaxis, resdir + + if direction == "up" then + return 'y', 1 + end + + if direction == "down" then + return 'y', -1 + end + + if direction == "front" then + if axis == "y" then + resaxis = nil + resdir = nil + else + resaxis = axis + resdir = dir + end + end + + if direction == "back" then + if axis == "y" then + resaxis = nil + resdir = nil + else + resaxis = axis + resdir = -dir + end + end + + if direction == "left" then + if axis == 'x' then + resaxis = 'z' + resdir = dir + elseif axis == 'z' then + resaxis = 'x' + resdir = -dir + end + end + + if direction == "right" then + if axis == 'x' then + resaxis = 'z' + resdir = -dir + elseif axis == 'z' then + resaxis = 'x' + resdir = dir + end + end + + return resaxis, resdir +end \ No newline at end of file diff --git a/mods/WorldEdit/worldedit/init.lua b/mods/WorldEdit/worldedit/init.lua index e193454d..0305c4d1 100755 --- a/mods/WorldEdit/worldedit/init.lua +++ b/mods/WorldEdit/worldedit/init.lua @@ -36,6 +36,7 @@ load_module(path .. "/visualization.lua") load_module(path .. "/serialization.lua") load_module(path .. "/code.lua") load_module(path .. "/compatibility.lua") +load_module(path .. "/cuboid.lua") if minetest.setting_getbool("log_mods") then diff --git a/mods/WorldEdit/worldedit/manipulations.lua b/mods/WorldEdit/worldedit/manipulations.lua old mode 100755 new mode 100644 index 365d7b39..57c7a764 --- a/mods/WorldEdit/worldedit/manipulations.lua +++ b/mods/WorldEdit/worldedit/manipulations.lua @@ -90,7 +90,7 @@ function worldedit.stack2(pos1, pos2, direction, amount, finished) translated.x = translated.x + direction.x translated.y = translated.y + direction.y translated.z = translated.z + direction.z - worldedit.copy2(pos1, pos2, translated, volume) + worldedit.copy2(pos1, pos2, translated) minetest.after(0, next_one) else if finished then @@ -164,6 +164,38 @@ function worldedit.copy(pos1, pos2, axis, amount) return worldedit.volume(pos1, pos2) end +--- Copies a region by offset vector `off`. +-- @param pos1 +-- @param pos2 +-- @param off +-- @return The number of nodes copied. +function worldedit.copy2(pos1, pos2, off) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + local pos = {} + pos.x = pos2.x + 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 = get_node(pos) -- Obtain current node + local meta = get_meta(pos):to_table() -- Get meta of current node + local newpos = vector.add(pos, off) -- Calculate new position + set_node(newpos, node) -- Copy node to new position + get_meta(newpos):from_table(meta) -- Set metadata of new node + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + return worldedit.volume(pos1, pos2) +end --- Moves a region along `axis` by `amount` nodes. -- @return The number of nodes moved. @@ -543,14 +575,11 @@ end function worldedit.fixlight(pos1, pos2) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - worldedit.keep_loaded(pos1, pos2) + local vmanip = minetest.get_voxel_manip(pos1, pos2) + vmanip:write_to_map() + vmanip:update_map() -- this updates the lighting - local nodes = minetest.find_nodes_in_area(pos1, pos2, "air") - local dig_node = minetest.dig_node - for _, pos in ipairs(nodes) do - dig_node(pos) - end - return #nodes + return worldedit.volume(pos1, pos2) end diff --git a/mods/WorldEdit/worldedit/primitives.lua b/mods/WorldEdit/worldedit/primitives.lua old mode 100755 new mode 100644 index 6d3b026e..fe22fffe --- a/mods/WorldEdit/worldedit/primitives.lua +++ b/mods/WorldEdit/worldedit/primitives.lua @@ -150,14 +150,15 @@ end -- @param axis Axis ("x", "y", or "z") -- @param height Pyramid height. -- @param node_name Name of node to make pyramid of. +-- @param hollow Whether the pyramid should be hollow. -- @return The number of nodes added. -function worldedit.pyramid(pos, axis, height, node_name) +function worldedit.pyramid(pos, axis, height, node_name, hollow) local other1, other2 = worldedit.get_axis_others(axis) -- Set up voxel manipulator local manip, area = mh.init_axis_radius(pos, axis, height >= 0 and height or -height) - local data = mh.get_empty_data() + local data = mh.get_empty_data(area) -- Handle inverted pyramids local start_axis, end_axis, step @@ -177,7 +178,7 @@ function worldedit.pyramid(pos, axis, height, node_name) y = pos.y - area.MinEdge.y, z = pos.z - area.MinEdge.z, } - local size = height * step + local size = math.abs(height * step) local count = 0 -- For each level of the pyramid for index1 = 0, height, step do @@ -187,10 +188,12 @@ function worldedit.pyramid(pos, axis, height, node_name) local new_index2 = new_index1 + (index2 + offset[other1]) * stride[other1] for index3 = -size, size do local i = new_index2 + (index3 + offset[other2]) * stride[other2] - data[i] = node_id + if (not hollow or size - math.abs(index2) < 2 or size - math.abs(index3) < 2) then + data[i] = node_id + count = count + 1 + end end end - count = count + (size * 2 + 1) ^ 2 size = size - 1 end diff --git a/mods/WorldEdit/worldedit/serialization.lua b/mods/WorldEdit/worldedit/serialization.lua old mode 100755 new mode 100644 index 00d984d0..a0848e22 --- a/mods/WorldEdit/worldedit/serialization.lua +++ b/mods/WorldEdit/worldedit/serialization.lua @@ -144,9 +144,9 @@ local function load_schematic(value) "([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do param1, param2 = tonumber(param1), tonumber(param2) table.insert(nodes, { - x = originx + tonumber(x), - y = originy + tonumber(y), - z = originz + tonumber(z), + x = tonumber(x), + y = tonumber(y), + z = tonumber(z), name = name, param1 = param1 ~= 0 and param1 or nil, param2 = param2 ~= 0 and param2 or nil, diff --git a/mods/WorldEdit/worldedit/textures/worldedit_wand.png b/mods/WorldEdit/worldedit/textures/worldedit_wand.png new file mode 100644 index 0000000000000000000000000000000000000000..13eb12189cb19a680229526a474f38f932300ab1 GIT binary patch literal 442 zcmV;r0Y(0aP)YX~D;^6zhY%lq+t9~~3e-UnQMy0G(L5CoCbLBh== z5DNIw3X)cJp+6FWexczo(!-(xV*dHr8*{Uf%fUJ@g7q`K=_*qFSkw$sgJBr=*Vvy8 zuyBGp@o_hoig{RlLBvn4NLT;>YtaC^q!P$t!^+Vu2@3!qHqph3MTY70B9_X~zZ*1? zIDaM6>4p6Egzf2G78U?NER`XfqZ5^40rB}T3kv{X=|Cs5!w2=NfQ`v+ZhC`8wx+yn zl?gAkb|lkT5*7f!a&(A2ZDqXIOl+P$Q&ScGl1yhQU#UW|%UGQoX5j?C<1UQyhj9nL kM{P|20J}2^J8ETo0~vOCmI$`c0000007*qoM6N<$f^)O3761SM literal 0 HcmV?d00001 diff --git a/mods/WorldEdit/worldedit_commands/.gitignore b/mods/WorldEdit/worldedit_commands/.gitignore new file mode 100644 index 00000000..e4e5f6c8 --- /dev/null +++ b/mods/WorldEdit/worldedit_commands/.gitignore @@ -0,0 +1 @@ +*~ \ No newline at end of file diff --git a/mods/WorldEdit/worldedit_commands/cuboid.lua b/mods/WorldEdit/worldedit_commands/cuboid.lua new file mode 100644 index 00000000..88f02608 --- /dev/null +++ b/mods/WorldEdit/worldedit_commands/cuboid.lua @@ -0,0 +1,240 @@ +minetest.register_chatcommand("/outset", { + params = "[h|v] ", + description = "outset the selection", + privs = {worldedit=true}, + func = function(name, param) + local find, _, dir, amount = param:find("(%a*)%s*([+-]?%d+)") + + if find == nil then + return false, "invalid usage: " .. param + end + + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + + if pos1 == nil or pos2 == nil then + return false, + "Undefined region. Region must be defined beforehand." + end + + local hv_test = dir:find("[^hv]+") + + if hv_test ~= nil then + return false, "Invalid direction." + end + + if dir == "" or dir == "hv" or dir == "vh" then + assert(worldedit.cuboid_volumetric_expand(name, amount)) + elseif dir == "h" then + assert(worldedit.cuboid_linear_expand(name, 'x', 1, amount)) + assert(worldedit.cuboid_linear_expand(name, 'x', -1, amount)) + assert(worldedit.cuboid_linear_expand(name, 'z', 1, amount)) + assert(worldedit.cuboid_linear_expand(name, 'z', -1, amount)) + elseif dir == "v" then + assert(worldedit.cuboid_linear_expand(name, 'y', 1, amount)) + assert(worldedit.cuboid_linear_expand(name, 'y', -1, amount)) + else + return false, "Invalid number of arguments" + end + + worldedit.marker_update(name) + return true, "Region outset by " .. amount .. " blocks" + end, + } +) + + +minetest.register_chatcommand("/inset", { + params = "[h|v] ", + description = "inset the selection", + privs = {worldedit=true}, + func = function(name, param) + local find, _, dir, amount = param:find("(%a*)%s*([+-]?%d+)") + + if find == nil then + return false, "invalid usage: " .. param + end + + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + + if pos1 == nil or pos2 == nil then + return false, + "Undefined region. Region must be defined beforehand." + end + + local hv_test = dir:find("[^hv]+") + + if hv_test ~= nil then + return false, "Invalid direction." + end + + if dir == "" or dir == "vh" or dir == "hv" then + assert(worldedit.cuboid_volumetric_expand(name, -amount)) + elseif dir == "h" then + assert(worldedit.cuboid_linear_expand(name, 'x', 1, -amount)) + assert(worldedit.cuboid_linear_expand(name, 'x', -1, -amount)) + assert(worldedit.cuboid_linear_expand(name, 'z', 1, -amount)) + assert(worldedit.cuboid_linear_expand(name, 'z', -1, -amount)) + elseif dir == "v" then + assert(worldedit.cuboid_linear_expand(name, 'y', 1, -amount)) + assert(worldedit.cuboid_linear_expand(name, 'y', -1, -amount)) + else + return false, "Invalid number of arguments" + end + + worldedit.marker_update(name) + return true, "Region inset by " .. amount .. " blocks" + end, + } +) + + +minetest.register_chatcommand("/shift", { + params = "[x|y|z|?|up|down|left|right|front|back] [+|-]", + description = "Moves the selection region. Does not move contents.", + privs = {worldedit=true}, + func = function(name, param) + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + local find, _, direction, amount = param:find("([%?%l]+)%s*([+-]?%d+)") + + if find == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + + if pos1 == nil or pos2 == nil then + worldedit.player_notify(name, + "Undefined region. Region must be defined beforehand.") + return + end + + local axis, dir + if direction == "x" or direction == "y" or direction == "z" then + axis, dir = direction, 1 + elseif direction == "?" then + axis, dir = worldedit.player_axis(name) + else + axis, dir = worldedit.translate_direction(name, direction) + end + + if axis == nil or dir == nil then + return false, "Invalid if looking straight up or down" + end + + assert(worldedit.cuboid_shift(name, axis, amount * dir)) + worldedit.marker_update(name) + + return true, "Region shifted by " .. amount .. " nodes" + end, + } +) + + +minetest.register_chatcommand("/expand", { + params = "[+|-] [reverse-amount]", + description = "expand the selection in one or two directions at once", + privs = {worldedit=true}, + func = function(name, param) + local find, _, sign, direction, amount, + rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)") + + if find == nil then + worldedit.player_notify(name, "invalid use: " .. param) + return + end + + if worldedit.pos1[name] == nil or worldedit.pos2[name] == nil then + worldedit.player_notify(name, + "Undefined region. Region must be defined beforehand.") + return + end + + local absolute = direction:find("[xyz?]") + local dir, axis + + if rev_amount == "" then + rev_amount = 0 + end + + if absolute == nil then + axis, dir = worldedit.translate_direction(name, direction) + + if axis == nil or dir == nil then + return false, "Invalid if looking straight up or down" + end + else + if direction == "?" then + axis, dir = worldedit.player_axis(name) + else + axis = direction + dir = 1 + end + end + + if sign == "-" then + dir = -dir + end + + worldedit.cuboid_linear_expand(name, axis, dir, amount) + worldedit.cuboid_linear_expand(name, axis, -dir, rev_amount) + worldedit.marker_update(name) + return true, "Region expanded by " .. (amount + rev_amount) .. " nodes" + end, + } +) + + +minetest.register_chatcommand("/contract", { + params = "[+|-] [reverse-amount]", + description = "contract the selection in one or two directions at once", + privs = {worldedit=true}, + func = function(name, param) + local find, _, sign, direction, amount, + rev_amount = param:find("([+-]?)([%?%l]+)%s*(%d+)%s*(%d*)") + + if find == nil then + worldedit.player_notify(name, "invalid use: " .. param) + return + end + + if worldedit.pos1[name] == nil or worldedit.pos2[name] == nil then + worldedit.player_notify(name, + "Undefined region. Region must be defined beforehand.") + return + end + + local absolute = direction:find("[xyz?]") + local dir, axis + + if rev_amount == "" then + rev_amount = 0 + end + + if absolute == nil then + axis, dir = worldedit.translate_direction(name, direction) + + if axis == nil or dir == nil then + return false, "Invalid if looking straight up or down" + end + else + if direction == "?" then + axis, dir = worldedit.player_axis(name) + else + axis = direction + dir = 1 + end + end + + if sign == "-" then + dir = -dir + end + + worldedit.cuboid_linear_expand(name, axis, dir, -amount) + worldedit.cuboid_linear_expand(name, axis, -dir, -rev_amount) + worldedit.marker_update(name) + return true, "Region contracted by " .. (amount + rev_amount) .. " nodes" + end, + } +) diff --git a/mods/WorldEdit/worldedit_commands/init.lua b/mods/WorldEdit/worldedit_commands/init.lua old mode 100755 new mode 100644 index 83a127ea..a62efb62 --- a/mods/WorldEdit/worldedit_commands/init.lua +++ b/mods/WorldEdit/worldedit_commands/init.lua @@ -10,8 +10,10 @@ if minetest.place_schematic then worldedit.prob_list = {} end +dofile(minetest.get_modpath("worldedit_commands") .. "/cuboid.lua") dofile(minetest.get_modpath("worldedit_commands") .. "/mark.lua") -local safe_region, check_region = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua") +dofile(minetest.get_modpath("worldedit_commands") .. "/wand.lua") +local safe_region, check_region, reset_pending = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua") local function get_position(name) --position 1 retrieval function for when not using `safe_region` local pos1 = worldedit.pos1[name] @@ -91,6 +93,56 @@ minetest.register_chatcommand("/about", { end, }) +-- mostly copied from builtin/chatcommands.lua with minor modifications +minetest.register_chatcommand("/help", { + privs = {}, + params = "[all/]", + description = "Get help for WorldEdit commands", + func = function(name, param) + local function is_we_command(cmd) + return cmd:sub(0, 1) == "/" + end + local function format_help_line(cmd, def) + local msg = minetest.colorize("#00ffff", "/"..cmd) + if def.params and def.params ~= "" then + msg = msg .. " " .. def.params + end + if def.description and def.description ~= "" then + msg = msg .. ": " .. def.description + end + return msg + end + + if not minetest.check_player_privs(name, "worldedit") then + return false, "You are not allowed to use any WorldEdit commands." + end + if param == "" then + local msg = "" + local cmds = {} + for cmd, def in pairs(minetest.chatcommands) do + if is_we_command(cmd) and minetest.check_player_privs(name, def.privs) then + cmds[#cmds + 1] = cmd:sub(2) -- strip the / + end + end + table.sort(cmds) + return true, "Available commands: " .. table.concat(cmds, " ") .. "\n" + .. "Use '//help ' to get more information," + .. " or '//help all' to list everything." + elseif param == "all" then + local cmds = {} + for cmd, def in pairs(minetest.chatcommands) do + if is_we_command(cmd) and minetest.check_player_privs(name, def.privs) then + cmds[#cmds + 1] = format_help_line(cmd, def) + end + end + table.sort(cmds) + return true, "Available commands:\n"..table.concat(cmds, "\n") + else + return minetest.chatcommands["help"].func(name, "/" .. param) + end + end, +}) + minetest.register_chatcommand("/inspect", { params = "on/off/1/0/true/false/yes/no/enable/disable/", description = "Enable or disable node inspection", @@ -110,16 +162,28 @@ minetest.register_chatcommand("/inspect", { end, }) +local function get_node_rlight(pos) + local vecs = { -- neighboring nodes + {x= 1, y= 0, z= 0}, + {x=-1, y= 0, z= 0}, + {x= 0, y= 1, z= 0}, + {x= 0, y=-1, z= 0}, + {x= 0, y= 0, z= 1}, + {x= 0, y= 0, z=-1}, + } + local ret = 0 + for _, v in ipairs(vecs) do + ret = math.max(ret, minetest.get_node_light(vector.add(pos, v))) + end + return ret +end + minetest.register_on_punchnode(function(pos, node, puncher) local name = puncher:get_player_name() if worldedit.inspect[name] then - if minetest.check_player_privs(name, {worldedit=true}) then - local axis, sign = worldedit.player_axis(name) - message = string.format("inspector: %s at %s (param1=%d, param2=%d) punched by %s facing the %s axis", - node.name, minetest.pos_to_string(pos), node.param1, node.param2, name, axis .. (sign > 0 and "+" or "-")) - else - message = "inspector: worldedit privileges required" - end + local axis, sign = worldedit.player_axis(name) + message = string.format("inspector: %s at %s (param1=%d, param2=%d, received light=%d) punched facing the %s axis", + node.name, minetest.pos_to_string(pos), node.param1, node.param2, get_node_rlight(pos), axis .. (sign > 0 and "+" or "-")) worldedit.player_notify(name, message) end end) @@ -134,6 +198,8 @@ minetest.register_chatcommand("/reset", { worldedit.mark_pos1(name) worldedit.mark_pos2(name) worldedit.set_pos[name] = nil + --make sure the user does not try to confirm an operation after resetting pos: + reset_pending(name) worldedit.player_notify(name, "region reset") end, }) @@ -516,6 +582,39 @@ minetest.register_chatcommand("/cylinder", { end, check_cylinder), }) +local check_pyramid = function(name, param) + if worldedit.pos1[name] == nil then + worldedit.player_notify(name, "no position 1 selected") + return nil + end + local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local node = get_node(name, nodename) + if not node then return nil end + height = tonumber(height) + return math.ceil(((height * 2 + 1) ^ 2) * height / 3) +end + +minetest.register_chatcommand("/hollowpyramid", { + params = "x/y/z/? ", + description = "Add hollow pyramid centered at WorldEdit position 1 along the x/y/z/? axis with height , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") + height = tonumber(height) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + height = height * sign + end + local node = get_node(name, nodename) + local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node, true) + worldedit.player_notify(name, count .. " nodes added") + end, check_pyramid), +}) + minetest.register_chatcommand("/pyramid", { params = "x/y/z/? ", description = "Add pyramid centered at WorldEdit position 1 along the x/y/z/? axis with height , composed of ", @@ -530,22 +629,7 @@ minetest.register_chatcommand("/pyramid", { local node = get_node(name, nodename) local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node) worldedit.player_notify(name, count .. " nodes added") - end, - function(name, param) - if worldedit.pos1[name] == nil then - worldedit.player_notify(name, "no position 1 selected") - return nil - end - local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") - if found == nil then - worldedit.player_notify(name, "invalid usage: " .. param) - return nil - end - local node = get_node(name, nodename) - if not node then return nil end - height = tonumber(height) - return math.ceil(((height * 2 + 1) ^ 2) * height / 3) - end), + end, check_pyramid), }) minetest.register_chatcommand("/spiral", { @@ -570,7 +654,7 @@ minetest.register_chatcommand("/spiral", { end local node = get_node(name, nodename) if not node then return nil end - return check_region(name, param) + return 1 -- TODO: return an useful value end), }) @@ -838,6 +922,30 @@ minetest.register_chatcommand("/fixlight", { end), }) +minetest.register_chatcommand("/drain", { + params = "", + description = "Remove any fluid node within the current WorldEdit region", + privs = {worldedit=true}, + func = safe_region(function(name, param) + -- TODO: make an API function for this + local count = 0 + local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) + for x = pos1.x, pos2.x do + for y = pos1.y, pos2.y do + for z = pos1.z, pos2.z do + local n = minetest.get_node({x=x, y=y, z=z}).name + local d = minetest.registered_nodes[n] + if d ~= nil and (d["drawtype"] == "liquid" or d["drawtype"] == "flowingliquid") then + minetest.remove_node({x=x, y=y, z=z}) + count = count + 1 + end + end + end + end + worldedit.player_notify(name, count .. " nodes updated") + end), +}) + minetest.register_chatcommand("/hide", { params = "", description = "Hide all nodes in the current WorldEdit region non-destructively", @@ -1015,11 +1123,6 @@ minetest.register_chatcommand("/lua", { description = "Executes as a Lua chunk in the global namespace", privs = {worldedit=true, server=true}, func = function(name, param) - local admin = minetest.setting_get("name") - if not admin or not name == admin then - worldedit.player_notify(name, "this command can only be run by the server administrator") - return - end local err = worldedit.lua(param) if err then worldedit.player_notify(name, "code error: " .. err) @@ -1034,12 +1137,6 @@ minetest.register_chatcommand("/luatransform", { description = "Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region", privs = {worldedit=true, server=true}, func = safe_region(function(name, param) - local admin = minetest.setting_get("name") - if not admin or not name == admin then - worldedit.player_notify(name, "this command can only be run by the server administrator") - return - end - local err = worldedit.luatransform(worldedit.pos1[name], worldedit.pos2[name], param) if err then worldedit.player_notify(name, "code error: " .. err, false) @@ -1127,8 +1224,8 @@ minetest.register_chatcommand("/mtschemprob", { return end for k,v in pairs(problist) do - local prob = math.floor(((v["prob"] / 256) * 100) * 100 + 0.5) / 100 - text = text .. minetest.pos_to_string(v["pos"]) .. ": " .. prob .. "% | " + local prob = math.floor(((v.prob / 256) * 100) * 100 + 0.5) / 100 + text = text .. minetest.pos_to_string(v.pos) .. ": " .. prob .. "% | " end worldedit.player_notify(name, "currently set node probabilities:") worldedit.player_notify(name, text) @@ -1138,16 +1235,14 @@ minetest.register_chatcommand("/mtschemprob", { end, }) -minetest.register_on_player_receive_fields( - function(player, formname, fields) - if (formname == "prob_val_enter") and (fields.text ~= "") then - local name = player:get_player_name() - local prob_entry = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} - local index = table.getn(worldedit.prob_list[name]) + 1 - worldedit.prob_list[name][index] = prob_entry - end +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "prob_val_enter" and not (fields.text == "" or fields.text == nil) then + local name = player:get_player_name() + local prob_entry = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} + local index = table.getn(worldedit.prob_list[name]) + 1 + worldedit.prob_list[name][index] = prob_entry end -) +end) minetest.register_chatcommand("/clearobjects", { params = "", diff --git a/mods/WorldEdit/worldedit_commands/mark.lua b/mods/WorldEdit/worldedit_commands/mark.lua old mode 100755 new mode 100644 index 4062cae0..9d41bda3 --- a/mods/WorldEdit/worldedit_commands/mark.lua +++ b/mods/WorldEdit/worldedit_commands/mark.lua @@ -58,8 +58,19 @@ worldedit.mark_region = function(name) end worldedit.marker_region[name] = nil end + if pos1 ~= nil and pos2 ~= nil then local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local vec = vector.subtract(pos2, pos1) + local maxside = math.max(vec.x, math.max(vec.y, vec.z)) + local limit = tonumber(minetest.setting_get("active_object_send_range_blocks")) * 16 + if maxside > limit * 1.5 then + -- The client likely won't be able to see the plane markers as intended anyway, + -- thus don't place them and also don't load the area into memory + return + end + local thickness = 0.2 local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 @@ -72,24 +83,28 @@ worldedit.mark_region = function(name) --XY plane markers for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "worldedit:region_cube") - marker:set_properties({ - visual_size={x=sizex * 2, y=sizey * 2}, - collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness}, - }) - marker:get_luaentity().player_name = name - table.insert(markers, marker) + if marker ~= nil then + marker:set_properties({ + visual_size={x=sizex * 2, y=sizey * 2}, + collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness}, + }) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end end --YZ plane markers for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "worldedit:region_cube") - marker:set_properties({ - visual_size={x=sizez * 2, y=sizey * 2}, - collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez}, - }) - marker:setyaw(math.pi / 2) - marker:get_luaentity().player_name = name - table.insert(markers, marker) + if marker ~= nil then + marker:set_properties({ + visual_size={x=sizez * 2, y=sizey * 2}, + collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez}, + }) + marker:setyaw(math.pi / 2) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end end worldedit.marker_region[name] = markers @@ -153,7 +168,11 @@ minetest.register_entity(":worldedit:region_cube", { end end, on_punch = function(self, hitter) - for _, entity in ipairs(worldedit.marker_region[self.player_name]) do + local markers = worldedit.marker_region[self.player_name] + if not markers then + return + end + for _, entity in ipairs(markers) do entity:remove() end worldedit.marker_region[self.player_name] = nil diff --git a/mods/WorldEdit/worldedit_commands/safe.lua b/mods/WorldEdit/worldedit_commands/safe.lua old mode 100755 new mode 100644 index e640853f..a93e393b --- a/mods/WorldEdit/worldedit_commands/safe.lua +++ b/mods/WorldEdit/worldedit_commands/safe.lua @@ -30,6 +30,10 @@ local function safe_region(callback, nodes_needed) end end +local function reset_pending(name) + safe_region_callback[name], safe_region_param[name] = nil, nil +end + minetest.register_chatcommand("/y", { params = "", description = "Confirm a pending operation", @@ -40,15 +44,8 @@ minetest.register_chatcommand("/y", { return end - --obtain positions - 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 - safe_region_callback[name], safe_region_param[name] = nil, nil --reset pending operation - callback(name, param, pos1, pos2) + callback(name, param) end, }) @@ -64,5 +61,5 @@ minetest.register_chatcommand("/n", { end, }) -return safe_region, check_region +return safe_region, check_region, reset_pending diff --git a/mods/WorldEdit/worldedit_commands/textures/worldedit_cube.png b/mods/WorldEdit/worldedit_commands/textures/worldedit_cube.png old mode 100755 new mode 100644 index 075a9cb37ddf719b8ac645f2844000a08d336f74..fde36a8782e7c44d2aea80a82ec486797e1a6497 GIT binary patch delta 128 zcmd0t%s4@^ij9GRLH_gqL?FeM|H(?D8gCb5n0T@z;_6Q8AUa`8i0cA zC7!;n?00!2gw({O8q2(aLJFQPjv*GOlM@mWew=4ud~!)7^WS-cS51N9J-ZSn>|kK< Xe^=kAud~wysFuOg)z4*}Q$iB}q>CuA delta 86 zcmbQtm^nc*fSG}TK|_~67)Y@N_=LCuX&_jdzVkegVk`;r3ubV5b|VeQ5%hF%45?sD hPH<`Fd7-52&C1{^z|g38!axe7!_(EzWt~$(696SG6b1kQ diff --git a/mods/WorldEdit/worldedit_commands/textures/worldedit_pos1.png b/mods/WorldEdit/worldedit_commands/textures/worldedit_pos1.png old mode 100755 new mode 100644 index cbd43372493bd61e8398d2ad3d5d561eeeef7f61..4c304aa88d80420e8f4f005d7f0030234210d5ed GIT binary patch delta 124 zcmb>KW1JvS#=*wGz##wme8eR=RK?hG4#}JFt$tej5Kh8TS zE;!Qg-)G9Lb1p5f|4q(5Q12DSYgZ6qLB5^n1LZem-p`cDyBUkGdx}WT-G@yGywqO Cu^?Cg diff --git a/mods/WorldEdit/worldedit_commands/textures/worldedit_pos2.png b/mods/WorldEdit/worldedit_commands/textures/worldedit_pos2.png old mode 100755 new mode 100644 index 52147808da53deab104caffc027ba6d34aadb754..1502f165cade2b7af27af34b4d6d7b02aca03268 GIT binary patch delta 141 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 Dhc;RF diff --git a/mods/WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png b/mods/WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..f57436ca16aef91522a9af86f6254b837fbd5b30 GIT binary patch literal 597 zcmV-b0;>IqP)uIyy&3M_XH4US3{eVq#-sV`*t=Y;0_9Zf=Bx zgocKOiHV7gjg6C&la`j2n3$NGo131Vo}{FtrKP2&rlzN-r>Ll?tE;QGx3|5$y}`l3 z!otGI$;r;n&e74)($dn?)6>`2*Vx$D+}zyV-QDQu=;`U{?Ck9B?(XmJ@9^;O@bK{Q z@$vTd_V@Sq`1ttw`T70*{r~^};APuH0000!bW%=J0HdU&rKhK>tgWrEv9h+jy}rJ{ z!NSSP%goNu(9zP>)z;S5*xcXY;pOJ&=;`b1?(XyS_4oJp`1$+%{QbwHx{?3@00Cl4 zM?^n9V=#39007ZRL_t(I%e~ac4#F@HMbQj3q4(Z|00000NkvXXu0mjfa5^C* literal 0 HcmV?d00001 diff --git a/mods/WorldEdit/worldedit_shortcommands/init.lua b/mods/WorldEdit/worldedit_shortcommands/init.lua index a3cbb675..a4350ae5 100755 --- a/mods/WorldEdit/worldedit_shortcommands/init.lua +++ b/mods/WorldEdit/worldedit_shortcommands/init.lua @@ -31,6 +31,7 @@ worldedit.alias_chatcommand("/hdo", "/hollowdome") worldedit.alias_chatcommand("/do", "/dome") worldedit.alias_chatcommand("/hcyl", "/hollowcylinder") worldedit.alias_chatcommand("/cyl", "/cylinder") +worldedit.alias_chatcommand("/hpyr", "/hollowpyramid") worldedit.alias_chatcommand("/pyr", "/pyramid") worldedit.alias_chatcommand("/spl", "/spiral") worldedit.alias_chatcommand("/m", "/move") @@ -47,4 +48,4 @@ worldedit.alias_chatcommand("/hlt", "/highlight") worldedit.alias_chatcommand("/rsr", "/restore") worldedit.alias_chatcommand("/l", "/lua") worldedit.alias_chatcommand("/lt", "/luatransform") -worldedit.alias_chatcommand("/clro", "/clearobjects") \ No newline at end of file +worldedit.alias_chatcommand("/clro", "/clearobjects")