mirror of
https://github.com/luanti-org/minetest_game.git
synced 2025-05-20 22:33:16 -04:00
Probably will have a bug in the next few days. :P Fixed air and vacuum not flowing back in when liquids are removed. Also added an ABM to regular air to make it change to moontest air or vacuum based on neighbors. Liquid no longer deletes atmosphere diagonally placed from it.
160 lines
No EOL
3.9 KiB
Lua
160 lines
No EOL
3.9 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
|
|
--ignore diagonals
|
|
if x ~= 1 and z ~= 1 then
|
|
if x ~= -1 and z ~= 1 then
|
|
if x ~= 1 and z ~= -1 then
|
|
if x ~= -1 and z ~= -1 then
|
|
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
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
}) |