Minetest-WorldEditAdditions/worldeditadditions/lib/wireframe/wire_box.lua

60 lines
2.1 KiB
Lua

local v3 = worldeditadditions_core.Vector3
---
-- @module worldeditadditions
-- ██ ██ ██ ██████ ███████ ██████ ██████ ██ ██
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-- ██ █ ██ ██ ██████ █████ ██████ ██ ██ ███
-- ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-- ███ ███ ██ ██ ██ ███████ ██████ ██████ ██ ██
--- Fills the edges of the selection box with nodes.
-- @param pos1 Vector3 The 1st position defining the WorldEdit selection
-- @param pos2 Vector3 The 2nd positioon defining the WorldEdit selection
-- @param node string Name of the node to place
function worldeditadditions.wire_box(pos1,pos2,node)
local node_id_replace = minetest.get_content_id(node)
local ps1, ps2 = v3.sort(pos1,pos2)
-- Fetch the nodes in the specified area
local manip, area = worldedit.manip_helpers.init(pos1, pos2)
local data = manip:get_data()
-- Using three loops to reduce the number of nodes processed
local counts = { replaced = 0 }
for z = ps1.z,ps2.z do
for _j,y in pairs({pos1.y,pos2.y}) do
for _k,x in pairs({pos1.x,pos2.x}) do
data[area:index(x, y, z)] = node_id_replace
counts.replaced = counts.replaced + 1
end
end
end
if math.abs(ps2.y-ps1.y) > 1 then
for _j,z in pairs({pos1.z,pos2.z}) do
for y = pos1.y+1,pos2.y-1 do
for _k,x in pairs({pos1.x,pos2.x}) do
data[area:index(x, y, z)] = node_id_replace
counts.replaced = counts.replaced + 1
end
end
end
end
if math.abs(ps2.x-ps1.x) > 1 then
for _j,z in pairs({pos1.z,pos2.z}) do
for _k,y in pairs({pos1.y,pos2.y}) do
for x = pos1.x+1,pos2.x-1 do
data[area:index(x, y, z)] = node_id_replace
counts.replaced = counts.replaced + 1
end
end
end
end
-- Save the modified nodes back to disk & return
worldedit.manip_helpers.finish(manip, data)
return true, counts.replaced
end