Page 1 of 1

Why doesn't fill this code the air?

Posted: Thu Feb 16, 2017 19:05
by burli
I want to find air in a map. To test my code I replace air with meselamp. But it doesn't fill everything. The gap is 39 nodes wide, the filled area 41 nodes

Edit: it also happens if I remove the if statement and try to overwrite each node

Code: Select all

minetest.register_on_generated(function(minp, maxp)
	local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
	local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
	local data = vm:get_data()
	local c_air = minetest.get_content_id("air")
	local c_glass = minetest.get_content_id("default:meselamp")

	for z = minp.z, maxp.z do
	for y = minp.y, maxp.y do
	for x = minp.x, maxp.x do
		local vi = a:index(x, y, z)
		if data[vi] == c_air then
			data[vi] = c_glass
		end
	end
	end
	end

	vm:set_data(data)
	vm:write_to_map()
end)
Image

Re: Why doesn't fill this code the air?

Posted: Fri Feb 17, 2017 19:23
by paramat
Now solved.

Re: Why doesn't fill this code the air?

Posted: Fri Feb 17, 2017 19:48
by rubenwardy
For reference
paramat wrote:Try local a = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
The voxelarea is always set to emin, emax which is the minimum volume of complete mapblocks that contains the requested volume.
With the mapgen object voxelmanip, although the mapchunk is minp to maxp 5^3 mapblocks, the actual processed volume is that plus a 1-mapblock deep shell of mapblocks (that overlap with other mapchunks), so 7^3 mapblocks.
https://github.com/minetest/minetest/issues/5254

Re: Why doesn't fill this code the air?

Posted: Fri Feb 17, 2017 19:53
by burli
Thanks. Had no time to update here