mirror of
https://github.com/luanti-org/minetest_game.git
synced 2025-05-20 22:33:16 -04:00
Also minor tweak to cause it not to delete vacuum or air directly above it... doesn't flow upwards anyway, now does it?
151 lines
No EOL
3.7 KiB
Lua
151 lines
No EOL
3.7 KiB
Lua
-- Mapgen
|
|
|
|
dofile(minetest.get_modpath("mapgen").."/ores.lua")
|
|
|
|
-- Set mapgen mode to v7
|
|
minetest.register_on_mapgen_init(function(params)
|
|
minetest.set_mapgen_params({
|
|
mgname = "v7",
|
|
seed = params.seed,
|
|
water_level = 1,
|
|
flags = "caves",
|
|
})
|
|
end)
|
|
|
|
-- Dust Biome
|
|
minetest.register_biome({
|
|
name = "plains",
|
|
node_top = "moontest:dust",
|
|
depth_top = 2,
|
|
node_bottom = "moontest:stone",
|
|
node_dust = "air",
|
|
height_min = 3,
|
|
height_max = 30,
|
|
})
|
|
|
|
-- Basalt Biome
|
|
minetest.register_biome({
|
|
name = "basalt",
|
|
node_top = "moontest:basalt",
|
|
depth_top = 2,
|
|
node_filler = "moontest:dust",
|
|
depth_filler = 1,
|
|
node_dust = "air",
|
|
height_min = -50,
|
|
height_max = 5,
|
|
})
|
|
|
|
-- Lunar Ice Cap Biome
|
|
minetest.register_biome({
|
|
name = "plains",
|
|
node_top = "moontest:waterice",
|
|
depth_top = 4,
|
|
node_filler = "moontest:dust",
|
|
depth_filler = 2,
|
|
node_dust = "air",
|
|
height_min = 25,
|
|
height_max = 100,
|
|
})
|
|
|
|
-- Aliases
|
|
|
|
minetest.register_alias("mapgen_lava_source", "default:lava_source")
|
|
minetest.register_alias("mapgen_water_source", "moontest:hlsource")
|
|
minetest.register_alias("mapgen_stone", "moontest:stone")
|
|
minetest.register_alias("mapgen_dirt", "moontest:dust")
|
|
|
|
--treegen function
|
|
local function moontest_tree(x, y, z, area, data)
|
|
|
|
local c_tree = minetest.get_content_id("moontest:tree")
|
|
local c_leaves = minetest.get_content_id("moontest:leaves")
|
|
for j = -2, 4 do
|
|
if j >= 1 then
|
|
for i = -2, 2 do
|
|
for k = -2, 2 do
|
|
local vi = area:index(x + i, y + j + 1, z + k)
|
|
if math.random(3) ~= 2 then
|
|
data[vi] = c_leaves
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local vi = area:index(x, y + j, z)
|
|
data[vi] = c_tree
|
|
end
|
|
end
|
|
|
|
--Set everything to vacuum on generate
|
|
minetest.register_on_generated(function(minp, maxp, seed)
|
|
local x1 = maxp.x
|
|
local y1 = maxp.y
|
|
local z1 = maxp.z
|
|
local x0 = minp.x
|
|
local y0 = minp.y
|
|
local z0 = minp.z
|
|
--fire up the voxel manipulator
|
|
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
|
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
|
local data = vm:get_data()
|
|
--get the content ID #'s of air and vacuum
|
|
local c_air = minetest.get_content_id("air")
|
|
local c_vac = minetest.get_content_id("moontest:vacuum")
|
|
local c_dust = minetest.get_content_id("moontest:dust")
|
|
--loop through every node of the chunk
|
|
for z = z0, z1 do
|
|
for x = x0, x1 do
|
|
for y = y0, y1 do
|
|
--grab the location of the node in question
|
|
local vi = area:index(x, y, z)
|
|
--if it's air, it won't be now!
|
|
if data[vi] == c_air then
|
|
data[vi] = c_vac
|
|
end
|
|
end
|
|
--gen trees
|
|
--find surface
|
|
local yasurf = false -- y of above surface node
|
|
for y = y1, 2, -1 do --decrement, not increment
|
|
local vi = area:index(x, y, z)
|
|
local c_node = data[vi]
|
|
if y == y1 and c_node ~= c_vac then -- if top node solid
|
|
break
|
|
elseif c_node == c_dust then --if first surface node
|
|
yasurf = y + 1 --set the position of the surface
|
|
break
|
|
end
|
|
end
|
|
if yasurf then --if surface was found
|
|
if math.random() <= 0.0001337 then --much LEET
|
|
moontest_tree(x, yasurf+1, z, area, data)--place a tree
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--write the voxel manipulator data back to world
|
|
vm:set_data(data)
|
|
vm:set_lighting({day=0, night=0})
|
|
vm:calc_lighting()
|
|
vm:write_to_map(data)
|
|
end)
|
|
|
|
--make liquid delete vacuum and air nodes nearby so as to allow flowing
|
|
minetest.register_abm({
|
|
nodenames = {"group:liquid"},
|
|
neighbors = {"moontest:vacuum", "moontest:air"},
|
|
interval = 1.0,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
for x = -1,1 do
|
|
for y = -1,0 do
|
|
for z = -1,1 do
|
|
n_pos = {x=x + pos.x,y=y+pos.y,z=z+pos.z}
|
|
n_name = minetest.get_node(n_pos).name
|
|
if n_name == "moontest:vacuum" or n_name == "moontest:air" then
|
|
minetest.remove_node(n_pos)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
}) |