Add mapgen part with a schematic to generate
commit
b76b4987e8
|
@ -0,0 +1,13 @@
|
||||||
|
People can't mapgen
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Depends: default
|
||||||
|
|
||||||
|
Licenses
|
||||||
|
----------
|
||||||
|
|
||||||
|
Source code:
|
||||||
|
WTFPL (created by Krock)
|
||||||
|
|
||||||
|
Flat schematics:
|
||||||
|
WTFPL (created by paramat)
|
|
@ -0,0 +1 @@
|
||||||
|
default
|
|
@ -0,0 +1,65 @@
|
||||||
|
-- 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)
|
Binary file not shown.
Loading…
Reference in New Issue