worldedit = worldedit or {}\r
+local minetest = minetest --local copy of global\r
\r
--modifies positions `pos1` and `pos2` so that each component of `pos1` is less than or equal to its corresponding conent of `pos2`, returning two new positions\r
worldedit.sort_pos = function(pos1, pos2)\r
})\r
\r
--hides all nodes in a region defined by positions `pos1` and `pos2` by non-destructively replacing them with invisible nodes, returning the number of nodes hidden\r
-worldedit.hide = function(pos1, pos2, tenv)\r
- local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
- if env == nil then env = minetest.env end\r
+worldedit.hide = function(pos1, pos2)\r
+ --make area stay loaded\r
+ local manip = minetest.get_voxel_manip()\r
+ manip:read_from_map(pos1, pos2)\r
\r
+ local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
local pos = {x=pos1.x, y=0, z=0}\r
- local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
+ local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node\r
while pos.x <= pos2.x do\r
pos.y = pos1.y\r
while pos.y <= pos2.y do\r
pos.z = pos1.z\r
while pos.z <= pos2.z do\r
- local node = env:get_node(pos)\r
- placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
- local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
- env:add_node(pos, placeholder) --add placeholder node\r
- local meta = env:get_meta(pos) --obtain placeholder meta\r
- meta:from_table(data) --set placeholder metadata to the original node's metadata\r
- meta:set_string("worldedit_placeholder", node.name) --add the node's name\r
+ local node = get_node(pos)\r
+ if node.name ~= "worldedit:placeholder" then\r
+ local data = get_meta(pos):to_table() --obtain metadata of original node\r
+ data.fields.worldedit_placeholder = node.name --add the node's name\r
+ node.name = "worldedit:placeholder" --set node name\r
+ add_node(pos, node) --add placeholder node\r
+ get_meta(pos):from_table(data) --set placeholder metadata to the original node's metadata\r
+ end\r
pos.z = pos.z + 1\r
end\r
pos.y = pos.y + 1\r
end\r
\r
--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\r
-worldedit.suppress = function(pos1, pos2, nodename, tenv)\r
- local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
- if env == nil then env = minetest.env end\r
+worldedit.suppress = function(pos1, pos2, nodename)\r
+ --ignore placeholder supression\r
+ if nodename == "worldedit:placeholder" then\r
+ return 0\r
+ end\r
+\r
+ --make area stay loaded\r
+ local manip = minetest.get_voxel_manip()\r
+ manip:read_from_map(pos1, pos2)\r
\r
- local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
+ local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
local nodes = minetest.find_nodes_in_area(pos1, pos2, nodename)\r
+ local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node\r
for _, pos in ipairs(nodes) do\r
- local node = env:get_node(pos)\r
- placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
- local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
- env:add_node(pos, placeholder) --add placeholder node\r
- local meta = env:get_meta(pos) --obtain placeholder meta\r
- meta:from_table(data) --set placeholder metadata to the original node's metadata\r
- meta:set_string("worldedit_placeholder", nodename) --add the node's name\r
+ local node = get_node(pos)\r
+ local data = get_meta(pos):to_table() --obtain metadata of original node\r
+ data.fields.worldedit_placeholder = node.name --add the node's name\r
+ node.name = "worldedit:placeholder" --set node name\r
+ add_node(pos, node) --add placeholder node\r
+ get_meta(pos):from_table(data) --set placeholder metadata to the original node's metadata\r
end\r
return #nodes\r
end\r
\r
--highlights all instances of `nodename` in a region defined by positions `pos1` and `pos2` by non-destructively hiding all other nodes, returning the number of nodes found\r
-worldedit.highlight = function(pos1, pos2, nodename, tenv)\r
- local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
- if env == nil then env = minetest.env end\r
-\r
- if minetest.registered_nodes[nodename] == nil then\r
- nodename = "default:" .. nodename\r
- end\r
+worldedit.highlight = function(pos1, pos2, nodename)\r
+ --make area stay loaded\r
+ local manip = minetest.get_voxel_manip()\r
+ manip:read_from_map(pos1, pos2)\r
\r
+ local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
local pos = {x=pos1.x, y=0, z=0}\r
- local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
+ local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node\r
local count = 0\r
- while pos.x <= pos2.x do --wip: see if this can be sped up like worldedit.suppress, except with hashed found node positions and testing against the set\r
+ while pos.x <= pos2.x do\r
pos.y = pos1.y\r
while pos.y <= pos2.y do\r
pos.z = pos1.z\r
while pos.z <= pos2.z do\r
- local node = env:get_node(pos)\r
+ local node = get_node(pos)\r
if node.name == nodename then --node found\r
count = count + 1\r
- else --hide other nodes\r
- placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
- local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
- env:add_node(pos, placeholder) --add placeholder node\r
- local meta = env:get_meta(pos) --obtain placeholder meta\r
- meta:from_table(data) --set placeholder metadata to the original node's metadata\r
- meta:set_string("worldedit_placeholder", node.name) --add the node's name\r
+ elseif node.name ~= "worldedit:placeholder" then --hide other nodes\r
+ local data = get_meta(pos):to_table() --obtain metadata of original node\r
+ data.fields.worldedit_placeholder = node.name --add the node's name\r
+ node.name = "worldedit:placeholder" --set node name\r
+ add_node(pos, node) --add placeholder node\r
+ get_meta(pos):from_table(data) --set placeholder metadata to the original node's metadata\r
end\r
pos.z = pos.z + 1\r
end\r
end\r
\r
--restores all nodes hidden with WorldEdit functions in a region defined by positions `pos1` and `pos2`, returning the number of nodes restored\r
-worldedit.restore = function(pos1, pos2, tenv)\r
- local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
- if env == nil then env = minetest.env end\r
+worldedit.restore = function(pos1, pos2)\r
+ --make area stay loaded\r
+ local manip = minetest.get_voxel_manip()\r
+ manip:read_from_map(pos1, pos2)\r
\r
- local node = {name="", param1=0, param2=0}\r
- local nodes = minetest.find_nodes_in_area(pos1, pos2, nodename)\r
+ local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
+ local nodes = minetest.find_nodes_in_area(pos1, pos2, "worldedit:placeholder")\r
+ local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node\r
for _, pos in ipairs(nodes) do\r
- local currentnode = env:get_node(pos)\r
- node.param1, node.param2 = currentnode.param1, currentnode.param2 --copy node's param1 and param2\r
- local data = env:get_meta(pos):to_table() --obtain node metadata\r
+ local node = get_node(pos)\r
+ local data = get_meta(pos):to_table() --obtain node metadata\r
node.name = data.fields.worldedit_placeholder --set node name\r
data.fields.worldedit_placeholder = nil --delete old nodename\r
- env:add_node(pos, placeholder) --add original node\r
- env:get_meta(pos):from_table(data) --set original node metadata\r
+ add_node(pos, node) --add original node\r
+ get_meta(pos):from_table(data) --set original node metadata\r
end\r
return #nodes\r
end\r