mirror of
https://github.com/FaceDeer/dfcaverns.git
synced 2024-12-26 02:40:36 +01:00
getting some of the trees ready for mapgen
still need to do blood thorn and tunnel tube
This commit is contained in:
parent
2a9079a46f
commit
34110876e5
@ -72,15 +72,15 @@ minetest.register_node("dfcaverns:black_cap_sapling", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local c_stem = minetest.get_content_id("dfcaverns:black_cap_stem")
|
||||||
|
local c_cap = minetest.get_content_id("dfcaverns:black_cap")
|
||||||
|
local c_gills = minetest.get_content_id("dfcaverns:black_cap_gills")
|
||||||
|
|
||||||
dfcaverns.spawn_black_cap = function(pos)
|
dfcaverns.spawn_black_cap = function(pos)
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
local stem_height = math.random(1,5)
|
local stem_height = math.random(1,5)
|
||||||
local cap_radius = math.random(2,3)
|
local cap_radius = math.random(2,3)
|
||||||
local maxy = y + stem_height + 3
|
local maxy = y + stem_height + 3
|
||||||
|
|
||||||
local c_stem = minetest.get_content_id("dfcaverns:black_cap_stem")
|
|
||||||
local c_cap = minetest.get_content_id("dfcaverns:black_cap")
|
|
||||||
local c_gills = minetest.get_content_id("dfcaverns:black_cap_gills")
|
|
||||||
|
|
||||||
local vm = minetest.get_voxel_manip()
|
local vm = minetest.get_voxel_manip()
|
||||||
local minp, maxp = vm:read_from_map(
|
local minp, maxp = vm:read_from_map(
|
||||||
@ -95,4 +95,12 @@ dfcaverns.spawn_black_cap = function(pos)
|
|||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
vm:update_map()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
dfcaverns.spawn_black_cap_vm = function(vi, area, data)
|
||||||
|
local stem_height = math.random(1,5)
|
||||||
|
local cap_radius = math.random(2,3)
|
||||||
|
|
||||||
|
subterrane:giant_shroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius)
|
||||||
|
end
|
||||||
|
|
||||||
|
@ -77,29 +77,45 @@ minetest.register_node("dfcaverns:fungiwood_sapling", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local c_air = minetest.get_content_id("air")
|
||||||
|
local c_ignore = minetest.get_content_id("ignore")
|
||||||
|
local c_fungiwood = minetest.get_content_id("dfcaverns:fungiwood")
|
||||||
|
local c_fungiwood_shelf = minetest.get_content_id("dfcaverns:fungiwood_shelf")
|
||||||
|
|
||||||
function dfcaverns.spawn_fungiwood(pos)
|
function dfcaverns.spawn_fungiwood(pos)
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
local maxy = y + math.random(6, 10) -- Trunk top
|
local height = math.random(6, 10)
|
||||||
|
local maxy = y + height -- Trunk top
|
||||||
local c_air = minetest.get_content_id("air")
|
|
||||||
local c_ignore = minetest.get_content_id("ignore")
|
|
||||||
local c_fungiwood = minetest.get_content_id("dfcaverns:fungiwood")
|
|
||||||
local c_fungiwood_shelf = minetest.get_content_id("dfcaverns:fungiwood_shelf")
|
|
||||||
|
|
||||||
local vm = minetest.get_voxel_manip()
|
local vm = minetest.get_voxel_manip()
|
||||||
local minp, maxp = vm:read_from_map(
|
local minp, maxp = vm:read_from_map(
|
||||||
{x = x - 3, y = y, z = z - 3},
|
{x = x - 3, y = y, z = z - 3},
|
||||||
{x = x + 3, y = maxy + 3, z = z + 3}
|
{x = x + 3, y = maxy + 3, z = z + 3}
|
||||||
)
|
)
|
||||||
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
||||||
local data = vm:get_data()
|
local data = vm:get_data()
|
||||||
|
|
||||||
|
dfcaverns.spawn_fungiwood_vm(area:indexp(pos), area, data, height)
|
||||||
|
|
||||||
|
vm:set_data(data)
|
||||||
|
vm:write_to_map()
|
||||||
|
vm:update_map()
|
||||||
|
end
|
||||||
|
|
||||||
|
dfcaverns.spawn_fungiwood_vm = function(vi, area, data, height)
|
||||||
|
if height == nil then height = math.random(6, 10) end
|
||||||
|
local pos = area:position(vi)
|
||||||
|
local x = pos.x
|
||||||
|
local y = pos.y
|
||||||
|
local z = pos.z
|
||||||
|
local maxy = y + height -- Trunk top
|
||||||
|
|
||||||
-- Upper branches layer
|
-- Upper branches layer
|
||||||
local dev = 3
|
local dev = 3
|
||||||
for yy = maxy - 2, maxy do
|
for yy = maxy - 2, maxy do
|
||||||
for zz = z - dev, z + dev do
|
for zz = z - dev, z + dev do
|
||||||
local vi = a:index(x - dev, yy, zz)
|
local vi = area:index(x - dev, yy, zz)
|
||||||
local via = a:index(x - dev, yy + 1, zz)
|
local via = area:index(x - dev, yy + 1, zz)
|
||||||
for xx = x - dev, x + dev do
|
for xx = x - dev, x + dev do
|
||||||
if math.random() < 0.95 - dev * 0.05 then
|
if math.random() < 0.95 - dev * 0.05 then
|
||||||
local node_id = data[vi]
|
local node_id = data[vi]
|
||||||
@ -124,8 +140,8 @@ function dfcaverns.spawn_fungiwood(pos)
|
|||||||
my = yy
|
my = yy
|
||||||
end
|
end
|
||||||
for zz = zi, zi+1 do
|
for zz = zi, zi+1 do
|
||||||
local vi = a:index(xi, yy, zz)
|
local vi = area:index(xi, yy, zz)
|
||||||
local via = a:index(xi, yy + 1, zz)
|
local via = area:index(xi, yy + 1, zz)
|
||||||
for xx = xi, xi + 1 do
|
for xx = xi, xi + 1 do
|
||||||
local node_id = data[vi]
|
local node_id = data[vi]
|
||||||
if node_id == c_air or node_id == c_ignore then
|
if node_id == c_air or node_id == c_ignore then
|
||||||
@ -140,8 +156,8 @@ function dfcaverns.spawn_fungiwood(pos)
|
|||||||
dev = 2
|
dev = 2
|
||||||
for yy = my + 1, my + 2 do
|
for yy = my + 1, my + 2 do
|
||||||
for zz = z - dev, z + dev do
|
for zz = z - dev, z + dev do
|
||||||
local vi = a:index(x - dev, yy, zz)
|
local vi = area:index(x - dev, yy, zz)
|
||||||
local via = a:index(x - dev, yy + 1, zz)
|
local via = area:index(x - dev, yy + 1, zz)
|
||||||
for xx = x - dev, x + dev do
|
for xx = x - dev, x + dev do
|
||||||
if math.random() < 0.95 - dev * 0.05 then
|
if math.random() < 0.95 - dev * 0.05 then
|
||||||
local node_id = data[vi]
|
local node_id = data[vi]
|
||||||
@ -158,16 +174,11 @@ function dfcaverns.spawn_fungiwood(pos)
|
|||||||
|
|
||||||
-- Trunk
|
-- Trunk
|
||||||
for yy = y, maxy do
|
for yy = y, maxy do
|
||||||
local vi = a:index(x, yy, z)
|
local vi = area:index(x, yy, z)
|
||||||
local node_id = data[vi]
|
local node_id = data[vi]
|
||||||
if node_id == c_air or node_id == c_ignore or
|
if node_id == c_air or node_id == c_ignore or
|
||||||
node_id == c_fungiwood_shelf then
|
node_id == c_fungiwood_shelf then
|
||||||
data[vi] = c_fungiwood
|
data[vi] = c_fungiwood
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
vm:set_data(data)
|
|
||||||
vm:write_to_map()
|
|
||||||
vm:update_map()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -72,16 +72,16 @@ minetest.register_node("dfcaverns:goblin_cap_sapling", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local c_stem = minetest.get_content_id("dfcaverns:goblin_cap_stem")
|
||||||
|
local c_cap = minetest.get_content_id("dfcaverns:goblin_cap")
|
||||||
|
local c_gills = minetest.get_content_id("dfcaverns:goblin_cap_gills")
|
||||||
|
|
||||||
dfcaverns.spawn_goblin_cap = function(pos)
|
dfcaverns.spawn_goblin_cap = function(pos)
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
local stem_height = math.random(1,3)
|
local stem_height = math.random(1,3)
|
||||||
local cap_radius = math.random(3,6)
|
local cap_radius = math.random(3,6)
|
||||||
local maxy = y + stem_height + 3
|
local maxy = y + stem_height + 3
|
||||||
|
|
||||||
local c_stem = minetest.get_content_id("dfcaverns:goblin_cap_stem")
|
|
||||||
local c_cap = minetest.get_content_id("dfcaverns:goblin_cap")
|
|
||||||
local c_gills = minetest.get_content_id("dfcaverns:goblin_cap_gills")
|
|
||||||
|
|
||||||
local vm = minetest.get_voxel_manip()
|
local vm = minetest.get_voxel_manip()
|
||||||
local minp, maxp = vm:read_from_map(
|
local minp, maxp = vm:read_from_map(
|
||||||
{x = x - cap_radius, y = y, z = z - cap_radius},
|
{x = x - cap_radius, y = y, z = z - cap_radius},
|
||||||
@ -95,4 +95,10 @@ dfcaverns.spawn_goblin_cap = function(pos)
|
|||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
vm:update_map()
|
||||||
|
end
|
||||||
|
|
||||||
|
dfcaverns.spawn_goblin_cap_vm = function(vi, area, data)
|
||||||
|
local stem_height = math.random(1,3)
|
||||||
|
local cap_radius = math.random(3,6)
|
||||||
|
subterrane:giant_shroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius)
|
||||||
end
|
end
|
@ -72,16 +72,16 @@ minetest.register_node("dfcaverns:nether_cap_sapling", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local c_stem = minetest.get_content_id("dfcaverns:nether_cap_stem")
|
||||||
|
local c_cap = minetest.get_content_id("dfcaverns:nether_cap")
|
||||||
|
local c_gills = minetest.get_content_id("dfcaverns:nether_cap_gills")
|
||||||
|
|
||||||
dfcaverns.spawn_nether_cap = function(pos)
|
dfcaverns.spawn_nether_cap = function(pos)
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
local stem_height = math.random(1,3)
|
local stem_height = math.random(1,3)
|
||||||
local cap_radius = math.random(2,3)
|
local cap_radius = math.random(2,3)
|
||||||
local maxy = y + stem_height + 3
|
local maxy = y + stem_height + 3
|
||||||
|
|
||||||
local c_stem = minetest.get_content_id("dfcaverns:nether_cap_stem")
|
|
||||||
local c_cap = minetest.get_content_id("dfcaverns:nether_cap")
|
|
||||||
local c_gills = minetest.get_content_id("dfcaverns:nether_cap_gills")
|
|
||||||
|
|
||||||
local vm = minetest.get_voxel_manip()
|
local vm = minetest.get_voxel_manip()
|
||||||
local minp, maxp = vm:read_from_map(
|
local minp, maxp = vm:read_from_map(
|
||||||
{x = x - cap_radius, y = y, z = z - cap_radius},
|
{x = x - cap_radius, y = y, z = z - cap_radius},
|
||||||
@ -97,6 +97,12 @@ dfcaverns.spawn_nether_cap = function(pos)
|
|||||||
vm:update_map()
|
vm:update_map()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
dfcaverns.spawn_nether_cap_vm = function(vi, area, data)
|
||||||
|
local stem_height = math.random(1,3)
|
||||||
|
local cap_radius = math.random(2,3)
|
||||||
|
subterrane:giant_shroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius)
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "nether cap water freezing",
|
label = "nether cap water freezing",
|
||||||
nodenames = {"default:water_source", "default:river_water_source",},
|
nodenames = {"default:water_source", "default:river_water_source",},
|
||||||
|
114
spore_tree.lua
114
spore_tree.lua
@ -114,29 +114,111 @@ minetest.register_node("dfcaverns:spore_tree_sapling", {
|
|||||||
|
|
||||||
on_timer = function(pos)
|
on_timer = function(pos)
|
||||||
minetest.set_node(pos, {name="air"})
|
minetest.set_node(pos, {name="air"})
|
||||||
minetest.spawn_tree(pos, dfcaverns.spore_tree_def)
|
dfcaverns.spawn_spore_tree(pos)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
dfcaverns.spore_tree_def={
|
--fcaverns.spore_tree_def={
|
||||||
axiom="TTdddA",
|
-- axiom="TTdddA",
|
||||||
rules_a="[&&&Tdd&&FF][&&&++++Tdd&&FF][&&&----Tdd&&FF]",
|
-- rules_a="[&&&Tdd&&FF][&&&++++Tdd&&FF][&&&----Tdd&&FF]",
|
||||||
rules_d="T",
|
-- rules_d="T",
|
||||||
trunk="dfcaverns:spore_tree",
|
-- trunk="dfcaverns:spore_tree",
|
||||||
leaves="dfcaverns:spore_tree_frond",
|
-- leaves="dfcaverns:spore_tree_frond",
|
||||||
leaves2="dfcaverns:spore_tree_pod",
|
-- leaves2="dfcaverns:spore_tree_pod",
|
||||||
leaves2_chance=30,
|
-- leaves2_chance=30,
|
||||||
angle=30,
|
-- angle=30,
|
||||||
iterations=2,
|
-- iterations=2,
|
||||||
random_level=0,
|
-- random_level=0,
|
||||||
trunk_type="single",
|
-- trunk_type="single",
|
||||||
thin_branches=true,
|
-- thin_branches=true,
|
||||||
}
|
--}
|
||||||
|
|
||||||
|
dfcaverns.spawn_spore_tree_vm = function(vi, data, area, height, size, iters, has_fruiting_bodies)
|
||||||
|
if height == nil then height = math.random(3,6) end
|
||||||
|
if size == nil then size = 2 end
|
||||||
|
if iters == nil then iters = 10 end
|
||||||
|
if has_fruiting_bodies == nil then has_fruiting_bodies = math.random() < 0.5 end
|
||||||
|
|
||||||
|
local pos = area:position(vi)
|
||||||
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
|
local c_air = minetest.get_content_id("air")
|
||||||
|
local c_ignore = minetest.get_content_id("ignore")
|
||||||
|
local c_spore_pod = minetest.get_content_id("dfcaverns:spore_tree_pod")
|
||||||
|
local c_tree = minetest.get_content_id("dfcaverns:spore_tree")
|
||||||
|
local c_spore_frond = minetest.get_content_id("dfcaverns:spore_tree_frond")
|
||||||
|
|
||||||
|
local has_fruiting_bodies = true
|
||||||
|
|
||||||
|
-- Trunk
|
||||||
|
data[area:index(x, y, z)] = c_tree -- Force-place lowest trunk node to replace sapling
|
||||||
|
for yy = y + 1, y + height - 1 do
|
||||||
|
local vi = area:index(x, yy, z)
|
||||||
|
local node_id = data[vi]
|
||||||
|
if node_id == c_air or node_id == c_ignore or node_id == c_spore_frond then
|
||||||
|
data[vi] = c_tree
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Force leaves near the trunk
|
||||||
|
for z_dist = -1, 1 do
|
||||||
|
for y_dist = -size, 1 do
|
||||||
|
local vi = area:index(x - 1, y + height + y_dist, z + z_dist)
|
||||||
|
for x_dist = -1, 1 do
|
||||||
|
if data[vi] == c_air or data[vi] == c_ignore then
|
||||||
|
if has_fruiting_bodies and math.random() < 0.3 then
|
||||||
|
data[vi] = c_spore_pod
|
||||||
|
else
|
||||||
|
data[vi] = c_spore_frond
|
||||||
|
end
|
||||||
|
end
|
||||||
|
vi = vi + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Randomly add fronds in 2x2x2 clusters.
|
||||||
|
for i = 1, iters do
|
||||||
|
local clust_x = x + math.random(-size, size - 1)
|
||||||
|
local clust_y = y + height + math.random(-size, 0)
|
||||||
|
local clust_z = z + math.random(-size, size - 1)
|
||||||
|
|
||||||
|
for xi = 0, 1 do
|
||||||
|
for yi = 0, 1 do
|
||||||
|
for zi = 0, 1 do
|
||||||
|
local vi = area:index(clust_x + xi, clust_y + yi, clust_z + zi)
|
||||||
|
if data[vi] == c_air or data[vi] == c_ignore then
|
||||||
|
if has_fruiting_bodies and math.random() < 0.3 then
|
||||||
|
data[vi] = c_spore_pod
|
||||||
|
else
|
||||||
|
data[vi] = c_spore_frond
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
dfcaverns.spawn_spore_tree = function(pos)
|
dfcaverns.spawn_spore_tree = function(pos)
|
||||||
minetest.spawn_tree(pos, dfcaverns.spore_tree_def)
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
|
local height = math.random(4, 5)
|
||||||
|
|
||||||
|
local vm = minetest.get_voxel_manip()
|
||||||
|
local minp, maxp = vm:read_from_map(
|
||||||
|
{x = x - 2, y = y, z = z - 2},
|
||||||
|
{x = x + 2, y = y + height + 1, z = z + 2}
|
||||||
|
)
|
||||||
|
local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
||||||
|
local data = vm:get_data()
|
||||||
|
|
||||||
|
dfcaverns.spawn_spore_tree_vm(area:indexp(pos), data, area)
|
||||||
|
|
||||||
|
vm:set_data(data)
|
||||||
|
vm:write_to_map()
|
||||||
|
vm:update_map()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
minetest.register_abm{
|
minetest.register_abm{
|
||||||
label = "spore tree raining spores",
|
label = "spore tree raining spores",
|
||||||
nodenames = {"dfcaverns:spore_tree_pod"},
|
nodenames = {"dfcaverns:spore_tree_pod"},
|
||||||
|
@ -72,16 +72,16 @@ minetest.register_node("dfcaverns:tower_cap_sapling", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local c_stem = minetest.get_content_id("dfcaverns:tower_cap_stem")
|
||||||
|
local c_cap = minetest.get_content_id("dfcaverns:tower_cap")
|
||||||
|
local c_gills = minetest.get_content_id("dfcaverns:tower_cap_gills")
|
||||||
|
|
||||||
dfcaverns.spawn_tower_cap = function(pos)
|
dfcaverns.spawn_tower_cap = function(pos)
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
local stem_height = math.random(4,10)
|
local stem_height = math.random(4,10)
|
||||||
local cap_radius = math.random(4,6)
|
local cap_radius = math.random(4,6)
|
||||||
local maxy = y + stem_height + 3
|
local maxy = y + stem_height + 3
|
||||||
|
|
||||||
local c_stem = minetest.get_content_id("dfcaverns:tower_cap_stem")
|
|
||||||
local c_cap = minetest.get_content_id("dfcaverns:tower_cap")
|
|
||||||
local c_gills = minetest.get_content_id("dfcaverns:tower_cap_gills")
|
|
||||||
|
|
||||||
local vm = minetest.get_voxel_manip()
|
local vm = minetest.get_voxel_manip()
|
||||||
local minp, maxp = vm:read_from_map(
|
local minp, maxp = vm:read_from_map(
|
||||||
{x = x - cap_radius, y = y, z = z - cap_radius},
|
{x = x - cap_radius, y = y, z = z - cap_radius},
|
||||||
@ -95,4 +95,10 @@ dfcaverns.spawn_tower_cap = function(pos)
|
|||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
vm:update_map()
|
||||||
|
end
|
||||||
|
|
||||||
|
dfcaverns.spawn_tower_cap_vm = function(vi, area, data)
|
||||||
|
local stem_height = math.random(4,10)
|
||||||
|
local cap_radius = math.random(4,6)
|
||||||
|
subterrane:giant_shroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius)
|
||||||
end
|
end
|
Loading…
Reference in New Issue
Block a user