tree test

This commit is contained in:
Aleksey Chubukov 2023-05-11 02:39:08 +03:00
parent 6c384cbc26
commit 940592395d
36 changed files with 163 additions and 81 deletions

View File

@ -5,6 +5,7 @@ globals = {
"minetest", "minetest",
"ebiometrees", "ebiometrees",
"eaction" "eaction"
"ebiome"
} }
read_globals = { read_globals = {

6
mods/ebiome/api.lua Normal file
View File

@ -0,0 +1,6 @@
function ebiome.register_biome(name, data)
if not data.type or data.type == "simple"
then
minetest.register_biome(name, data)
end
end

View File

@ -1,5 +0,0 @@
ebiome = {
blocktypes = {
stone = "eterrain:rock"
}
}

View File

@ -1,2 +1,3 @@
dofile(minetest.get_modpath("ebiome") .. "/biomes/grasslands.lua") ebiome = {}
dofile(minetest.get_modpath("ebiome") .. "/api.lua")

View File

@ -1,3 +1,2 @@
depends = ebiometrees
description = biome mod description = biome mod
name = ebiome name = ebiome

16
mods/ebiometrees/api.lua Normal file
View File

@ -0,0 +1,16 @@
ebiometrees.registered_trees = {}
function ebiometrees.register_tree(name, data)
ebiometrees.registered_trees[name] = data
ebiometrees.register_subnodes(name)
end
function ebiometrees.register_subnodes(tree_name)
local modname = tree_name:match("([^:]*):")
local basename = tree_name:match(":([^:]+)")
local data = ebiometrees.registered_trees[tree_name]
ebiometrees.register_tree_sapling(modname, basename, data)
ebiometrees.register_tree_sprout(modname, basename, data)
ebiometrees.register_tree_leaves(modname, basename, data)
ebiometrees.register_tree_trunks(modname, basename, data)
end

View File

@ -1,2 +1,12 @@
ebiometrees = {}
ebiometrees.directions = {
up = vector.new( 0, 1, 0),
down = vector.new( 0, -1, 0),
north = vector.new( 0, 0, 1),
east = vector.new( 1, 0, 0),
south = vector.new( 0, 0, -1),
west = vector.new(-1, 0, 0)
}
dofile(minetest.get_modpath("ebiometrees").."/sapling.lua") dofile(minetest.get_modpath("ebiometrees").."/sapling.lua")
dofile(minetest.get_modpath("ebiometrees").."/tree.lua") dofile(minetest.get_modpath("ebiometrees").."/tree.lua")
dofile(minetest.get_modpath("ebiometrees").."/api.lua")

View File

@ -1,14 +1,3 @@
ebiometrees = {}
ebiometrees.directions = {
up = vector.new( 0, 1, 0),
down = vector.new( 0, -1, 0),
north = vector.new( 0, 0, 1),
east = vector.new( 1, 0, 0),
south = vector.new( 0, 0, -1),
west = vector.new(-1, 0, 0)
}
function ebiometrees.grow_closure(nextstage) function ebiometrees.grow_closure(nextstage)
local function growtree(pos) local function growtree(pos)
minetest.set_node(pos, {name=nextstage}) minetest.set_node(pos, {name=nextstage})
@ -16,6 +5,7 @@ function ebiometrees.grow_closure(nextstage)
return growtree return growtree
end end
function ebiometrees.where_to_grow_trunk_closure(grow_preferences, leaves_name) function ebiometrees.where_to_grow_trunk_closure(grow_preferences, leaves_name)
local function where_to_grow_trunk(pos) local function where_to_grow_trunk(pos)
for _, directions in ipairs(grow_preferences) for _, directions in ipairs(grow_preferences)
@ -24,7 +14,14 @@ function ebiometrees.where_to_grow_trunk_closure(grow_preferences, leaves_name)
local candidate_dir = directions[1] local candidate_dir = directions[1]
local candidate = vector.copy(pos):add(candidate_dir) local candidate = vector.copy(pos):add(candidate_dir)
local node = minetest.get_node_or_nil(candidate) local node = minetest.get_node_or_nil(candidate)
if node and node.name == leaves_name corner1 = pos:add({x=-1, y=-1, z=-1}):add(candidate_dir:multiply(2))
corner2 = pos:add({x= 1, y= 1, z= 1}):add(candidate_dir:multiply(2))
local spacious, _ = minetest.find_nodes_in_area(
corner1, corner2, "group:treetrunk"
)
minetest.chat_send_all(dump2(spacious))
minetest.chat_send_all(#spacious)
if node and node.name == leaves_name and #spacious == 0
then then
return candidate return candidate
end end
@ -33,20 +30,27 @@ function ebiometrees.where_to_grow_trunk_closure(grow_preferences, leaves_name)
return where_to_grow_trunk return where_to_grow_trunk
end end
function ebiometrees.grow_trunk_closure(trunk_terminal_name, grow_preferences, leaves_name)
function ebiometrees.grow_trunk_closure(trunk_terminal_name, grow_preferences, leaves_name, grow_limit)
local function grow_trunk(pos) local function grow_trunk(pos)
local where = ebiometrees.where_to_grow_trunk_closure( local meta = minetest.get_meta(pos)
grow_preferences, leaves_name if meta:get_int("ebiometrees:distance") > grow_limit
) then
return
end
local where = ebiometrees.where_to_grow_trunk_closure(grow_preferences, leaves_name)
local there = where(pos) local there = where(pos)
if there if there
then then
minetest.set_node(there, {name=trunk_terminal_name}) minetest.set_node(there, {name=trunk_terminal_name})
local newmeta = minetest.get_meta(there)
newmeta:set_int("ebiometrees:distance", meta:get_int("ebiometrees:distance")+1)
end end
end end
return grow_trunk return grow_trunk
end end
function ebiometrees.grow_leaves_closure(leaves_name) function ebiometrees.grow_leaves_closure(leaves_name)
local function grow_leaves(pos) local function grow_leaves(pos)
local free_node = minetest.find_node_near(pos, 1, "air") local free_node = minetest.find_node_near(pos, 1, "air")
@ -60,8 +64,8 @@ function ebiometrees.grow_leaves_closure(leaves_name)
end end
function ebiometrees.tree_grower(leaves_name, grow_preferences, terminal_name, nextstage, age_max) function ebiometrees.tree_grower(leaves_name, grow_preferences, terminal_name, nextstage, age_max, grow_limit)
local grow_trunk = ebiometrees.grow_trunk_closure(terminal_name, grow_preferences, leaves_name) local grow_trunk = ebiometrees.grow_trunk_closure(terminal_name, grow_preferences, leaves_name, grow_limit)
local grow_leaves = ebiometrees.grow_leaves_closure(leaves_name) local grow_leaves = ebiometrees.grow_leaves_closure(leaves_name)
local function grow_tree(pos) local function grow_tree(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -80,8 +84,3 @@ function ebiometrees.tree_grower(leaves_name, grow_preferences, terminal_name, n
return grow_tree return grow_tree
end end
function ebiometrees.root_sapling(pos)
minetest.set_node(pos, {name="ebiome:oak_sprout"})
return false
end

View File

@ -0,0 +1,40 @@
package.path = "../?.lua;" .. package.path
_G.ebiometrees = {}
require("api")
require("tree")
require("sapling")
registries={}
function _G.ebiometrees.register_tree_trunks(m, n, d)
registries.trunks = m..":"..n
end
function _G.ebiometrees.register_tree_sprout(m, n, d)
registries.sprout = m..":"..n
end
function _G.ebiometrees.register_tree_leaves(m, n, d)
registries.leaves = m..":"..n
end
function _G.ebiometrees.register_tree_sapling(m, n, d)
registries.sapling = m..":"..n
end
testtree = {
groups = { foo = 1}
}
describe("Trees", function()
it("can register tree", function()
assert.is_nil(ebiometrees.registered_trees["test:tree"])
ebiometrees.register_tree("test:tree", testtree)
assert.is_not_nil(ebiometrees.registered_trees["test:tree"])
end)
it("attempts to register sapling", function()
assert.is_equal("test:tree", registries.sapling)
end)
end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

View File

@ -1,52 +1,13 @@
local function growth_timer(pos) local function growth_timer(pos)
minetest.get_node_timer(pos):start(3) minetest.get_node_timer(pos):start(3)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_int("ebiometrees:age", 0)
meta:mark_as_private("ebiometrees:age") meta:mark_as_private("ebiometrees:age")
meta:set_int("ebiometrees:age", 0)
end end
function ebiometrees.register_tree_leaves(modname, basename, data)
local S = minetest.get_translator("ebiometrees") local S = minetest.get_translator(modname)
function ebiometrees.register_tree(modname, basename, data)
-- register saplings
local sapling_name = modname..":"..basename.."_sapling"
local sprout_name = modname..":"..basename.."_sprout"
local sapling_groups = table.copy(data.groups)
local sprout_groups = table.copy(data.groups)
sapling_groups.sapling = 1
sapling_groups.snappy = 2
sapling_groups.dig_immediate = 3
sprout_groups.sapling = 1
sprout_groups.snappy = 2
minetest.register_node(sapling_name, {
description = S(data.description.." sapling"),
drawtype = "plantlike",
tiles = { modname.."_"..basename.."_sapling.png"},
paramtype = "light",
on_timer = ebiometrees.grow_closure(
modname..":"..basename.."_sprout"
),
sunlight_propagates = true,
walkable = false,
groups = sapling_groups,
on_construct = growth_timer
})
minetest.register_node(sprout_name, {
description = S(data.description.." sprout"),
drawtype = "plantlike",
visual_scale = 1.4,
tiles = { modname.."_"..basename.."_sprout.png" },
paramtype = "light",
sunlight_propagates = true,
walkable = false,
on_timer = ebiometrees.grow_closure(
modname..":"..basename.."_trunk_growing_terminal"
),
groups = sprout_groups,
on_construct = growth_timer
})
-- register tree leaves
local leaves_groups = table.copy(data.groups) local leaves_groups = table.copy(data.groups)
leaves_groups.leaves = 1 leaves_groups.leaves = 1
leaves_groups.leafdecay = 3 leaves_groups.leafdecay = 3
@ -61,6 +22,54 @@ function ebiometrees.register_tree(modname, basename, data)
is_ground_content = false, is_ground_content = false,
groups = leaves_groups groups = leaves_groups
}) })
end
function ebiometrees.register_tree_sapling(modname, basename, data)
-- register saplings
local S = minetest.get_translator(modname)
local sapling_groups = table.copy(data.groups)
sapling_groups.sapling = 1
sapling_groups.snappy = 2
sapling_groups.dig_immediate = 3
minetest.register_node(modname..":"..basename.."_sapling", {
description = S(data.description.." sapling"),
drawtype = "plantlike",
tiles = { modname.."_"..basename.."_sapling.png"},
paramtype = "light",
on_timer = ebiometrees.grow_closure(
modname..":"..basename.."_sprout"
),
sunlight_propagates = true,
walkable = false,
groups = sapling_groups,
on_construct = growth_timer
})
end
function ebiometrees.register_tree_sprout(modname, basename, data)
-- register tree leaves
local S = minetest.get_translator(modname)
local sprout_groups = table.copy(data.groups)
sprout_groups.sapling = 1
sprout_groups.snappy = 2
minetest.register_node(modname..":"..basename.."_sprout", {
description = S(data.description.." sprout"),
drawtype = "plantlike",
visual_scale = 1.4,
tiles = { modname.."_"..basename.."_sprout.png" },
paramtype = "light",
sunlight_propagates = true,
walkable = false,
on_timer = ebiometrees.grow_closure(
modname..":"..basename.."_trunk_growing_terminal"
),
groups = sprout_groups,
on_construct = growth_timer
})
end
function ebiometrees.register_tree_trunks(modname, basename, data)
local S = minetest.get_translator(modname)
-- registers corresponding trunk nodes -- registers corresponding trunk nodes
local trunk_groups = table.copy(data.groups) local trunk_groups = table.copy(data.groups)
trunk_groups.choppy = 2 -- TODO: customizations trunk_groups.choppy = 2 -- TODO: customizations
@ -154,7 +163,8 @@ function ebiometrees.register_tree(modname, basename, data)
}, },
modname..":"..basename.."_trunk_growing_terminal", modname..":"..basename.."_trunk_growing_terminal",
modname..":"..basename.."_trunk_normal_"..trunk_subtype, modname..":"..basename.."_trunk_normal_"..trunk_subtype,
20 20,
10
) )
end end
minetest.register_node( minetest.register_node(

View File

@ -1,4 +1,4 @@
local S = minetest.get_translator("ebiome") local S = minetest.get_translator("electric_biomes")
minetest.register_biome({ minetest.register_biome({
name = "grasslands", name = "grasslands",
node_top = "mapgen_topsoil", node_top = "mapgen_topsoil",
@ -10,13 +10,13 @@ minetest.register_biome({
heat_point = 50, heat_point = 50,
humidity_point = 50, humidity_point = 50,
}) })
ebiometrees.register_tree("ebiome", "oak",{ ebiometrees.register_tree("electric_biomes:oak",{
description = "Oak", description = "Oak",
groups = {flammable = 2} groups = {flammable = 2}
}) })
minetest.register_node("ebiome:grass", { minetest.register_node("electric_biomes:grass", {
description = S("Grass"), description = S("Grass"),
tiles = {"ebiome_grass.png"}, tiles = {"electric_biomes_grass.png"},
drawtype = "plantlike", drawtype = "plantlike",
visual_scale = 1.4, visual_scale = 1.4,
waving = 1, waving = 1,
@ -29,8 +29,8 @@ minetest.register_node("ebiome:grass", {
fuel = 1 fuel = 1
}, },
}) })
minetest.register_alias("grass", "ebiome:grass") minetest.register_alias("grass", "electric_biomes:grass")
minetest.register_alias("grassplant", "ebiome:grass") minetest.register_alias("grassplant", "electric_biomes:grass")
minetest.register_decoration({ minetest.register_decoration({
deco_type = "simple", deco_type = "simple",
@ -40,7 +40,7 @@ minetest.register_decoration({
biomes = {"grasslands"}, biomes = {"grasslands"},
y_max = 200, y_max = 200,
y_min = 1, y_min = 1,
decoration = "ebiome:grass", decoration = "electric_biomes:grass",
}) })

View File

@ -0,0 +1,2 @@
dofile(minetest.get_modpath("electric_biomes") .. "/biomes/grasslands.lua")

View File

@ -0,0 +1,3 @@
depends = ebiome, ebiometrees
description = electric game biomes
name = electric_biomes

View File

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 914 B

View File

Before

Width:  |  Height:  |  Size: 667 B

After

Width:  |  Height:  |  Size: 667 B

View File

Before

Width:  |  Height:  |  Size: 674 B

After

Width:  |  Height:  |  Size: 674 B

View File

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 661 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 929 B

After

Width:  |  Height:  |  Size: 929 B

View File

Before

Width:  |  Height:  |  Size: 841 B

After

Width:  |  Height:  |  Size: 841 B

View File

Before

Width:  |  Height:  |  Size: 745 B

After

Width:  |  Height:  |  Size: 745 B

View File

Before

Width:  |  Height:  |  Size: 907 B

After

Width:  |  Height:  |  Size: 907 B

View File

Before

Width:  |  Height:  |  Size: 936 B

After

Width:  |  Height:  |  Size: 936 B

View File

Before

Width:  |  Height:  |  Size: 808 B

After

Width:  |  Height:  |  Size: 808 B

View File

Before

Width:  |  Height:  |  Size: 699 B

After

Width:  |  Height:  |  Size: 699 B

View File

Before

Width:  |  Height:  |  Size: 737 B

After

Width:  |  Height:  |  Size: 737 B

View File

Before

Width:  |  Height:  |  Size: 753 B

After

Width:  |  Height:  |  Size: 753 B

View File

Before

Width:  |  Height:  |  Size: 797 B

After

Width:  |  Height:  |  Size: 797 B

View File

Before

Width:  |  Height:  |  Size: 829 B

After

Width:  |  Height:  |  Size: 829 B

View File

Before

Width:  |  Height:  |  Size: 847 B

After

Width:  |  Height:  |  Size: 847 B