mirror of
https://github.com/paramat/pathv7.git
synced 2024-12-22 05:42:26 +01:00
Move content ids outside 'on gen'. More reliable meselamps in tunnels. Code improvements
This commit is contained in:
parent
7fb407ab1e
commit
e8137cdc17
@ -1,4 +1,4 @@
|
||||
pathv7 0.1.3 by paramat
|
||||
pathv7 0.1.4 by paramat
|
||||
For Minetest 0.4.14 and later
|
||||
Depends default stairs
|
||||
Licenses: Code LGPLv2.1, textures CC BY-SA 3.0
|
||||
|
389
init.lua
389
init.lua
@ -2,6 +2,7 @@
|
||||
|
||||
local HSAMP = 0.025 -- Height select amplitude.
|
||||
-- Controls maximum steepness of paths.
|
||||
local DEBUG = false -- Print generation time
|
||||
|
||||
-- Mapgen v7 noises
|
||||
|
||||
@ -101,6 +102,40 @@ local np_column = {
|
||||
dofile(minetest.get_modpath("pathv7") .. "/nodes.lua")
|
||||
|
||||
|
||||
-- Constants
|
||||
|
||||
local c_wood = minetest.get_content_id("pathv7:junglewood")
|
||||
local c_column = minetest.get_content_id("pathv7:bridgewood")
|
||||
local c_stairn = minetest.get_content_id("pathv7:stairn")
|
||||
local c_stairs = minetest.get_content_id("pathv7:stairs")
|
||||
local c_staire = minetest.get_content_id("pathv7:staire")
|
||||
local c_stairw = minetest.get_content_id("pathv7:stairw")
|
||||
local c_stairne = minetest.get_content_id("pathv7:stairne")
|
||||
local c_stairnw = minetest.get_content_id("pathv7:stairnw")
|
||||
local c_stairse = minetest.get_content_id("pathv7:stairse")
|
||||
local c_stairsw = minetest.get_content_id("pathv7:stairsw")
|
||||
|
||||
local c_air = minetest.CONTENT_AIR
|
||||
local c_ignore = minetest.CONTENT_IGNORE
|
||||
local c_stone = minetest.get_content_id("default:stone")
|
||||
local c_sastone = minetest.get_content_id("default:sandstone")
|
||||
local c_destone = minetest.get_content_id("default:desert_stone")
|
||||
local c_ice = minetest.get_content_id("default:ice")
|
||||
local c_tree = minetest.get_content_id("default:tree")
|
||||
local c_leaves = minetest.get_content_id("default:leaves")
|
||||
local c_apple = minetest.get_content_id("default:apple")
|
||||
local c_jungletree = minetest.get_content_id("default:jungletree")
|
||||
local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
|
||||
local c_pinetree = minetest.get_content_id("default:pine_tree")
|
||||
local c_pineneedles = minetest.get_content_id("default:pine_needles")
|
||||
local c_snow = minetest.get_content_id("default:snow")
|
||||
local c_acaciatree = minetest.get_content_id("default:acacia_tree")
|
||||
local c_acacialeaves = minetest.get_content_id("default:acacia_leaves")
|
||||
local c_aspentree = minetest.get_content_id("default:aspen_tree")
|
||||
local c_aspenleaves = minetest.get_content_id("default:aspen_leaves")
|
||||
local c_meselamp = minetest.get_content_id("default:meselamp")
|
||||
|
||||
|
||||
-- Initialise noise objects to nil
|
||||
|
||||
local nobj_base = nil
|
||||
@ -112,6 +147,7 @@ local nobj_pathc = nil
|
||||
local nobj_pathd = nil
|
||||
local nobj_column = nil
|
||||
|
||||
|
||||
-- Localise noise buffers
|
||||
|
||||
local nbuf_base
|
||||
@ -138,60 +174,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local x0 = minp.x
|
||||
local y0 = minp.y
|
||||
local z0 = minp.z
|
||||
|
||||
local c_air = minetest.CONTENT_AIR
|
||||
local c_ignore = minetest.CONTENT_IGNORE
|
||||
local c_tree = minetest.get_content_id("default:tree")
|
||||
local c_sand = minetest.get_content_id("default:sand")
|
||||
local c_dirt = minetest.get_content_id("default:dirt")
|
||||
local c_grass = minetest.get_content_id("default:dirt_with_grass")
|
||||
local c_drygrass = minetest.get_content_id("default:dirt_with_dry_grass")
|
||||
local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow")
|
||||
local c_desand = minetest.get_content_id("default:desert_sand")
|
||||
local c_stone = minetest.get_content_id("default:stone")
|
||||
local c_sastone = minetest.get_content_id("default:sandstone")
|
||||
local c_destone = minetest.get_content_id("default:desert_stone")
|
||||
local c_ice = minetest.get_content_id("default:ice")
|
||||
local c_meselamp = minetest.get_content_id("default:meselamp")
|
||||
local c_gravel = minetest.get_content_id("default:gravel")
|
||||
local c_tree = minetest.get_content_id("default:tree")
|
||||
local c_jungletree = minetest.get_content_id("default:jungletree")
|
||||
local c_pinetree = minetest.get_content_id("default:pine_tree")
|
||||
local c_acaciatree = minetest.get_content_id("default:acacia_tree")
|
||||
local c_aspentree = minetest.get_content_id("default:aspen_tree")
|
||||
|
||||
local c_wood = minetest.get_content_id("pathv7:junglewood")
|
||||
local c_column = minetest.get_content_id("pathv7:bridgewood")
|
||||
|
||||
local c_stairn = minetest.get_content_id("pathv7:stairn")
|
||||
local c_stairs = minetest.get_content_id("pathv7:stairs")
|
||||
local c_staire = minetest.get_content_id("pathv7:staire")
|
||||
local c_stairw = minetest.get_content_id("pathv7:stairw")
|
||||
local c_stairne = minetest.get_content_id("pathv7:stairne")
|
||||
local c_stairnw = minetest.get_content_id("pathv7:stairnw")
|
||||
local c_stairse = minetest.get_content_id("pathv7:stairse")
|
||||
local c_stairsw = minetest.get_content_id("pathv7:stairsw")
|
||||
|
||||
local sidelen = x1 - x0 + 1
|
||||
local emerlen = sidelen + 32
|
||||
local overlen = sidelen + 5
|
||||
local chulens = {x = overlen, y = overlen, z = 1}
|
||||
local minpos = {x = x0 - 3, y = z0 - 3}
|
||||
local minpos = {x = x0 - 3, y = z0 - 3}
|
||||
|
||||
nobj_base = nobj_base or minetest.get_perlin_map(np_base, chulens)
|
||||
nobj_alt = nobj_alt or minetest.get_perlin_map(np_alt, chulens)
|
||||
nobj_select = nobj_select or minetest.get_perlin_map(np_select, chulens)
|
||||
|
||||
nobj_patha = nobj_patha or minetest.get_perlin_map(np_patha, chulens)
|
||||
nobj_pathb = nobj_pathb or minetest.get_perlin_map(np_pathb, chulens)
|
||||
nobj_pathc = nobj_pathc or minetest.get_perlin_map(np_pathc, chulens)
|
||||
nobj_pathd = nobj_pathd or minetest.get_perlin_map(np_pathd, chulens)
|
||||
nobj_column = nobj_column or minetest.get_perlin_map(np_column, chulens)
|
||||
|
||||
local nvals_base = nobj_base :get2dMap_flat({x = x0 - 3, y = z0 - 3}, nbuf_base)
|
||||
local nvals_alt = nobj_alt :get2dMap_flat({x = x0 - 3, y = z0 - 3}, nbuf_alt)
|
||||
local nvals_select = nobj_select:get2dMap_flat({x = x0 - 3, y = z0 - 3}, nbuf_select)
|
||||
|
||||
local nvals_base = nobj_base :get2dMap_flat(minpos, nbuf_base)
|
||||
local nvals_alt = nobj_alt :get2dMap_flat(minpos, nbuf_alt)
|
||||
local nvals_select = nobj_select:get2dMap_flat(minpos, nbuf_select)
|
||||
local nvals_patha = nobj_patha :get2dMap_flat(minpos, nbuf_patha)
|
||||
local nvals_pathb = nobj_pathb :get2dMap_flat(minpos, nbuf_pathb)
|
||||
local nvals_pathc = nobj_pathc :get2dMap_flat(minpos, nbuf_pathc)
|
||||
@ -203,7 +204,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local data = vm:get_data()
|
||||
|
||||
local ni = 1
|
||||
local stable = {}
|
||||
for z = z0 - 3, z1 + 2 do
|
||||
local n_xprepatha = false
|
||||
local n_xprepathb = false
|
||||
@ -213,13 +213,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
for x = x0 - 3, x1 + 2 do
|
||||
local n_patha = nvals_patha[ni]
|
||||
local n_zprepatha = nvals_patha[(ni - overlen)]
|
||||
|
||||
local n_pathb = nvals_pathb[ni]
|
||||
local n_zprepathb = nvals_pathb[(ni - overlen)]
|
||||
|
||||
local n_pathc = nvals_pathc[ni]
|
||||
local n_zprepathc = nvals_pathc[(ni - overlen)]
|
||||
|
||||
local n_pathd = nvals_pathd[ni]
|
||||
local n_zprepathd = nvals_pathd[(ni - overlen)]
|
||||
|
||||
@ -234,7 +231,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local tblend = 0.5 + HSAMP * (select - 0.5)
|
||||
tblend = math.min(math.max(tblend, 0), 1)
|
||||
local tlevel = math.floor(base * tblend + alt * (1 - tblend))
|
||||
-- TODO allow path above
|
||||
local pathy = math.min(math.max(tlevel, 7), 42)
|
||||
|
||||
if (n_patha >= 0 and n_xprepatha < 0) -- detect sign change of noise
|
||||
@ -256,178 +252,167 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
or (n_pathd < 0 and n_xprepathd >= 0)
|
||||
or (n_pathd >= 0 and n_zprepathd < 0)
|
||||
or (n_pathd < 0 and n_zprepathd >= 0) then
|
||||
if pathy > y1 then
|
||||
-- build columns through this chunk
|
||||
if abscol < 0.3 then
|
||||
for xx = x - 1, x + 1, 2 do
|
||||
for zz = z - 1, z + 1, 2 do
|
||||
local vi = area:index(xx, y1, zz)
|
||||
for y = 1, sidelen do
|
||||
local nodid = data[vi]
|
||||
if nodid == c_stone
|
||||
or nodid == c_destone
|
||||
or nodid == c_sastone
|
||||
or nodid == c_ice then
|
||||
break
|
||||
else
|
||||
data[vi] = c_column
|
||||
end
|
||||
vi = vi - emerlen
|
||||
end
|
||||
end
|
||||
-- scan disk 5 nodes above path
|
||||
local tunnel = false
|
||||
local excatop
|
||||
for zz = z - 2, z + 2 do
|
||||
local vi = area:index(x - 2, pathy + 5, zz)
|
||||
for xx = x - 2, x + 2 do
|
||||
local nodid = data[vi]
|
||||
if nodid == c_stone
|
||||
or nodid == c_destone
|
||||
or nodid == c_sastone
|
||||
or nodid == c_ice then
|
||||
tunnel = true
|
||||
end
|
||||
vi = vi + 1
|
||||
end
|
||||
elseif pathy >= y0 then
|
||||
-- path in chunk
|
||||
-- scan disk 5 nodes above path
|
||||
local tunnel = false
|
||||
local excatop
|
||||
for zz = z - 2, z + 2 do
|
||||
local vi = area:index(x - 2, pathy + 5, zz)
|
||||
for xx = x - 2, x + 2 do
|
||||
end
|
||||
if tunnel then
|
||||
excatop = pathy + 5
|
||||
else
|
||||
excatop = y1
|
||||
end
|
||||
-- place path node brush
|
||||
local vi = area:index(x - 2, pathy, z - 2)
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairne
|
||||
end
|
||||
for iter = 1, 3 do
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairn
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairnw
|
||||
end
|
||||
for zz = z - 1, z + 1 do
|
||||
local vi = area:index(x - 2, pathy, zz)
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_staire
|
||||
end
|
||||
for iter = 1, 3 do
|
||||
vi = vi + 1
|
||||
data[vi] = c_wood
|
||||
end
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairw
|
||||
end
|
||||
end
|
||||
local vi = area:index(x - 2, pathy, z + 2)
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairse
|
||||
end
|
||||
for iter = 1, 3 do
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairs
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairsw
|
||||
end
|
||||
-- bridge understructure
|
||||
for zz = z - 1, z + 1 do
|
||||
local vi = area:index(x - 1, pathy - 1, zz)
|
||||
for xx = x - 1, x + 1 do
|
||||
local nodid = data[vi]
|
||||
if nodid ~= c_stone
|
||||
and nodid ~= c_destone
|
||||
and nodid ~= c_sastone then
|
||||
data[vi] = c_column
|
||||
end
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
local vi = area:index(x, pathy - 2, z)
|
||||
data[vi] = c_column
|
||||
-- bridge columns
|
||||
if abscol < 0.3 then
|
||||
for xx = x - 1, x + 1, 2 do
|
||||
for zz = z - 1, z + 1, 2 do
|
||||
local vi = area:index(xx, pathy - 2, zz)
|
||||
for y = pathy - 2, y0, -1 do
|
||||
local nodid = data[vi]
|
||||
if nodid == c_stone
|
||||
or nodid == c_destone
|
||||
or nodid == c_sastone
|
||||
or nodid == c_ice then
|
||||
tunnel = true
|
||||
or nodid == c_sastone then
|
||||
break
|
||||
else
|
||||
data[vi] = c_column
|
||||
end
|
||||
vi = vi + 1
|
||||
vi = vi - emerlen
|
||||
end
|
||||
end
|
||||
if tunnel then
|
||||
excatop = pathy + 5 -- tunnel
|
||||
else
|
||||
excatop = y1 + 16 -- excavate to vm top
|
||||
end
|
||||
|
||||
-- place path node brush
|
||||
local vi = area:index(x - 2, pathy, z - 2)
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairne
|
||||
end
|
||||
for iter = 1, 3 do
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairn
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairnw
|
||||
end
|
||||
for zz = z - 1, z + 1 do
|
||||
local vi = area:index(x - 2, pathy, zz)
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_staire
|
||||
end
|
||||
for iter = 1, 3 do
|
||||
vi = vi + 1
|
||||
data[vi] = c_wood
|
||||
end
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairw
|
||||
end
|
||||
end
|
||||
local vi = area:index(x - 2, pathy, z + 2)
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairse
|
||||
end
|
||||
for iter = 1, 3 do
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairs
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
if data[vi] ~= c_wood then
|
||||
data[vi] = c_stairsw
|
||||
end
|
||||
|
||||
-- excavate above path
|
||||
local det_destone = false
|
||||
local det_sastone = false
|
||||
local det_ice = false
|
||||
for y = pathy + 1, excatop do
|
||||
for zz = z - 2, z + 2 do
|
||||
local vi = area:index(x - 2, y, zz)
|
||||
for xx = x - 2, x + 2 do
|
||||
local nodid = data[vi]
|
||||
if nodid == c_destone then
|
||||
det_destone = true
|
||||
elseif nodid == c_sastone then
|
||||
det_sastone = true
|
||||
elseif nodid == c_ice then
|
||||
det_ice = true
|
||||
end
|
||||
-- excavate above path
|
||||
local det_destone = false
|
||||
local det_sastone = false
|
||||
local det_ice = false
|
||||
for y = pathy + 1, excatop do
|
||||
for zz = z - 2, z + 2 do
|
||||
local vi = area:index(x - 2, y, zz)
|
||||
for xx = x - 2, x + 2 do
|
||||
local nodid = data[vi]
|
||||
if nodid == c_destone then
|
||||
det_destone = true
|
||||
elseif nodid == c_sastone then
|
||||
det_sastone = true
|
||||
elseif nodid == c_ice then
|
||||
det_ice = true
|
||||
end
|
||||
if tunnel and y == excatop then -- tunnel ceiling
|
||||
if nodid ~= c_air
|
||||
and nodid ~= c_ignore
|
||||
and nodid ~= c_meselamp then
|
||||
if (math.abs(zz - z) == 2
|
||||
or math.abs(xx - x) == 2)
|
||||
and math.random() <= 0.2 then
|
||||
data[vi] = c_meselamp
|
||||
elseif det_destone then
|
||||
data[vi] = c_destone
|
||||
elseif det_sastone then
|
||||
data[vi] = c_sastone
|
||||
elseif det_ice then
|
||||
data[vi] = c_ice
|
||||
else
|
||||
data[vi] = c_stone
|
||||
end
|
||||
end
|
||||
if tunnel and y == excatop then -- tunnel ceiling
|
||||
if nodid ~= c_air
|
||||
and nodid ~= c_ignore
|
||||
and nodid ~= c_meselamp then
|
||||
if math.random() < 0.1 then
|
||||
data[vi] = c_meselamp
|
||||
elseif det_destone then
|
||||
data[vi] = c_destone
|
||||
elseif det_sastone then
|
||||
data[vi] = c_sastone
|
||||
elseif det_ice then
|
||||
data[vi] = c_ice
|
||||
else
|
||||
data[vi] = c_stone
|
||||
end
|
||||
end
|
||||
elseif y <= pathy + 5 then
|
||||
if nodid ~= c_wood
|
||||
and nodid ~= c_stairn
|
||||
and nodid ~= c_stairs
|
||||
and nodid ~= c_staire
|
||||
and nodid ~= c_stairw
|
||||
and nodid ~= c_stairne
|
||||
and nodid ~= c_stairnw
|
||||
and nodid ~= c_stairse
|
||||
and nodid ~= c_stairsw then
|
||||
data[vi] = c_air
|
||||
end
|
||||
else
|
||||
elseif y <= pathy + 5 then
|
||||
if nodid ~= c_wood
|
||||
and nodid ~= c_stairn
|
||||
and nodid ~= c_stairs
|
||||
and nodid ~= c_staire
|
||||
and nodid ~= c_stairw
|
||||
and nodid ~= c_stairne
|
||||
and nodid ~= c_stairnw
|
||||
and nodid ~= c_stairse
|
||||
and nodid ~= c_stairsw then
|
||||
data[vi] = c_air
|
||||
end
|
||||
vi = vi + 1
|
||||
elseif nodid == c_tree
|
||||
or nodid == c_leaves
|
||||
or nodid == c_apple
|
||||
or nodid == c_jungletree
|
||||
or nodid == c_jungleleaves
|
||||
or nodid == c_pinetree
|
||||
or nodid == c_pineneedles
|
||||
or nodid == c_snow
|
||||
or nodid == c_acaciatree
|
||||
or nodid == c_acacialeaves
|
||||
or nodid == c_aspentree
|
||||
or nodid == c_aspenleaves then
|
||||
data[vi] = c_air
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- bridge understructure
|
||||
for zz = z - 1, z + 1 do
|
||||
local vi = area:index(x - 1, pathy - 1, zz)
|
||||
for xx = x - 1, x + 1 do
|
||||
data[vi] = c_column
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
local vi = area:index(x, pathy - 2, z)
|
||||
data[vi] = c_column
|
||||
|
||||
-- bridge columns
|
||||
if abscol < 0.3 then
|
||||
for xx = x - 1, x + 1, 2 do
|
||||
for zz = z - 1, z + 1, 2 do
|
||||
local vi = area:index(xx, pathy - 2, zz)
|
||||
for y = pathy - 2, y0, -1 do
|
||||
local nodid = data[vi]
|
||||
if nodid == c_stone
|
||||
or nodid == c_destone
|
||||
or nodid == c_sastone
|
||||
or nodid == c_ice then
|
||||
break
|
||||
else
|
||||
data[vi] = c_column
|
||||
end
|
||||
vi = vi - emerlen
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -446,5 +431,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
vm:write_to_map(data)
|
||||
|
||||
local chugent = math.ceil((os.clock() - t1) * 1000)
|
||||
print ("[pathv7] Generate chunk " .. chugent .. " ms")
|
||||
if DEBUG then
|
||||
print ("[pathv7] Generate chunk " .. chugent .. " ms")
|
||||
end
|
||||
end)
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 616 B |
Loading…
Reference in New Issue
Block a user