65 lines
1.7 KiB
Lua
65 lines
1.7 KiB
Lua
-- peoplecantmapgen - Generate flats randomly
|
|
|
|
local flat_path = minetest.get_modpath("peoplecantmapgen") .. "/schems/flat.mts"
|
|
|
|
minetest.register_on_generated(function(minp, maxp, seed)
|
|
if maxp.y < 2 and minp.y > 0 then
|
|
-- Only generate this stuff around the y=0 position
|
|
return
|
|
end
|
|
|
|
local rand = PseudoRandom(seed + 1234321)
|
|
|
|
if rand:next(0, 100) < 50 then
|
|
-- Skip the half of all generated chunks
|
|
return
|
|
end
|
|
|
|
-- Convert some nodes into content IDs to use in the VoxelManipulator
|
|
local c_air = minetest.get_content_id("air")
|
|
local c_grass = minetest.get_content_id("default:dirt_with_grass")
|
|
|
|
-- Load all the mapgen stuff
|
|
local vm = minetest.get_voxel_manip()
|
|
local emin, emax = vm:read_from_map(minp, maxp)
|
|
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
|
-- Array that contains all content IDs of this chunk
|
|
local data = vm:get_data()
|
|
|
|
-- Make a random position
|
|
local random_pos = {
|
|
-- x,z: Do not generate on borders
|
|
x = rand:next(minp.x + 5, maxp.x - 5),
|
|
-- y: Dummy value
|
|
y = -1,
|
|
z = rand:next(minp.z + 5, maxp.z - 5)
|
|
}
|
|
|
|
-- Searching the ground position
|
|
|
|
local found = false
|
|
local last = -1 -- Last content ID, -1 does not exist
|
|
|
|
-- From top->down start at y=30
|
|
for y = 30, 0, -1 do
|
|
random_pos.y = y
|
|
-- Get the content ID of the position in random_pos
|
|
last = data[area:index(random_pos.x, random_pos.y, random_pos.z)]
|
|
if last ~= c_air then
|
|
-- Found something solid, exit the loop
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if found and last == c_grass then
|
|
-- Found grassy ground, place our flat
|
|
minetest.place_schematic(
|
|
random_pos,
|
|
flat_path,
|
|
"random", -- Random rotation
|
|
nil, -- No replacements
|
|
true -- Forced placement
|
|
)
|
|
end
|
|
end) |