59 lines
1.5 KiB
Lua
59 lines
1.5 KiB
Lua
local air_cid = minetest.get_content_id("air")
|
|
|
|
-- table: fn(pos1, pos2, node_ids)
|
|
local removal_callbacks = {}
|
|
local before_removal_callbacks = {}
|
|
|
|
function pick_and_place.remove_area(pos1, pos2)
|
|
local manip = minetest.get_voxel_manip()
|
|
local e1, e2 = manip:read_from_map(pos1, pos2)
|
|
local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2})
|
|
|
|
local node_data = manip:get_data()
|
|
local param2 = manip:get_param2_data()
|
|
local node_ids = {}
|
|
|
|
for z=pos1.z,pos2.z do
|
|
for x=pos1.x,pos2.x do
|
|
for y=pos1.y,pos2.y do
|
|
local i = area:index(x,y,z)
|
|
local nodeid = node_data[i]
|
|
node_ids[nodeid] = true
|
|
node_data[i] = air_cid
|
|
param2[i] = 0
|
|
end
|
|
end
|
|
end
|
|
|
|
for _, fn in ipairs(before_removal_callbacks) do
|
|
fn(pos1, pos2, node_ids)
|
|
end
|
|
|
|
manip:set_data(node_data)
|
|
manip:set_param2_data(param2)
|
|
manip:write_to_map()
|
|
|
|
-- clear metadata
|
|
local nodes_with_meta = minetest.find_nodes_with_meta(pos1, pos2)
|
|
for _, pos in ipairs(nodes_with_meta) do
|
|
local meta = minetest.get_meta(pos)
|
|
meta:from_table({})
|
|
end
|
|
|
|
local objects = minetest.get_objects_in_area(pos1, pos2)
|
|
for _, obj in ipairs(objects) do
|
|
obj:remove()
|
|
end
|
|
|
|
for _, fn in ipairs(removal_callbacks) do
|
|
fn(pos1, pos2, node_ids)
|
|
end
|
|
end
|
|
|
|
function pick_and_place.register_on_remove(fn)
|
|
table.insert(removal_callbacks, fn)
|
|
end
|
|
|
|
function pick_and_place.register_on_before_remove(fn)
|
|
table.insert(before_removal_callbacks, fn)
|
|
end |