Add emerlen, emerarea. Add missing sand declaration. Noise object optimisation. Add 'paramtype = light' to light sources. Fix code style issues. Add info to readme

master
paramat 2015-08-23 22:44:25 +01:00
parent 7bf20190c5
commit 6fe9b0f0d4
2 changed files with 72 additions and 72 deletions

View File

@ -1,4 +1,10 @@
intersecting 0.3.2 by paramat intersecting 0.4.0 by paramat
For latest stable Minetest back to 0.4.8 For Minetest 0.4.12 and later
Depends default Depends default
Licenses: code WTFPL Licenses: Code WTFPL, textures CC BY-SA 3.0
Unlimited tunnel and magma tunnel networks created from 3D noise.
3D underground 'biomes', each with a differing mix of 2 intersecting tunnel systems, the biomes create a few dead ends.
Mostly separate from this is a larger scaled magma tunnel network, if these magma tunnels come to surface in water, default lavacooling creates obsidian tubes.
Optional glowing lux ore craftable with 8 glass nodes to 8 lights, lux ore also spawns in desert dungeon walls.
You can use this with or instead of normal caves, disabling normal caves removes the lava caves and some features in the landscape.

132
init.lua
View File

@ -1,8 +1,3 @@
-- intersecting 0.3.2 by paramat
-- For latest stable Minetest and back to 0.4.8
-- Depends default
-- License: code WTFPL
-- Parameters -- Parameters
local TTUN = 0.02 -- Tunnel width local TTUN = 0.02 -- Tunnel width
@ -15,7 +10,7 @@ local LUXCHA = 1 / 9 ^ 3 -- Luxore chance per stone node.
local np_weba = { local np_weba = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=192, y=192, z=192}, spread = {x = 192, y = 192, z = 192},
seed = 5900033, seed = 5900033,
octaves = 3, octaves = 3,
persist = 0.5 persist = 0.5
@ -26,7 +21,7 @@ local np_weba = {
local np_webb = { local np_webb = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=191, y=191, z=191}, spread = {x = 191, y = 191, z = 191},
seed = 33, seed = 33,
octaves = 3, octaves = 3,
persist = 0.5 persist = 0.5
@ -37,7 +32,7 @@ local np_webb = {
local np_webc = { local np_webc = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=190, y=190, z=190}, spread = {x = 190, y = 190, z = 190},
seed = -18000001, seed = -18000001,
octaves = 3, octaves = 3,
persist = 0.5 persist = 0.5
@ -48,7 +43,7 @@ local np_webc = {
local np_webd = { local np_webd = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=384, y=384, z=384}, spread = {x = 384, y = 384, z = 384},
seed = -181, seed = -181,
octaves = 3, octaves = 3,
persist = 0.4 persist = 0.4
@ -59,7 +54,7 @@ local np_webd = {
local np_webe = { local np_webe = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=383, y=383, z=383}, spread = {x = 383, y = 383, z = 383},
seed = 1022081, seed = 1022081,
octaves = 3, octaves = 3,
persist = 0.4 persist = 0.4
@ -70,39 +65,29 @@ local np_webe = {
local np_biome = { local np_biome = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=384, y=384, z=384}, spread = {x = 384, y = 384, z = 384},
seed = 89114, seed = 89114,
octaves = 1, octaves = 1,
persist = 0 persist = 0
} }
-- Stuff
intersecting = {}
-- Nodes -- Nodes
minetest.register_node("intersecting:luxoff", {
description = "Dark Lux Ore",
tiles = {"intersecting_luxore.png"},
light_source = 14,
groups = {cracky=3},
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("intersecting:luxore", { minetest.register_node("intersecting:luxore", {
description = "Lux Ore", description = "Lux Ore",
tiles = {"intersecting_luxore.png"}, tiles = {"intersecting_luxore.png"},
paramtype = "light",
light_source = 14, light_source = 14,
groups = {cracky=3}, groups = {cracky = 3},
sounds = default.node_sound_glass_defaults(), sounds = default.node_sound_glass_defaults(),
}) })
minetest.register_node("intersecting:light", { minetest.register_node("intersecting:light", {
description = "Light", description = "Light",
tiles = {"intersecting_light.png"}, tiles = {"intersecting_light.png"},
paramtype = "light",
light_source = 14, light_source = 14,
groups = {cracky=3,oddly_breakable_by_hand=3}, groups = {cracky = 3, oddly_breakable_by_hand = 3},
sounds = default.node_sound_glass_defaults(), sounds = default.node_sound_glass_defaults(),
}) })
@ -126,19 +111,14 @@ minetest.register_craft({
}, },
}) })
-- ABM spread luxore light -- Initialize noise objects to nil
if LUX then local nobj_weba = nil
minetest.register_abm({ local nobj_webb = nil
nodenames = {"intersecting:luxoff"}, local nobj_webc = nil
interval = 7, local nobj_webd = nil
chance = 1, local nobj_webe = nil
action = function(pos, node) local nobj_biome = nil
minetest.remove_node(pos)
minetest.place_node(pos, {name="intersecting:luxore"})
end,
})
end
-- On generated function -- On generated function
@ -155,57 +135,69 @@ minetest.register_on_generated(function(minp, maxp, seed)
local y0 = minp.y local y0 = minp.y
local z0 = minp.z local z0 = minp.z
print ("[intersecting] chunk minp ("..x0.." "..y0.." "..z0..")")
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}
local data = vm:get_data() local data = vm:get_data()
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
local c_water = minetest.get_content_id("default:water_source") local c_water = minetest.get_content_id("default:water_source")
local c_dirt = minetest.get_content_id("default:dirt") local c_dirt = minetest.get_content_id("default:dirt")
local c_sand = minetest.get_content_id("default:sand")
local c_lava = minetest.get_content_id("default:lava_source") local c_lava = minetest.get_content_id("default:lava_source")
local c_grass = minetest.get_content_id("default:dirt_with_grass") local c_grass = minetest.get_content_id("default:dirt_with_grass")
local c_tree = minetest.get_content_id("default:tree") local c_tree = minetest.get_content_id("default:tree")
local c_jtree = minetest.get_content_id("default:jungletree") local c_jtree = minetest.get_content_id("default:jungletree")
local c_stone = minetest.get_content_id("default:stone") local c_stone = minetest.get_content_id("default:stone")
local c_desertstone = minetest.get_content_id("default:desert_stone") local c_desertstone = minetest.get_content_id("default:desert_stone")
local c_sandstone = minetest.get_content_id("default:sandstone")
local c_luxore = minetest.get_content_id("intersecting:luxoff") local c_luxore = minetest.get_content_id("intersecting:luxore")
local sidelen = x1 - x0 + 1 local sidelen = x1 - x0 + 1
local chulens = {x=sidelen, y=sidelen, z=sidelen} local emerlen = sidelen + 32
local minposxyz = {x=x0, y=y0, z=z0} local emerarea = emerlen ^ 2
local chulens = {x = sidelen, y = sidelen, z = sidelen}
local minposxyz = {x = x0, y = y0, z = z0}
local nvals_weba = minetest.get_perlin_map(np_weba, chulens):get3dMap_flat(minposxyz) nobj_weba = nobj_weba or minetest.get_perlin_map(np_weba, chulens)
local nvals_webb = minetest.get_perlin_map(np_webb, chulens):get3dMap_flat(minposxyz) nobj_webb = nobj_webb or minetest.get_perlin_map(np_webb, chulens)
local nvals_webc = minetest.get_perlin_map(np_webc, chulens):get3dMap_flat(minposxyz) nobj_webc = nobj_webc or minetest.get_perlin_map(np_webc, chulens)
local nvals_webd = minetest.get_perlin_map(np_webd, chulens):get3dMap_flat(minposxyz) nobj_webd = nobj_webd or minetest.get_perlin_map(np_webd, chulens)
local nvals_webe = minetest.get_perlin_map(np_webe, chulens):get3dMap_flat(minposxyz) nobj_webe = nobj_webe or minetest.get_perlin_map(np_webe, chulens)
local nvals_biome = minetest.get_perlin_map(np_biome, chulens):get3dMap_flat(minposxyz) nobj_biome = nobj_biome or minetest.get_perlin_map(np_biome, chulens)
local nvals_weba = nobj_weba:get3dMap_flat(minposxyz)
local nvals_webb = nobj_webb:get3dMap_flat(minposxyz)
local nvals_webc = nobj_webc:get3dMap_flat(minposxyz)
local nvals_webd = nobj_webd:get3dMap_flat(minposxyz)
local nvals_webe = nobj_webe:get3dMap_flat(minposxyz)
local nvals_biome = nobj_biome:get3dMap_flat(minposxyz)
local cavbel = {} local cavbel = {}
local stobel = {} --local stobel = {}
local nixyz = 1 local nixyz = 1
for z = z0, z1 do -- for each xy plane progressing northwards for z = z0, z1 do -- for each xy plane progressing northwards
for y = y0, y1 do -- for each x row progressing upwards for y = y0, y1 do -- for each x row progressing upwards
local ti = 1 local ti = 1
local vi = area:index(x0, y, z) local vi = area:index(x0, y, z)
local via = area:index(x0, y+1, z) local via = vi + emerlen
local vin = area:index(x0, y, z+1) local vin = vi + emerarea
local vis = area:index(x0, y, z-1) local vis = vi - emerarea
local vie = vi + 1 local vie = vi + 1
local viw = vi - 1 local viw = vi - 1
for x = x0, x1 do -- for each node do for x = x0, x1 do -- for each node progressing eastwards
local nodid = data[vi] local nodid = data[vi]
local nodida = data[via] local nodida = data[via]
local nodide = data[vie] local nodide = data[vie]
local nodidw = data[viw] local nodidw = data[viw]
local nodidn = data[vin] local nodidn = data[vin]
local nodids = data[vis] local nodids = data[vis]
-- water adjacent
local watadj = nodida == c_water local watadj = nodida == c_water
or nodidw == c_water or nodide == c_water or nodidn == c_water or nodids == c_water or nodidw == c_water or nodide == c_water
local surfmat = (nodid == c_sand or nodid == c_dirt or nodid == c_grass) and y <= 2 or nodidn == c_water or nodids == c_water
-- lakebed material
local surfmat = (nodid == c_sand or nodid == c_dirt
or nodid == c_grass) and y <= 2
if nodid ~= c_air then if nodid ~= c_air then
local weba = math.abs(nvals_weba[nixyz]) < TTUN local weba = math.abs(nvals_weba[nixyz]) < TTUN
local webb = math.abs(nvals_webb[nixyz]) < TTUN local webb = math.abs(nvals_webb[nixyz]) < TTUN
@ -230,24 +222,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
data[vi] = c_air data[vi] = c_air
end end
cavbel[ti] = 1 cavbel[ti] = 1
stobel[ti] = 0 --stobel[ti] = 0
elseif (nodid == c_water or watadj) and cavbel[ti] == 1 then elseif (nodid == c_water or watadj) and cavbel[ti] == 1 then
for j = -1, -16, -1 do -- water plug for j = -1, -16, -1 do -- water plug
local vip = area:index(x, y+j, z) local vip = area:index(x, y + j, z)
if data[vip] == c_air then if data[vip] == c_air then
data[vip] = c_stone data[vip] = c_stone
end end
end end
cavbel[ti] = 0 cavbel[ti] = 0
stobel[ti] = 0 --stobel[ti] = 0
elseif nodid ~= c_water and not surfmat and not watadj then elseif nodid ~= c_water and not surfmat and not watadj then
data[vi] = c_air -- tunnel data[vi] = c_air -- tunnel
cavbel[ti] = 1 cavbel[ti] = 1
stobel[ti] = 0 --stobel[ti] = 0
end end
if nodid == c_tree or nodid == c_jtree then -- if trunk cut remove whole trunk -- if trunk cut remove whole trunk
if nodid == c_tree or nodid == c_jtree then
for j = -12, 12 do for j = -12, 12 do
local vit = area:index(x, y+j, z) local vit = area:index(x, y + j, z)
if data[vit] == c_tree or data[vit] == c_jtree then if data[vit] == c_tree or data[vit] == c_jtree then
data[vit] = c_air data[vit] = c_air
end end
@ -255,18 +248,19 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
else -- solid or liquid else -- solid or liquid
cavbel[ti] = 0 cavbel[ti] = 0
if nodid == c_stone or nodid == c_desertstone then if nodid == c_stone or nodid == c_desertstone
or nodid == c_sandstone then
if LUX then if LUX then
if math.random() < LUXCHA and stobel[ti] == 1 and y > y0 then if math.random() < LUXCHA then
data[vi] = c_luxore data[vi] = c_luxore
end end
end end
stobel[ti] = 1 --stobel[ti] = 1
end end
end end
else -- nodid == c_air else -- nodid == c_air
cavbel[ti] = 0 cavbel[ti] = 0
stobel[ti] = 0 --stobel[ti] = 0
end end
nixyz = nixyz + 1 nixyz = nixyz + 1
ti = ti + 1 ti = ti + 1
@ -281,10 +275,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
vm:set_data(data) vm:set_data(data)
vm:set_lighting({day=0, night=0}) vm:set_lighting({day = 0, night = 0})
vm:calc_lighting() vm:calc_lighting()
vm:write_to_map(data) vm:write_to_map(data)
local chugent = math.ceil((os.clock() - t1) * 1000) local chugent = math.ceil((os.clock() - t1) * 1000)
print ("[intersecting] "..chugent.." ms") print ("[intersecting] " .. chugent .. " ms")
end) end)