forked from MineClone5/MineClone5
133 lines
4.7 KiB
Lua
133 lines
4.7 KiB
Lua
local v6 = mcl_mapgen.v6
|
|
|
|
local mcl_mushrooms = minetest.get_modpath("mcl_mushrooms")
|
|
|
|
local c_water = minetest.get_content_id("mcl_core:water_source")
|
|
local c_stone = minetest.get_content_id("mcl_core:stone")
|
|
local c_sand = minetest.get_content_id("mcl_core:sand")
|
|
local c_dirt = minetest.get_content_id("mcl_core:dirt")
|
|
|
|
local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand")
|
|
local c_netherrack = minetest.get_content_id("mcl_nether:netherrack")
|
|
local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source")
|
|
|
|
-- Generate mushrooms in caves manually.
|
|
-- Minetest's API does not support decorations in caves yet. :-(
|
|
local function generate_underground_mushrooms(minp, maxp, seed)
|
|
if not mcl_mushrooms then return end
|
|
|
|
local pr_shroom = PseudoRandom(seed-24359)
|
|
-- Generate rare underground mushrooms
|
|
-- TODO: Make them appear in groups, use Perlin noise
|
|
local min, max = mcl_mapgen.overworld.lava_max + 4, 0
|
|
if minp.y > max or maxp.y < min then
|
|
return
|
|
end
|
|
|
|
local bpos
|
|
local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"})
|
|
|
|
for n = 1, #stone do
|
|
bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z }
|
|
|
|
local l = minetest.get_node_light(bpos, 0.5)
|
|
if bpos.y >= min and bpos.y <= max and l and l <= 12 and pr_shroom:next(1,1000) < 4 then
|
|
if pr_shroom:next(1,2) == 1 then
|
|
minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"})
|
|
else
|
|
minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Generate Nether decorations manually: Eternal fire, mushrooms
|
|
-- Minetest's API does not support decorations in caves yet. :-(
|
|
local function generate_nether_decorations(minp, maxp, seed)
|
|
local pr_nether = PseudoRandom(seed+667)
|
|
|
|
if minp.y > mcl_mapgen.nether.max or maxp.y < mcl_mapgen.nether.min then
|
|
return
|
|
end
|
|
|
|
minetest.log("action", "[mcl_mapgen_core] Nether decorations " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp))
|
|
|
|
-- TODO: Generate everything based on Perlin noise instead of PseudoRandom
|
|
|
|
local bpos
|
|
local rack = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:netherrack"})
|
|
local magma = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:magma"})
|
|
local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"})
|
|
|
|
-- Helper function to spawn “fake” decoration
|
|
local function special_deco(nodes, spawn_func)
|
|
for n = 1, #nodes do
|
|
bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z }
|
|
|
|
spawn_func(bpos)
|
|
end
|
|
|
|
end
|
|
|
|
-- Eternal fire on netherrack
|
|
special_deco(rack, function(bpos)
|
|
-- Eternal fire on netherrack
|
|
if pr_nether:next(1,100) <= 3 then
|
|
minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"})
|
|
end
|
|
end)
|
|
|
|
-- Eternal fire on magma cubes
|
|
special_deco(magma, function(bpos)
|
|
if pr_nether:next(1,150) == 1 then
|
|
minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"})
|
|
end
|
|
end)
|
|
|
|
-- Mushrooms on netherrack
|
|
-- Note: Spawned *after* the fire because of light level checks
|
|
if mcl_mushrooms then
|
|
special_deco(rack, function(bpos)
|
|
local l = minetest.get_node_light(bpos, 0.5)
|
|
if bpos.y > mcl_mapgen.nether.lava_max + 6 and l and l <= 12 and pr_nether:next(1,1000) <= 4 then
|
|
-- TODO: Make mushrooms appear in groups, use Perlin noise
|
|
if pr_nether:next(1,2) == 1 then
|
|
minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"})
|
|
else
|
|
minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"})
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
mcl_mapgen.register_mapgen(function(minp, maxp, seed, vm_context)
|
|
local min_y, max_y = minp.y, maxp.y
|
|
|
|
-- Nether block fixes:
|
|
-- * Replace water with Nether lava.
|
|
-- * Replace stone, sand dirt in v6 so the Nether works in v6.
|
|
if min_y > mcl_mapgen.nether.max or max_y < mcl_mapgen.nether.min then return end
|
|
if v6 then
|
|
local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"})
|
|
if #nodes < 1 then return end
|
|
vm_context.write = true
|
|
local data = vm_context.data
|
|
local area = vm_context.area
|
|
for n = 1, #nodes do
|
|
local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z)
|
|
if data[p_pos] == c_water then
|
|
data[p_pos] = c_nether_lava
|
|
elseif data[p_pos] == c_stone then
|
|
data[p_pos] = c_netherrack
|
|
elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then
|
|
data[p_pos] = c_soul_sand
|
|
end
|
|
end
|
|
else
|
|
end
|
|
|
|
generate_underground_mushrooms(minp, maxp, seed)
|
|
generate_nether_decorations(minp, maxp, seed)
|
|
end, 1)
|