Fixed some bugs
parent
66542157db
commit
6d87c5e961
150
generate.lua
150
generate.lua
|
@ -27,6 +27,30 @@ end
|
|||
|
||||
-- GENERATE A MAP
|
||||
|
||||
local function fill_with_ignore(minp, maxp)
|
||||
local ignore = minetest.get_content_id("mapgen_lib:ignore")
|
||||
local data, area = mapgen.get_voxel_data(minp, maxp)
|
||||
for x = minp.x, maxp.x do
|
||||
for y = minp.y, maxp.y do
|
||||
for z = minp.z, maxp.z do
|
||||
data[area:index(x, y, z)] = ignore
|
||||
end
|
||||
end
|
||||
end
|
||||
mapgen.set_voxel_data(minp, maxp, data, false)
|
||||
end
|
||||
|
||||
local function fill_with_air(minp, maxp, data, area)
|
||||
local air = minetest.get_content_id("air")
|
||||
for x = minp.x, maxp.x do
|
||||
for y = minp.y, maxp.y do
|
||||
for z = minp.z, maxp.z do
|
||||
data[area:index(x, y, z)] = air
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen.pregenerate(minp, maxp, seed)
|
||||
if mapgen.start then -- Mapgen already started
|
||||
mapgen.generate(minp, maxp, seed)
|
||||
|
@ -56,12 +80,7 @@ function mapgen.pregenerate(minp, maxp, seed)
|
|||
end
|
||||
mapgen.first = false
|
||||
end
|
||||
-- make a spawn platform if the mapgen isn't begun
|
||||
for x = -2, 2 do
|
||||
for z = -2, 2 do
|
||||
minetest.set_node({x = x, y = -2, z = z}, {name = "default:dirt_with_grass"})
|
||||
end
|
||||
end
|
||||
fill_with_ignore(minp, maxp)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -112,7 +131,7 @@ function mapgen.begin()
|
|||
end
|
||||
end
|
||||
|
||||
function mapgen.generate(minp, maxp, seed, delete)
|
||||
function mapgen.generate(minp, maxp, seed)
|
||||
print("Preparing to map generation")
|
||||
local time1 = os.clock()
|
||||
-- mapgen stuff
|
||||
|
@ -123,26 +142,8 @@ function mapgen.generate(minp, maxp, seed, delete)
|
|||
local data = manip:get_data()
|
||||
local param = manip:get_light_data()
|
||||
local param2 = manip:get_param2_data()
|
||||
-- delete the spawn platform
|
||||
if area:contains(0, -2, 0) then
|
||||
for x = -2, 2 do
|
||||
for z = -2, 2 do
|
||||
local index = area:index(x, -2, z)
|
||||
data[index] = air
|
||||
end
|
||||
end
|
||||
end
|
||||
-- delete the old map in case of chatcommand /regen
|
||||
if delete then
|
||||
print("Removing old map")
|
||||
for x = minp.x, maxp.x do
|
||||
for y = minp.y, maxp.y do
|
||||
for z = minp.z, maxp.z do
|
||||
data[area:index(x, y, z)] = air
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- convert ignore to air
|
||||
fill_with_air(minp, maxp, data, area)
|
||||
print("Map generation : from " .. minetest.pos_to_string(minp) .. " to " .. minetest.pos_to_string(maxp))
|
||||
print("Data collecting")
|
||||
local time2 = os.clock()
|
||||
|
@ -206,3 +207,98 @@ function mapgen.get_voxel_manip(minp, maxp)
|
|||
local area = minetest.voxel_area(emin, emax)
|
||||
return manip, area
|
||||
end
|
||||
|
||||
function mapgen.check_voxelmanip(minp, maxp)
|
||||
local vminp, vmaxp = mapgen.vm[1], mapgen.vm[2]
|
||||
return vminp and vmaxp
|
||||
and vminp.x == minp.x
|
||||
and vminp.y == minp.y
|
||||
and vminp.z == minp.z
|
||||
and vmaxp.x == maxp.x
|
||||
and vmaxp.y == maxp.y
|
||||
and vmaxp.z == maxp.z
|
||||
end
|
||||
|
||||
function mapgen.get_voxel_data(minp, maxp)
|
||||
if mapgen.check_voxelmanip(minp, maxp) then
|
||||
local vm = mapgen.vm[3]
|
||||
return vm:get_data(), mapgen.vm[4]
|
||||
else
|
||||
local vm, area = mapgen.get_voxel_manip(minp, maxp)
|
||||
mapgen.vm = {minp, maxp, vm, area}
|
||||
return vm:get_data(), area
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen.get_voxel_light_data(minp, maxp)
|
||||
if mapgen.check_voxelmanip(minp, maxp) then
|
||||
local vm = mapgen.vm[3]
|
||||
return vm:get_light_data(), mapgen.vm[4]
|
||||
else
|
||||
local vm, area = mapgen.get_voxel_manip(minp, maxp)
|
||||
mapgen.vm = {minp, maxp, vm, area}
|
||||
return vm:get_light_data(), area
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen.get_voxel_param2_data(minp, maxp)
|
||||
if mapgen.check_voxelmanip(minp, maxp) then
|
||||
local vm = mapgen.vm[3]
|
||||
return vm:get_param2_data(), mapgen.vm[4]
|
||||
else
|
||||
local vm, area = mapgen.get_voxel_manip(minp, maxp)
|
||||
mapgen.vm = {minp, maxp, vm, area}
|
||||
return vm:get_param2_data(), area
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen.set_voxel_data(minp, maxp, data, calc_light)
|
||||
if mapgen.check_voxelmanip(minp, maxp) then
|
||||
local vm = mapgen.vm[3]
|
||||
vm:set_data(data)
|
||||
if calc_light then
|
||||
vm:calc_lighting()
|
||||
end
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
else
|
||||
local vm, area = mapgen.voxel_area()
|
||||
mapgen.vm = {minp, maxp, vm, area}
|
||||
vm:set_data(data)
|
||||
if calc_light then
|
||||
vm:calc_lighting()
|
||||
end
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen.set_voxel_light_data(minp, maxp, data)
|
||||
if mapgen.check_voxelmanip(minp, maxp) then
|
||||
local vm = mapgen.vm[3]
|
||||
vm:set_light_data(data)
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
else
|
||||
local vm, area = mapgen.voxel_area()
|
||||
mapgen.vm = {minp, maxp, vm, area}
|
||||
vm:set_light_data(data)
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen.set_voxel_param2_data(minp, maxp, data)
|
||||
if mapgen.check_voxelmanip(minp, maxp) then
|
||||
local vm = mapgen.vm[3]
|
||||
vm:set_param2_data(data)
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
else
|
||||
local vm, area = mapgen.voxel_area()
|
||||
mapgen.vm = {minp, maxp, vm, area}
|
||||
vm:set_param2_data(data)
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
end
|
||||
|
|
7
init.lua
7
init.lua
|
@ -4,6 +4,7 @@ mapgen.start = false
|
|||
mapgen.seed = 0
|
||||
mapgen.time = 0
|
||||
mapgen.chunks = 0
|
||||
mapgen.vm = {}
|
||||
|
||||
function load_modfile(...)
|
||||
for _, file in ipairs({...}) do
|
||||
|
@ -78,3 +79,9 @@ function minetest.add_group(groupname, ...)
|
|||
minetest.override_item(item, {groups = def.groups})
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("mapgen_lib:ignore", {
|
||||
drawtype = "airlike",
|
||||
walkable = true,
|
||||
groups = {not_in_creative_invotory=1},
|
||||
})
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
function mapgen.generate(minp, maxp, data, param, param2, area, seed)
|
||||
local stone, water = mapgen.get_ids("default:stone", "default:water_source")
|
||||
local noisearea = minetest.voxel_area(minp, maxp)
|
||||
local flatarea = minetest.flat_area(minp, {x = maxp.x, y = maxp.y + 7, z = maxp.z)
|
||||
local noise1 = noisearea:noise(0, 1, {x = 512, y = 512, z = 512}, 9790, 5, 0.6)
|
||||
local noise2 = flatarea:noise(0, 100, {x = 1024, y = 1024, z = 1024}, -4283, 8, 0.5)
|
||||
for x = minp.x, maxp.x do
|
||||
for z = minp.z, maxp.z do
|
||||
local i2 = flatarea:index(x, z)
|
||||
local v2 = noise2[i2]
|
||||
for y = minp.y, maxp.y + 7 do
|
||||
local i3 = noisearea:index(x, y, z)
|
||||
local vi = area:index(x, y, z)
|
||||
local v1 = noise1[i3]
|
||||
if y / v2 <= v1 then
|
||||
data[vi] = stone
|
||||
elseif y <= 1 then
|
||||
data[vi] = water
|
||||
end
|
||||
end
|
||||
end
|
||||
return data, true, param2
|
||||
end
|
Loading…
Reference in New Issue