From c1f3cfc1e43668d07e95271febc261c82478f7aa Mon Sep 17 00:00:00 2001 From: Anthony Zhang Date: Sun, 28 Jul 2013 18:15:46 -0400 Subject: [PATCH] Fix bugs in visualization API and make it ore robust. Fix bugs in //fixedpos, //suppress, and //highlight. --- worldedit/primitives.lua | 5 ++-- worldedit/serialization.lua | 2 +- worldedit/visualization.lua | 47 ++++++++++++++++++------------------- worldedit_commands/init.lua | 12 ++++------ 4 files changed, 30 insertions(+), 36 deletions(-) diff --git a/worldedit/primitives.lua b/worldedit/primitives.lua index b4b7bc7..cdb6e0f 100644 --- a/worldedit/primitives.lua +++ b/worldedit/primitives.lua @@ -136,7 +136,7 @@ worldedit.hollow_dome = function(pos, radius, nodename) end --adds a dome centered at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added -worldedit.dome = function(pos, radius, nodename) --wip: use bresenham sphere for maximum speed +worldedit.dome = function(pos, radius, nodename) --set up voxel manipulator local manip = minetest.get_voxel_manip() local pos1 = {x=pos.x - radius, y=pos.y, z=pos.z - radius} @@ -361,9 +361,8 @@ worldedit.pyramid = function(pos, height, nodename, env) end --adds a spiral centered at `pos` with width `width`, height `height`, space between walls `spacer`, composed of `nodename`, returning the number of nodes added -worldedit.spiral = function(pos, width, height, spacer, nodename, env) --wip: clean this up +worldedit.spiral = function(pos, width, height, spacer, nodename, env) --wip: rewrite this whole thing, nobody can understand it anyways -- spiral matrix - http://rosettacode.org/wiki/Spiral_matrix#Lua - --wip: rewrite this whole thing, nobody can understand it anyways av, sn = math.abs, function(s) return s~=0 and s/av(s) or 0 end local function sindex(z, x) -- returns the value at (x, z) in a spiral that starts at 1 and goes outwards if z == -x and z >= x then return (2*z+1)^2 end diff --git a/worldedit/serialization.lua b/worldedit/serialization.lua index e0d960d..5fbc16c 100644 --- a/worldedit/serialization.lua +++ b/worldedit/serialization.lua @@ -33,7 +33,7 @@ worldedit.valueversion = function(value) end --converts the region defined by positions `pos1` and `pos2` into a single string, returning the serialized data and the number of nodes serialized -worldedit.serialize = function(pos1, pos2) --wip: check for ItemStacks and whether they can be serialized +worldedit.serialize = function(pos1, pos2) --make area stay loaded local manip = minetest.get_voxel_manip() manip:read_from_map(pos1, pos2) diff --git a/worldedit/visualization.lua b/worldedit/visualization.lua index d654146..7b600d5 100644 --- a/worldedit/visualization.lua +++ b/worldedit/visualization.lua @@ -39,7 +39,6 @@ worldedit.hide = function(pos1, pos2) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) local pos = {x=pos1.x, y=0, z=0} - local placeholder = {name="worldedit:placeholder", param1=0, param2=0} local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node while pos.x <= pos2.x do pos.y = pos1.y @@ -47,12 +46,13 @@ worldedit.hide = function(pos1, pos2) pos.z = pos1.z while pos.z <= pos2.z do local node = get_node(pos) - placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2 - local data = get_meta(pos):to_table() --obtain metadata of original node - add_node(pos, placeholder) --add placeholder node - local meta = get_meta(pos) --obtain placeholder meta - meta:from_table(data) --set placeholder metadata to the original node's metadata - meta:set_string("worldedit_placeholder", node.name) --add the node's name + if node.name ~= "worldedit:placeholder" then + local data = get_meta(pos):to_table() --obtain metadata of original node + data.fields.worldedit_placeholder = node.name --add the node's name + node.name = "worldedit:placeholder" --set node name + add_node(pos, node) --add placeholder node + get_meta(pos):from_table(data) --set placeholder metadata to the original node's metadata + end pos.z = pos.z + 1 end pos.y = pos.y + 1 @@ -64,22 +64,25 @@ end --suppresses all instances of `nodename` in a region defined by positions `pos1` and `pos2` by non-destructively replacing them with invisible nodes, returning the number of nodes suppressed worldedit.suppress = function(pos1, pos2, nodename) + --ignore placeholder supression + if nodename == "worldedit:placeholder" then + return 0 + end + --make area stay loaded local manip = minetest.get_voxel_manip() manip:read_from_map(pos1, pos2) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - local placeholder = {name="worldedit:placeholder", param1=0, param2=0} local nodes = minetest.find_nodes_in_area(pos1, pos2, nodename) local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node for _, pos in ipairs(nodes) do local node = get_node(pos) - placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2 local data = get_meta(pos):to_table() --obtain metadata of original node - add_node(pos, placeholder) --add placeholder node - local meta = get_meta(pos) --obtain placeholder meta - meta:from_table(data) --set placeholder metadata to the original node's metadata - meta:set_string("worldedit_placeholder", nodename) --add the node's name + data.fields.worldedit_placeholder = node.name --add the node's name + node.name = "worldedit:placeholder" --set node name + add_node(pos, node) --add placeholder node + get_meta(pos):from_table(data) --set placeholder metadata to the original node's metadata end return #nodes end @@ -92,7 +95,6 @@ worldedit.highlight = function(pos1, pos2, nodename) --wip: speed this up with v local pos1, pos2 = worldedit.sort_pos(pos1, pos2) local pos = {x=pos1.x, y=0, z=0} - local placeholder = {name="worldedit:placeholder", param1=0, param2=0} local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node local count = 0 while pos.x <= pos2.x do @@ -103,13 +105,12 @@ worldedit.highlight = function(pos1, pos2, nodename) --wip: speed this up with v local node = get_node(pos) if node.name == nodename then --node found count = count + 1 - else --hide other nodes - placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2 + elseif node.name ~= "worldedit:placeholder" then --hide other nodes local data = get_meta(pos):to_table() --obtain metadata of original node - add_node(pos, placeholder) --add placeholder node - local meta = get_meta(pos) --obtain placeholder meta - meta:from_table(data) --set placeholder metadata to the original node's metadata - meta:set_string("worldedit_placeholder", node.name) --add the node's name + data.fields.worldedit_placeholder = node.name --add the node's name + node.name = "worldedit:placeholder" --set node name + add_node(pos, node) --add placeholder node + get_meta(pos):from_table(data) --set placeholder metadata to the original node's metadata end pos.z = pos.z + 1 end @@ -127,16 +128,14 @@ worldedit.restore = function(pos1, pos2) manip:read_from_map(pos1, pos2) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - local node = {name="", param1=0, param2=0} local nodes = minetest.find_nodes_in_area(pos1, pos2, "worldedit:placeholder") local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node for _, pos in ipairs(nodes) do - local currentnode = get_node(pos) - node.param1, node.param2 = currentnode.param1, currentnode.param2 --copy node's param1 and param2 + local node = get_node(pos) local data = get_meta(pos):to_table() --obtain node metadata node.name = data.fields.worldedit_placeholder --set node name data.fields.worldedit_placeholder = nil --delete old nodename - add_node(pos, placeholder) --add original node + add_node(pos, node) --add original node get_meta(pos):from_table(data) --set original node metadata end return #nodes diff --git a/worldedit_commands/init.lua b/worldedit_commands/init.lua index 40f8ffc..0ecd093 100644 --- a/worldedit_commands/init.lua +++ b/worldedit_commands/init.lua @@ -183,7 +183,7 @@ minetest.register_chatcommand("/fixedpos", { worldedit.player_notify(name, "invalid usage: " .. param) return end - local pos = {x=x, y=y, z=z} + local pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} if flag == "set1" then worldedit.pos1[name] = pos worldedit.mark_pos1(name) @@ -887,11 +887,7 @@ minetest.register_chatcommand("/hide", { return end - local tenv = minetest.env - if worldedit.ENABLE_QUEUE then - tenv = worldedit.queue_aliasenv - end - local count = worldedit.hide(pos1, pos2, tenv) + local count = worldedit.hide(pos1, pos2) worldedit.player_notify(name, count .. " nodes hidden") end, }) @@ -907,7 +903,7 @@ minetest.register_chatcommand("/suppress", { return end - local node = worldedit.node_is_valid(param) + local node = worldedit.normalize_nodename(param) if param == "" or not node then worldedit.player_notify(name, "invalid node name: " .. param) return @@ -933,7 +929,7 @@ minetest.register_chatcommand("/highlight", { return end - local node = worldedit.node_is_valid(param) + local node = worldedit.normalize_nodename(param) if param == "" or not node then worldedit.player_notify(name, "invalid node name: " .. param) return