mapgen_v6: use a table for the contents

This commit is contained in:
HybridDog 2015-06-13 15:58:57 +02:00
parent 9cd39dc111
commit 47a8691b82

View File

@ -78,8 +78,29 @@ local function is_plantlike(id)
return true return true
end end
local c
-- On generated function local function define_contents()
c = {
dirt_with_grass = minetest.get_content_id("default:dirt_with_grass"),
dirt = minetest.get_content_id("default:dirt"),
tree = minetest.get_content_id("default:tree"),
apple = minetest.get_content_id("default:apple"),
snow = minetest.get_content_id("default:snow"),
snow_block = minetest.get_content_id("default:snowblock"),
dirt_with_snow = minetest.get_content_id("default:dirt_with_snow"),
air = minetest.get_content_id("air"),
ignore = minetest.get_content_id("ignore"),
stone = minetest.get_content_id("default:stone"),
dry_shrub = minetest.get_content_id("default:dry_shrub"),
leaves = minetest.get_content_id("default:leaves"),
jungleleaves = minetest.get_content_id("default:jungleleaves"),
junglegrass = minetest.get_content_id("default:junglegrass"),
ice = minetest.get_content_id("default:ice"),
water = minetest.get_content_id("default:water_source"),
papyrus = minetest.get_content_id("default:papyrus"),
sand = minetest.get_content_id("default:sand"),
}
end
minetest.register_on_generated(function(minp, maxp, seed) minetest.register_on_generated(function(minp, maxp, seed)
local t1 = os.clock() local t1 = os.clock()
@ -92,24 +113,9 @@ minetest.register_on_generated(function(minp, maxp, seed)
local spawn_pine = snow.voxelmanip_pine local spawn_pine = snow.voxelmanip_pine
local smooth = snow.smooth_biomes local smooth = snow.smooth_biomes
local c_dirt_with_grass = minetest.get_content_id("default:dirt_with_grass") if not c then
local c_dirt = minetest.get_content_id("default:dirt") define_contents()
local c_tree = minetest.get_content_id("default:tree") end
local c_apple = minetest.get_content_id("default:apple")
local c_snow = minetest.get_content_id("default:snow")
local c_snow_block = minetest.get_content_id("default:snowblock")
local c_dirt_with_snow = minetest.get_content_id("default:dirt_with_snow")
local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore")
local c_stone = minetest.get_content_id("default:stone")
local c_dry_shrub = minetest.get_content_id("default:dry_shrub")
local c_leaves = minetest.get_content_id("default:leaves")
local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
local c_junglegrass = minetest.get_content_id("default:junglegrass")
local c_ice = minetest.get_content_id("default:ice")
local c_water = minetest.get_content_id("default:water_source")
local c_papyrus = minetest.get_content_id("default:papyrus")
local c_sand = minetest.get_content_id("default:sand")
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
@ -157,8 +163,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
local ground_y = nil local ground_y = nil
for y = maxp.y, minp.y, -1 do for y = maxp.y, minp.y, -1 do
local nodid = data[area:index(x, y, z)] local nodid = data[area:index(x, y, z)]
if nodid ~= c_air if nodid ~= c.air
and nodid ~= c_ignore then and nodid ~= c.ignore then
ground_y = y ground_y = y
break break
end end
@ -166,17 +172,17 @@ minetest.register_on_generated(function(minp, maxp, seed)
if ground_y then if ground_y then
local vi = area:index(x, ground_y, z) local vi = area:index(x, ground_y, z)
if data[vi] == c_leaves if data[vi] == c.leaves
or data[vi] == c_jungleleaves then or data[vi] == c.jungleleaves then
for y = ground_y, -16, -1 do for y = ground_y, -16, -1 do
local vi = area:index(x, y, z) local vi = area:index(x, y, z)
local id = data[vi] local id = data[vi]
if id ~= c_air then if id ~= c.air then
if id == c_leaves if id == c.leaves
or id == c_jungleleaves or id == c.jungleleaves
or id == c_tree or id == c.tree
or id == c_apple then or id == c.apple then
data[vi] = c_air data[vi] = c.air
else else
break break
end end
@ -197,7 +203,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
local ground_y local ground_y
for y = maxp.y, minp.y, -1 do for y = maxp.y, minp.y, -1 do
local nodid = data[area:index(x, y, z)] local nodid = data[area:index(x, y, z)]
if nodid ~= c_air and nodid ~= c_ignore then if nodid ~= c.air and nodid ~= c.ignore then
ground_y = y ground_y = y
break break
end end
@ -207,7 +213,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
local node = area:index(x, ground_y, z) local node = area:index(x, ground_y, z)
local c_ground = data[node] local c_ground = data[node]
if c_ground == c_dirt_with_grass then if c_ground == c.dirt_with_grass then
if alpine if alpine
and test > 0.53 then and test > 0.53 then
snow_tab[num] = {ground_y, z, x, test} snow_tab[num] = {ground_y, z, x, test}
@ -215,25 +221,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
-- generate stone ground -- generate stone ground
for y = ground_y, math.max(-6, minp.y-6), -1 do for y = ground_y, math.max(-6, minp.y-6), -1 do
local vi = area:index(x, y, z) local vi = area:index(x, y, z)
if data[vi] == c_stone then if data[vi] == c.stone then
break break
end end
data[vi] = c_stone data[vi] = c.stone
end end
elseif shrubs elseif shrubs
and pr:next(1,28) == 1 then and pr:next(1,28) == 1 then
data[node] = c_dirt_with_snow data[node] = c.dirt_with_snow
data[area:index(x, ground_y+1, z)] = c_dry_shrub data[area:index(x, ground_y+1, z)] = c.dry_shrub
elseif pines elseif pines
and pr:next(1,36) == 1 then and pr:next(1,36) == 1 then
data[node] = c_dirt_with_snow data[node] = c.dirt_with_snow
spawn_pine({x=x, y=ground_y+1, z=z}, area, data) spawn_pine({x=x, y=ground_y+1, z=z}, area, data)
else else
data[node] = c_dirt_with_snow data[node] = c.dirt_with_snow
snow_tab[num] = {ground_y, z, x, test} snow_tab[num] = {ground_y, z, x, test}
num = num+1 num = num+1
end end
elseif c_ground == c_water then elseif c_ground == c.water then
if not icesheet if not icesheet
and not icecave and not icecave
and not icehole then and not icehole then
@ -249,7 +255,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
if pr:next(1,4) == 1 if pr:next(1,4) == 1
and (cool or icebergs) then and (cool or icebergs) then
for _,i in ipairs(nds) do for _,i in ipairs(nds) do
if i == c_ice then if i == c.ice then
ice = true ice = true
break break
end end
@ -257,10 +263,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
if not ice then if not ice then
for _,i in ipairs(nds) do for _,i in ipairs(nds) do
if i ~= c_water if i ~= c.water
and i ~= c_ice and i ~= c.ice
and i ~= c_air and i ~= c.air
and i ~= c_ignore then and i ~= c.ignore then
ice = true ice = true
break break
end end
@ -268,23 +274,23 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
local y = data[area:index(x, ground_y-1, z)] local y = data[area:index(x, ground_y-1, z)]
if ice if ice
or (y ~= c_water and y ~= c_ice) -- and y ~= "air") …I don't think y can be a string here ~HybridDog or (y ~= c.water and y ~= c.ice) -- and y ~= "air") …I don't think y can be a string here ~HybridDog
or (icebergs and pr:next(1,6) == 1) then or (icebergs and pr:next(1,6) == 1) then
data[node] = c_ice data[node] = c.ice
end end
else else
if icesheet if icesheet
or icecave or icecave
or (icehole and pr:next(1,10) > 1) then or (icehole and pr:next(1,10) > 1) then
data[node] = c_ice data[node] = c.ice
end end
if icecave then if icecave then
for y = ground_y-1, -33, -1 do for y = ground_y-1, -33, -1 do
local vi = area:index(x, y, z) local vi = area:index(x, y, z)
if data[vi] ~= c_water then if data[vi] ~= c.water then
break break
end end
data[vi] = c_air data[vi] = c.air
end end
end end
if icesheet then if icesheet then
@ -293,40 +299,40 @@ minetest.register_on_generated(function(minp, maxp, seed)
num = num+1 num = num+1
end end
end end
elseif c_ground == c_leaves elseif c_ground == c.leaves
or c_ground == c_jungleleaves or c_ground == c.jungleleaves
or c_ground == c_apple then or c_ground == c.apple then
if alpine then if alpine then
snow_tab[num] = {ground_y, z, x, test} snow_tab[num] = {ground_y, z, x, test}
num = num+1 num = num+1
-- make stone pillars out of trees -- make stone pillars out of trees
for y = ground_y, math.max(-6, minp.y-6), -1 do for y = ground_y, math.max(-6, minp.y-6), -1 do
local stone = area:index(x, y, z) local stone = area:index(x, y, z)
if data[stone] == c_stone then if data[stone] == c.stone then
break break
end end
data[stone] = c_stone data[stone] = c.stone
end end
else else
-- put snow onto leaves -- put snow onto leaves
snow_tab[num] = {ground_y, z, x, test} snow_tab[num] = {ground_y, z, x, test}
num = num+1 num = num+1
end end
elseif c_ground == c_sand then elseif c_ground == c.sand then
if icy then if icy then
data[node] = c_ice data[node] = c.ice
end end
snow_tab[num] = {ground_y, z, x, test} snow_tab[num] = {ground_y, z, x, test}
num = num+1 num = num+1
elseif c_ground == c_papyrus then elseif c_ground == c.papyrus then
snow_tab[num] = {ground_y, z, x, test} snow_tab[num] = {ground_y, z, x, test}
num = num+1 num = num+1
-- replace papyrus plants with snowblocks -- replace papyrus plants with snowblocks
local y = ground_y local y = ground_y
for _ = 1,7 do for _ = 1,7 do
local vi = area:index(x, y, z) local vi = area:index(x, y, z)
if data[vi] == c_papyrus then if data[vi] == c.papyrus then
data[vi] = c_snow_block data[vi] = c.snow_block
y = y-1 y = y-1
else else
break break
@ -334,10 +340,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
elseif is_plantlike(c_ground) then elseif is_plantlike(c_ground) then
local vi = area:index(x, ground_y-1, z) local vi = area:index(x, ground_y-1, z)
if data[vi] == c_dirt_with_grass then if data[vi] == c.dirt_with_grass then
-- replace other plants with dry shrubs -- replace other plants with dry shrubs
data[vi] = c_dirt_with_snow data[vi] = c.dirt_with_snow
data[node] = c_dry_shrub data[node] = c.dry_shrub
end end
end end
end end
@ -350,7 +356,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
if num ~= 1 then if num ~= 1 then
for _,i in pairs(snow_tab) do for _,i in pairs(snow_tab) do
-- set snow -- set snow
data[area:index(i[3], i[1]+1, i[2])] = c_snow data[area:index(i[3], i[1]+1, i[2])] = c.snow
end end
local wsz, wsx local wsz, wsx
for _,i in pairs(snow_tab) do for _,i in pairs(snow_tab) do
@ -370,8 +376,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
for i = -1,1,2 do for i = -1,1,2 do
for _,cord in pairs({{x+i,z}, {x,z+i}}) do for _,cord in pairs({{x+i,z}, {x,z+i}}) do
local nd = data[area:index(cord[1], y, cord[2])] local nd = data[area:index(cord[1], y, cord[2])]
if nd == c_air if nd == c.air
or nd == c_dry_shrub then or nd == c.dry_shrub then
h = h/2 h = h/2
end end
end end
@ -386,7 +392,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
local vi = area:index(x, y, z) local vi = area:index(x, y, z)
if h == 9 then if h == 9 then
-- replace the snow with a snowblock because its a full node -- replace the snow with a snowblock because its a full node
data[vi] = c_snow_block data[vi] = c.snow_block
else else
-- set a specific snow height -- set a specific snow height
if not param2s then if not param2s then