489 lines
14 KiB
Lua
489 lines
14 KiB
Lua
-- minetest/default/mapgen.lua
|
|
|
|
--
|
|
-- Aliases for map generator outputs
|
|
--
|
|
|
|
minetest.register_alias("mapgen_stone", "default:stone")
|
|
minetest.register_alias("mapgen_tree", "default:tree")
|
|
minetest.register_alias("mapgen_leaves", "default:leaves")
|
|
minetest.register_alias("mapgen_apple", "default:apple")
|
|
minetest.register_alias("mapgen_water_source", "default:water_source")
|
|
minetest.register_alias("mapgen_river_water_source", "default:water_source")
|
|
minetest.register_alias("mapgen_dirt", "default:dirt")
|
|
minetest.register_alias("mapgen_sand", "default:sand")
|
|
minetest.register_alias("mapgen_desert_sand", "default:sand")
|
|
minetest.register_alias("mapgen_desert_stone", "default:sandstone")
|
|
minetest.register_alias("mapgen_gravel", "default:gravel")
|
|
minetest.register_alias("mapgen_cobble", "default:cobble")
|
|
minetest.register_alias("mapgen_mossycobble", "default:reinforced_cobble")
|
|
minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
|
|
minetest.register_alias("mapgen_junglegrass", "default:grass")
|
|
minetest.register_alias("mapgen_stone_with_coal", "default:stone_with_coal")
|
|
minetest.register_alias("mapgen_stone_with_iron", "default:stone_with_iron")
|
|
minetest.register_alias("mapgen_mese", "default:block_steel")
|
|
minetest.register_alias("mapgen_stair_cobble", "default:reinforced_frame")
|
|
minetest.register_alias("mapgen_lava_source", "default:water_source")
|
|
|
|
--
|
|
-- Ore generation
|
|
--
|
|
|
|
minetest.register_ore(
|
|
{
|
|
ore_type = "scatter",
|
|
ore = "default:stone_with_coal",
|
|
wherein = "default:stone",
|
|
clust_scarcity = 8*8*8,
|
|
clust_num_ores = 6,
|
|
clust_size = 4,
|
|
height_min = -128,
|
|
height_max = 32,
|
|
})
|
|
|
|
minetest.register_ore(
|
|
{
|
|
ore_type = "scatter",
|
|
ore = "default:stone_with_coal",
|
|
wherein = "default:stone",
|
|
clust_scarcity = 8*8*8,
|
|
clust_num_ores = 20,
|
|
clust_size = 10,
|
|
height_min = -128,
|
|
height_max = -32,
|
|
})
|
|
|
|
minetest.register_ore(
|
|
{
|
|
ore_type = "scatter",
|
|
ore = "default:stone_with_iron",
|
|
wherein = "default:stone",
|
|
clust_scarcity = 8*8*8,
|
|
clust_num_ores = 6,
|
|
clust_size = 4,
|
|
height_min = -128,
|
|
height_max = 0,
|
|
})
|
|
|
|
minetest.register_ore(
|
|
{
|
|
ore_type = "scatter",
|
|
ore = "default:stone_with_iron",
|
|
wherein = "default:stone",
|
|
clust_scarcity = 8*8*8,
|
|
clust_num_ores = 20,
|
|
clust_size = 10,
|
|
height_min = -128,
|
|
height_max = -32,
|
|
})
|
|
|
|
minetest.register_ore(
|
|
{
|
|
ore_type = "blob",
|
|
ore = "default:block_steel",
|
|
wherein = "default:stone",
|
|
clust_scarcity = 8*8*8,
|
|
clust_num_ores = 10,
|
|
clust_size = 10,
|
|
height_min = -128,
|
|
height_max = -64,
|
|
})
|
|
|
|
function default.make_papyrus(pos, size)
|
|
for y=0,size-1 do
|
|
local p = {x=pos.x, y=pos.y+y, z=pos.z}
|
|
local nn = minetest.get_node(p).name
|
|
if minetest.registered_nodes[nn] and
|
|
minetest.registered_nodes[nn].buildable_to then
|
|
minetest.set_node(p, {name="default:papyrus"})
|
|
else
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function default.make_cactus(pos, size)
|
|
for y=0,size-1 do
|
|
local p = {x=pos.x, y=pos.y+y, z=pos.z}
|
|
local nn = minetest.get_node(p).name
|
|
if minetest.registered_nodes[nn] and
|
|
minetest.registered_nodes[nn].buildable_to then
|
|
minetest.set_node(p, {name="default:cactus"})
|
|
else
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function default.mgv6_ongen(minp, maxp, seed)
|
|
-- Generate cactuses
|
|
local perlin1 = minetest.get_perlin(230, 3, 0.6, 100)
|
|
-- Assume X and Z lengths are equal
|
|
local divlen = 16
|
|
local divs = (maxp.x-minp.x)/divlen+1;
|
|
for divx=0,divs-1 do
|
|
for divz=0,divs-1 do
|
|
local x0 = minp.x + math.floor((divx+0)*divlen)
|
|
local z0 = minp.z + math.floor((divz+0)*divlen)
|
|
local x1 = minp.x + math.floor((divx+1)*divlen)
|
|
local z1 = minp.z + math.floor((divz+1)*divlen)
|
|
-- Determine cactus amount from perlin noise
|
|
local cactus_amount = math.floor(perlin1:get2d({x=x0, y=z0}) * 6 - 3)
|
|
-- Find random positions for cactus based on this random
|
|
local pr = PseudoRandom(seed+1)
|
|
for i=0,cactus_amount do
|
|
local x = pr:next(x0, x1)
|
|
local z = pr:next(z0, z1)
|
|
-- Find ground level (0...15)
|
|
local ground_y = nil
|
|
for y=30,0,-1 do
|
|
if minetest.get_node({x=x,y=y,z=z}).name ~= "air" then
|
|
ground_y = y
|
|
break
|
|
end
|
|
end
|
|
if (ground_y and ground_y > 10) and minetest.get_node({x=x,y=ground_y,z=z}).name == "default:sand" then
|
|
default.make_cactus({x=x,y=ground_y+1,z=z}, pr:next(2, 3))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local pr = PseudoRandom(seed+541)
|
|
for x=minp.x,maxp.x do
|
|
for z=minp.z,maxp.z do
|
|
local perlin1=((minetest.get_perlin(5123, 3, 0.6, 1):get2d({x=x*0.03, y=z*0.03}) * 0.5) + 0.5)*60
|
|
if pr:next(0, 15) > perlin1 then
|
|
local ground_y = nil
|
|
|
|
for y=2,0,-1 do
|
|
if minetest.get_node({x=x,y=y,z=z}).name ~= "air" then
|
|
ground_y = y
|
|
break
|
|
end
|
|
end
|
|
|
|
local pos={x=x, y=ground_y, z=z}
|
|
|
|
if (ground_y and ground_y < 20) and minetest.get_node(pos).name == "default:sand" then
|
|
if minetest.find_node_near(pos, 3, {"group:water"}) then
|
|
default.make_papyrus({x=pos.x, y=pos.y+1, z=pos.z}, pr:next(1, 3))
|
|
end
|
|
end
|
|
end
|
|
|
|
local perlin2=((minetest.get_perlin(8175, 12, 0.8, 0.7):get2d({x=x*0.025, y=z*0.025}) * 0.5) + 0.5)*1000
|
|
if pr:next(0, 15) > perlin2 then
|
|
local ground_y = nil
|
|
for y=30,0,-1 do
|
|
if minetest.get_node({x=x,y=y,z=z}).name ~= "air" then
|
|
ground_y = y
|
|
break
|
|
end
|
|
end
|
|
if ground_y ~= nil then
|
|
local p = {x = x, y = ground_y+1, z = z}
|
|
local nn=minetest.get_node(p).name
|
|
if minetest.registered_nodes[nn] and
|
|
minetest.registered_nodes[nn].buildable_to then
|
|
nn = minetest.get_node({x=x,y=ground_y,z=z}).name
|
|
if nn == "default:dirt_with_grass" then
|
|
if pr:next(0, 100) < 1 then
|
|
minetest.set_node(p, {name = "farming:wheat_4"})
|
|
else
|
|
minetest.set_node(p, {name = "default:grass"})
|
|
end
|
|
elseif nn == "default:sand" and pr:next(0, 300) < 1 then
|
|
minetest.set_node(p, {name = "farming:cotton_4"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local mg_params = minetest.get_mapgen_params()
|
|
|
|
if mg_params.mgname == "v6" then
|
|
default.log("please use v5 or v7 mapgen instead; v6 mapgen may not work and is not supported.", "info")
|
|
-- minetest.register_on_generated(default.mgv6_ongen)
|
|
end
|
|
|
|
--
|
|
-- Biome setup
|
|
--
|
|
|
|
minetest.clear_registered_biomes()
|
|
|
|
-- Biomes
|
|
|
|
minetest.register_biome(
|
|
{
|
|
name = "Deep Forest",
|
|
node_top = "default:dirt_with_grass", depth_top = 1,
|
|
node_filler = "default:dirt", depth_filler = 6,
|
|
node_underwater = "default:dirt",
|
|
node_shore_top = "default:dirt",
|
|
node_shore_filler = "default:dirt", height_shore = 0,
|
|
y_min = 10, y_max = 50,
|
|
heat_point = 30, humidity_point = 40,
|
|
})
|
|
|
|
minetest.register_biome(
|
|
{
|
|
name = "Forest",
|
|
node_top = "default:dirt_with_grass", depth_top = 1,
|
|
node_filler = "default:dirt", depth_filler = 6,
|
|
node_underwater = "default:dirt",
|
|
node_shore_top = "default:sand",
|
|
node_shore_filler = "default:sandstone", height_shore = 0,
|
|
y_min = 0, y_max = 200,
|
|
heat_point = 35, humidity_point = 40,
|
|
})
|
|
|
|
minetest.register_biome(
|
|
{
|
|
name = "Grassland Ocean",
|
|
node_top = "default:sand", depth_top = 3,
|
|
node_filler = "default:dirt", depth_filler = 1,
|
|
node_underwater = "default:dirt",
|
|
node_shore_top = "default:sand",
|
|
node_shore_filler = "default:sand", height_shore = 0,
|
|
y_min = -32000, y_max = 2,
|
|
heat_point = 50, humidity_point = 35,
|
|
})
|
|
|
|
minetest.register_biome(
|
|
{
|
|
name = "Grassland",
|
|
node_top = "default:dirt_with_grass", depth_top = 1,
|
|
node_filler = "default:dirt", depth_filler = 3,
|
|
node_underwater = "default:dirt",
|
|
node_shore_top = "default:sand",
|
|
node_shore_filler = "default:sand", height_shore = 0,
|
|
y_min = 3, y_max = 32000,
|
|
heat_point = 50, humidity_point = 35,
|
|
})
|
|
|
|
minetest.register_biome(
|
|
{
|
|
name = "Desert",
|
|
node_top = "default:sand", depth_top = 3,
|
|
node_filler = "default:sandstone", depth_filler = 8,
|
|
node_underwater = "default:dirt",
|
|
node_shore_top = "default:sand",
|
|
node_shore_filler = "default:sand", height_shore = 0,
|
|
y_min = -32000, y_max = 32000,
|
|
heat_point = 80, humidity_point = 10,
|
|
})
|
|
|
|
-- Decorations
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_grass"},
|
|
sidelen = 16,
|
|
fill_ratio = 0.005,
|
|
biomes = {"Grassland"},
|
|
flags = "place_center_x, place_center_z",
|
|
schematic = minetest.get_modpath("default").."/schematics/default_tree.mts",
|
|
y_min = -32000,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_grass"},
|
|
sidelen = 16,
|
|
fill_ratio = 0.009,
|
|
biomes = {"Forest", "Deep Forest"},
|
|
flags = "place_center_x, place_center_z",
|
|
replacements = {["default:leaves"] = "default:leaves_oak", ["default:tree"] = "default:tree_oak", ["default:apple"] = "air"},
|
|
schematic = minetest.get_modpath("default").."/schematics/default_tree.mts",
|
|
y_min = -32000,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_grass"},
|
|
sidelen = 16,
|
|
fill_ratio = 0.028,
|
|
biomes = {"Deep Forest"},
|
|
flags = "place_center_x, place_center_z",
|
|
-- replacements = {["default:leaves"] = "default:leaves_birch", ["default:tree"] = "default:tree_birch"},
|
|
schematic = minetest.get_modpath("default").."/schematics/default_gigatree.mts",
|
|
y_min = -32000,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_grass"},
|
|
sidelen = 16,
|
|
fill_ratio = 0.004,
|
|
biomes = {"Forest"},
|
|
flags = "place_center_x, place_center_z",
|
|
replacements = {["default:leaves"] = "default:leaves_birch", ["default:tree"] = "default:tree_birch", ["default:apple"] = "air"},
|
|
schematic = minetest.get_modpath("default").."/schematics/default_squaretree.mts",
|
|
y_min = -32000,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_grass"},
|
|
sidelen = 16,
|
|
fill_ratio = 0.008,
|
|
biomes = {"Forest"},
|
|
flags = "place_center_x, place_center_z",
|
|
schematic = minetest.get_modpath("default").."/schematics/default_megatree.mts",
|
|
y_min = -32000,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:sand",
|
|
spawn_by = "default:water_source",
|
|
num_spawn_by = 2,
|
|
sidelen = 16,
|
|
fill_ratio = 0.07,
|
|
biomes = {"Grassland Ocean"},
|
|
decoration = {"default:papyrus"},
|
|
height = 2,
|
|
height_max = 3,
|
|
y_min = 0,
|
|
y_max = 5,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:dirt_with_grass",
|
|
sidelen = 16,
|
|
fill_ratio = 0.18,
|
|
biomes = {"Grassland"},
|
|
decoration = {"default:grass"},
|
|
y_min = 0,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:dirt_with_grass",
|
|
sidelen = 16,
|
|
fill_ratio = 0.08,
|
|
biomes = {"Forest", "Deep Forest"},
|
|
decoration = {"default:grass"},
|
|
y_min = 0,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:dirt_with_grass",
|
|
sidelen = 16,
|
|
fill_ratio = 0.08,
|
|
biomes = {"Forest"},
|
|
decoration = {"default:tall_grass"},
|
|
y_min = 0,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:dirt_with_grass",
|
|
sidelen = 16,
|
|
fill_ratio = 0.15,
|
|
biomes = {"Deep Forest"},
|
|
decoration = {"default:tall_grass"},
|
|
y_min = 0,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:dirt_with_grass",
|
|
sidelen = 16,
|
|
fill_ratio = 0.006,
|
|
biomes = {"Grassland"},
|
|
decoration = {"farming:wheat_4"},
|
|
y_min = 0,
|
|
y_max = 32000,
|
|
})
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:sand",
|
|
sidelen = 16,
|
|
fill_ratio = 0.004,
|
|
biomes = {"Desert"},
|
|
decoration = {"farming:cotton_4"},
|
|
y_min = 0,
|
|
y_max = 32000,
|
|
})
|
|
|
|
--[[minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:dirt_with_grass"},
|
|
noise_params = {
|
|
offset = 0.03,
|
|
scale = 0.03,
|
|
spread = {x = 2000, y = 4000, z = 2000},
|
|
seed = 2442,
|
|
octaves = 1,
|
|
persist = 0.01,
|
|
},
|
|
sidelen = 16,
|
|
fill_ratio = 0.004,
|
|
flags = "place_center_x, place_center_z, force_placement",
|
|
schematic = minetest.get_modpath("default").."/schematics/default_house.mts",
|
|
y_min = 5,
|
|
y_max = 50,
|
|
|
|
rotation = "random",
|
|
})--]]
|
|
|
|
minetest.register_decoration(
|
|
{
|
|
deco_type = "schematic",
|
|
place_on = {"default:sand"},
|
|
sidelen = 16,
|
|
fill_ratio = 0.004,
|
|
biomes = {"Desert"},
|
|
flags = "place_center_x, place_center_z",
|
|
schematic = minetest.get_modpath("default").."/schematics/default_cactus.mts",
|
|
y_min = 5,
|
|
y_max = 32000,
|
|
rotation = "random",
|
|
})
|
|
|
|
--[[minetest.register_decoration(
|
|
{
|
|
deco_type = "simple",
|
|
place_on = "default:sand",
|
|
sidelen = 16,
|
|
fill_ratio = 0.004,
|
|
biomes = {"Desert"},
|
|
decoration = {"default:cactus"},
|
|
height = 2,
|
|
height_max = 3,
|
|
y_min = 5,
|
|
y_max = 32000,
|
|
})--]]
|
|
|
|
default.log("mapgen", "loaded") |