Working on adding a whole new set of trees to the mod

Most of the added code written by RealBadAngel
Also adds a couple of additional biome controls to jungle trees and conifers.
Also adds a text file describing the biome settings in a human-readable manner.

At present, this doesn't actually add anything new, it just refactors the
code to allow for more trees, and adds a bunch of biome definitions, tree
models, textures, etc. but no code to use them, yet.
This commit is contained in:
Vanessa Ezekowitz 2013-01-19 18:36:13 -05:00
parent c4f79a76cd
commit 1bd0afbc84
60 changed files with 726 additions and 354 deletions

View File

@ -1,16 +1,13 @@
More trees!
This mod adds more types of trees to the game
at present, they consist of jungle trees and conifers
This mod adds a whole bunch of new types of trees to the game
Much of the code here came from cisoun's conifers mod and bas080's
jungle trees mod.
jungle trees mod, and big contributions by RealBadAngel.
Brought together into one mod and made L-systems compatible by Vanessa
Ezekowitz.
Jungle tree axioms/rules tweaked by RealBadAngel
License: WTFPL
Dependencies: plants_lib (or plantlife modpack), default

148
biome_defs.lua Normal file
View File

@ -0,0 +1,148 @@
--[[
-- Example biome definition:
mytree_biome = {
surface = "default:dirt_with_grass", -- must grow on these nodes only
avoid_nodes = {"default:tree"}, -- avoid spawning near these
avoid_radius = 12, -- Keep this much room around the above avoid items
seed_diff = 12345, -- perlin seed-diff for "generally able to grow plants here" control
neighbors = "default:dirt_with_grass", -- this node must be adjacent to the node being spawned on
ncount = 8, -- and there must be this many of them
depth = 1, -- spawning surface must be no deeper than this
min_elevation = -5, -- minimum elevation to spawn on
max_elevation = 10, -- maximum elevation
near_nodes = {"default:water_source"}, -- trees will only spawn near these nodes
near_nodes_size = 10, -- within this radius of at least one of them
near_nodes_count = 20, -- there must ne this many of those nodes in the area
temp_min = 0.5, -- minimum allowable temperature (highest temperature map perlin value)
temp_max = 0.1, -- maximum allowable temperature (lowest perlin value)
}
]]--
moretrees.jungletree_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 12,
seed_diff = 329,
min_elevation = -5,
max_elevation = 10,
near_nodes = {"default:water_source"},
near_nodes_size = 15,
near_nodes_count = 10,
-- temp_min = 0.05,
}
moretrees.conifer_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 10,
seed_diff = 359,
min_elevation = 25,
temp_min = 0.9,
temp_max = 0.3,
}
moretrees.palm_biome = {
surface = "default:sand",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 5,
seed_diff = 330,
min_elevation = -1,
max_elevation = 1,
near_nodes = {"default:water_source"},
near_nodes_size = 15,
near_nodes_count = 10,
temp_min = 0.15,
temp_max = -0.15,
}
moretrees.apple_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 15,
seed_diff = 331,
min_elevation = 1,
max_elevation = 10,
temp_min = 0.1,
temp_max = -0.15,
}
moretrees.oak_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 15,
seed_diff = 332,
min_elevation = 0,
max_elevation = 10,
temp_min = 0.4,
temp_max = 0.2,
}
moretrees.sequoia_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 10,
seed_diff = 333,
min_elevation = 0,
max_elevation = 10,
temp_min = 1,
temp_max = -0.4,
}
moretrees.birch_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 5,
seed_diff = 334,
min_elevation = 10,
max_elevation = 15,
temp_min = 0.9,
temp_max = 0.3,
}
moretrees.spruce_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 10,
seed_diff = 335,
min_elevation = 20,
temp_min = 0.9,
temp_max = 0.7,
}
moretrees.pine_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 10,
seed_diff = 336,
near_nodes = {"default:water_source"},
near_nodes_size = 15,
near_nodes_count = 5,
}
moretrees.willow_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 20,
seed_diff = 337,
min_elevation = -5,
max_elevation = 5,
near_nodes = {"default:water_source"},
near_nodes_size = 15,
near_nodes_count = 5,
}
moretrees.rubber_biome = {
surface = "default:dirt_with_grass",
avoid_nodes = moretrees.avoidnodes,
avoid_radius = 20,
seed_diff = 338,
min_elevation = -5,
max_elevation = 5,
near_nodes = {"default:water_source"},
near_nodes_size = 15,
near_nodes_count = 10,
temp_min = -0.15,
}

408
init.lua
View File

@ -1,15 +1,16 @@
-- More trees!
--
-- This mod adds more types of trees to the game
-- at present, they consist of jungle trees and conifers
--
-- Much of the node definitions here came from cisoun's conifers mod and
-- bas080's jungle trees mod.
-- Some of the node definitions and textures came from cisoun's conifers mod
-- and bas080's jungle trees mod.
--
-- Brought together into one mod and made L-systems compatible by Vanessa
-- Ezekowitz. Thrown together on 2013-01-09 :-)
--
-- Jungle tree axioms/rules tweaked by RealBadAngel
-- Conifers and Jungle tree axioms/rules by Vanessa Ezekowitz, with the
-- latter having been tweaked by RealBadAngel, most others written by
-- RealBadAngel.
--
-- License: WTFPL for all parts (code and textures)
--
@ -24,192 +25,72 @@
-- in_biome = true
-- end
--
-- We'll just save this for later use ;-)
-- We'll just save this for possible later use ;-)
--
moretrees = {}
-- Jungletree init stuff:
dofile(minetest.get_modpath("moretrees").."/crafts.lua")
dofile(minetest.get_modpath("moretrees").."/node_defs.lua")
dofile(minetest.get_modpath("moretrees").."/tree_models.lua")
dofile(minetest.get_modpath("moretrees").."/biome_defs.lua")
local JT_SPAWN_INTERVAL = 1000
local JT_SPAWN_CHANCE = 100
plantslib:register_generate_plant(moretrees.jungletree_biome, "moretrees:grow_jungletree")
plantslib:register_generate_plant(moretrees.conifer_biome, "moretrees:grow_conifer")
local JT_GROW_INTERVAL = 100
local JT_GROW_CHANCE = 10
--plantslib:register_generate_plant(moretrees.palm_biome, moretrees.palm_model)
local JT_RADIUS = 15
local JT_WATER_RADIUS = 15
local JT_WATER_COUNT = 10
--------------------------
-- Other stuff
--
-- for backward compatibility with previous mods/code, jungle trees and
-- firs ("conifers") L-Systems definitions are established separately.
--
--------------------------
local jungletree_seed_diff = plantslib.plantlife_seed_diff
-- Code that spawns jungle trees and firs ("conifers")
-- Conifers init stuff:
moretrees.jt_axiom1 = "FFFA"
moretrees.jt_rules_a1 = "FFF[&&-FBf[&&&Ff]^^^Ff][&&+FBFf[&&&FFf]^^^Ff][&&---FBFf[&&&Ff]^^^Ff][&&+++FBFf[&&&Ff]^^^Ff]F/A"
moretrees.jt_rules_b1 = "[-Ff&f][+Ff&f]B"
local CONIFERS_SPAWN_SAPLING_INTERVAL = 1000
local CONIFERS_SPAWN_SAPLING_CHANCE = 100
moretrees.jt_axiom2 = "FFFFFA"
moretrees.jt_rules_a2 = "FFFFF[&&-FFFBF[&&&FFff]^^^FFf][&&+FFFBFF[&&&FFff]^^^FFf][&&---FFFBFF[&&&FFff]^^^FFf][&&+++FFFBFF[&&&FFff]^^^FFf]FF/A"
moretrees.jt_rules_b2 = "[-FFf&ff][+FFf&ff]B"
local CONIFERS_GROW_SAPLING_INTERVAL = 100
local CONIFERS_GROW_SAPLING_CHANCE = 10
moretrees.ct_rules_a1 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A"
moretrees.ct_rules_b1 = "[-FBf][+FBf]"
local CONIFERS_DISTANCE = 9 -- how far apart should conifer saplings spawn?
local CONIFERS_ALTITUDE = 25
local CONIFERS_REMOVE_TREES = false -- Remove trees above CONIFERS_ALTITUDE?
local CONIFERS_RTREES_INTERVAL = 360
local CONIFERS_RTREES_CHANCE = 10
local conifers_seed_diff = plantslib.plantlife_seed_diff + 30
-- Spawning functions
jungletrees_biome = {
surface = "default:dirt_with_grass", -- must grow on grass only
avoid = {"jungletree:sapling","default:jungletree"}, -- avoid spawning near these
radius = JT_RADIUS, -- Keep this much room around the above avoid items
seed_diff = jungletree_seed_diff, -- duh? :-)
neighbors = nil, -- we don't care about neighbors
ncount = nil, -- or the count thereof
depth = nil, -- or depth of the spawn surface
min_elevation = -5, -- must be 5m below sea level or higher
max_elevation = 10, -- but no higher than 10m
near_nodes = {"default:water_source"}, -- Jungle trees must be near water
near_nodes_size = JT_WATER_RADIUS, -- within this radius of it (default 25)
near_nodes_count = JT_WATER_COUNT, -- with this many water nodes in the area
temp_min = nil, -- don't care about temperature
temp_max = nil, -- at either end of the scale
exec_funct = "moretrees:grow_jungletree" -- name of the function to execute to grow a tree
}
conifers_biome = {
surface = "default:dirt_with_grass",
avoid = {"conifers:sapling", "conifers:trunk"},
radius = CONIFERS_DISTANCE,
seed_diff = conifers_seed_diff,
neighbors = nil,
ncount = nil,
depth = nil,
min_elevation = CONIFERS_ALTITUDE,
max_elevation = nil,
near_nodes = nil,
near_nodes_size = nil,
near_nodes_count = nil,
temp_min = nil,
temp_max = nil,
exec_funct = "moretrees:grow_conifer"
}
plantslib:register_generate_plant(jungletrees_biome)
plantslib:register_generate_plant(conifers_biome)
-- growing functions
plantslib:grow_plants(
JT_GROW_INTERVAL,
JT_GROW_CHANCE,
"jungletree:sapling",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"moretrees:grow_jungletree",
jungletree_seed_diff
)
plantslib:grow_plants(
CONIFERS_GROW_SAPLING_INTERVAL,
CONIFERS_GROW_SAPLING_CHANCE,
"conifers:sapling",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"moretrees:grow_conifer",
conifers_seed_diff
)
-- L-System Tree definitions
local jungle_tree={
axiom=nil,
rules_a=nil,
rules_b=nil,
trunk="default:jungletree",
leaves="jungletree:leaves_green",
leaves2=nil,
leaves2_chance=nil,
angle=45,
iterations=nil,
random_level=2,
trunk_type=nil,
thin_branches=true;
fruit_chance=15,
fruit="vines:vine"
}
local jt_axiom1 = "FFFA"
local jt_rules_a1 = "FFF[&&-FBf[&&&Ff]^^^Ff][&&+FBFf[&&&FFf]^^^Ff][&&---FBFf[&&&Ff]^^^Ff][&&+++FBFf[&&&Ff]^^^Ff]F/A"
local jt_rules_b1 = "[-Ff&f][+Ff&f]B"
local jt_axiom2 = "FFFFFA"
local jt_rules_a2 = "FFFFF[&&-FFFBF[&&&FFff]^^^FFf][&&+FFFBFF[&&&FFff]^^^FFf][&&---FFFBFF[&&&FFff]^^^FFf][&&+++FFFBFF[&&&FFff]^^^FFf]FF/A"
local jt_rules_b2 = "[-FFf&ff][+FFf&ff]B"
local conifer_tree={
axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]Fff",
rules_a=nil,
rules_b=nil,
trunk="conifers:trunk",
leaves=nil,
angle=45,
iterations=7,
random_level=5,
thin_trunks=true
}
local ct_rules_a1 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A"
local ct_rules_b1 = "[-FBf][+FBf]"
local ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A"
local ct_rules_b2 = "[-fB][+fB]"
-- Code that actually spawns the trees!
moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A"
moretrees.ct_rules_b2 = "[-fB][+fB]"
function moretrees:grow_jungletree(pos)
local r1 = math.random(2)
local r2 = math.random(3)
if r1 == 1 then
jungle_tree["leaves2"] = "jungletree:leaves_red"
moretrees.jungletree_model.leaves2 = "jungletree:leaves_red"
else
jungle_tree["leaves2"] = "jungletree:leaves_yellow"
moretrees.jungletree_model.leaves2 = "jungletree:leaves_yellow"
end
jungle_tree["leaves2_chance"] = math.random(25, 75)
moretrees.jungletree_model.leaves2_chance = math.random(25, 75)
if r2 == 1 then
jungle_tree["trunk_type"] = "single"
jungle_tree["iterations"] = 2
jungle_tree["axiom"] = jt_axiom1
jungle_tree["rules_a"] = jt_rules_a1
jungle_tree["rules_b"] = jt_rules_b1
moretrees.jungletree_model.trunk_type = "single"
moretrees.jungletree_model.iterations = 2
moretrees.jungletree_model.axiom = moretrees.jt_axiom1
moretrees.jungletree_model.rules_a = moretrees.jt_rules_a1
moretrees.jungletree_model.rules_b = moretrees.jt_rules_b1
elseif r2 == 2 then
jungle_tree["trunk_type"] = "double"
jungle_tree["iterations"] = 4
jungle_tree["axiom"] = jt_axiom2
jungle_tree["rules_a"] = jt_rules_a2
jungle_tree["rules_b"] = jt_rules_b2
moretrees.jungletree_model.trunk_type = "double"
moretrees.jungletree_model.iterations = 4
moretrees.jungletree_model.axiom = moretrees.jt_axiom2
moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2
moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2
elseif r2 == 3 then
jungle_tree["trunk_type"] = "crossed"
jungle_tree["iterations"] = 4
jungle_tree["axiom"] = jt_axiom2
jungle_tree["rules_a"] = jt_rules_a2
jungle_tree["rules_b"] = jt_rules_b2
moretrees.jungletree_model.trunk_type = "crossed"
moretrees.jungletree_model.iterations = 4
moretrees.jungletree_model.axiom = moretrees.jt_axiom2
moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2
moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2
end
minetest.env:remove_node(pos)
@ -217,21 +98,21 @@ function moretrees:grow_jungletree(pos)
for leaf in ipairs(leaves) do
minetest.env:remove_node(leaves[leaf])
end
minetest.env:spawn_tree(pos,jungle_tree)
minetest.env:spawn_tree(pos, moretrees.jungletree_model)
end
function moretrees:grow_conifer(pos)
if math.random(2) == 1 then
conifer_tree["leaves"]="conifers:leaves"
moretrees.conifer_model.leaves="conifers:leaves"
else
conifer_tree["leaves"]="conifers:leaves_special"
moretrees.conifer_model.leaves="conifers:leaves_special"
end
if math.random(2) == 1 then
conifer_tree["rules_a"] = ct_rules_a1
conifer_tree["rules_b"] = ct_rules_b1
moretrees.conifer_model.rules_a = moretrees.ct_rules_a1
moretrees.conifer_model.rules_b = moretrees.ct_rules_b1
else
conifer_tree["rules_a"] = ct_rules_a2
conifer_tree["rules_b"] = ct_rules_b2
moretrees.conifer_model.rules_a = moretrees.ct_rules_a2
moretrees.conifer_model.rules_b = moretrees.ct_rules_b2
end
minetest.env:remove_node(pos)
@ -239,12 +120,13 @@ function moretrees:grow_conifer(pos)
for leaf in ipairs(leaves) do
minetest.env:remove_node(leaves[leaf])
end
minetest.env:spawn_tree(pos,conifer_tree)
minetest.env:spawn_tree(pos,moretrees.conifer_model)
end
-- Other stuff
-- Should we remove all the trees above the conifers altitude?
if CONIFERS_REMOVE_TREES == true then
minetest.register_abm({
nodenames = {
@ -264,176 +146,4 @@ if CONIFERS_REMOVE_TREES == true then
})
end
-- Nodes for jungle trees
minetest.register_node(":jungletree:sapling", {
description = "Jungle Tree Sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tiles = {"jungletree_sapling.png"},
inventory_image = "jungletree_sapling.png",
wield_image = "default_sapling.png",
paramtype = "light",
walkable = false,
groups = {snappy=2,dig_immediate=3,flammable=2},
})
local leaves = {"green","yellow","red"}
for color = 1, 3 do
local leave_name = ":jungletree:leaves_"..leaves[color]
minetest.register_node(leave_name, {
description = "Jungle Tree Leaves",
drawtype = "allfaces_optional",
tiles = {"jungletree_leaves_"..leaves[color]..".png"},
paramtype = "light",
groups = {snappy=3, leafdecay=3, flammable=2},
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/20 chance
items = {'jungletree:sapling'},
rarity = 20,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = {"jungletree:leaves_"..leaves[color]},
}
}
},
sounds = default.node_sound_leaves_defaults(),
})
end
-- Nodes for conifers
minetest.register_node(":conifers:trunk", {
description = "Conifer trunk",
tile_images = {
"conifers_trunktop.png",
"conifers_trunktop.png",
"conifers_trunk.png",
"conifers_trunk.png",
"conifers_trunk.png",
"conifers_trunk.png"
},
paramtype = "facedir_simple",
is_ground_content = true,
groups = {
tree = 1,
snappy = 2,
choppy = 2,
oddly_breakable_by_hand = 1,
flammable = 2
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_node(":conifers:trunk_reversed", {
description = "Conifer reversed trunk",
tile_images = {
"conifers_trunk_reversed.png",
"conifers_trunk_reversed.png",
"conifers_trunktop.png",
"conifers_trunktop.png",
"conifers_trunk_reversed.png",
"conifers_trunk_reversed.png"
},
--inventory_image = minetest.inventorycube(
--"conifers_trunk.png",
--"conifers_trunktop.png",
--"conifers_trunk.png"
--),
paramtype = "facedir_simple",
material = minetest.digprop_woodlike(1.0),
legacy_facedir_simple = true,
is_ground_content = true,
groups = {
tree = 1,
snappy = 2,
choppy = 2,
oddly_breakable_by_hand = 1,
flammable = 2
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_node(":conifers:leaves", {
description = "Conifer leaves",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tile_images = { "conifers_leaves.png" },
paramtype = "light",
groups = {
snappy = 3,
leafdecay = 3,
flammable = 2
},
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/20 chance
items = {'conifers:sapling'},
rarity = 20,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = {'conifers:leaves'},
}
}
},
sounds = default.node_sound_leaves_defaults()
})
minetest.register_node(":conifers:leaves_special", {
description = "Bright conifer leaves",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tile_images = { "conifers_leaves_special.png" },
paramtype = "light",
groups = {
snappy = 3,
leafdecay = 3,
flammable = 2
},
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/20 chance
items = {'conifers:sapling'},
rarity = 20,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = {'conifers:leaves'},
}
}
},
sounds = default.node_sound_leaves_defaults()
})
minetest.register_node(":conifers:sapling", {
description = "Conifer sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tile_images = {"conifers_sapling.png"},
inventory_image = "conifers_sapling.png",
wield_image = "conifers_sapling.png",
paramtype = "light",
walkable = false,
groups = {
snappy = 2,
dig_immediate = 3,
flammable = 2
},
sounds = default.node_sound_defaults(),
})
dofile(minetest.get_modpath("moretrees").."/crafts.lua")
print("[Moretrees] Loaded (2013-01-18)")

287
node_defs.lua Normal file
View File

@ -0,0 +1,287 @@
leaves = {
{"beech", "Beech Leaves"},
{"apple_tree", "Apple Tree Leaves"},
{"oak", "Oak Leaves"},
{"sequoia", "Sequoia Needles"},
{"birch", "Birch Leaves"},
{"palm", "Palm Leaves"},
{"spruce", "Spruce Needles"},
{"pine", "Pine Needles"},
{"willow", "Willow Leaves"},
{"rubber_tree", "Rubber Tree Leaves"},
}
for i in ipairs(leaves) do
local name = leaves[i]
minetest.register_node("moretrees:"..leaves[i][1].."_leaves", {
description = leaves[i][2],
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = { "moretrees_"..leaves[i][1].."_leaves.png" },
paramtype = "light",
groups = {tree=1, snappy=3, flammable=2},
sounds = default.node_sound_leaves_defaults(),
})
end
trees = {
{"beech", "Beech", nil, nil, nil },
{"apple_tree", "Apple Tree", nil, nil, nil },
{"oak", "Oak", "acorn", "Acorn", {-0.2, -0.5, -0.2, 0.2, 0, 0.2} },
{"sequoia", "Sequoia", nil, nil, nil },
{"birch", "Birch", nil, nil, nil },
{"palm", "Palm", "coconut", "Coconut", {-0.2, -0.5, -0.2, 0.2, 0, 0.2} },
{"spruce", "Spruce", "spruce_cone", "Spruce Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2} },
{"pine", "Pine", "pine_cone", "Pine Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2} },
{"willow", "Willow", nil, nil, nil },
{"rubber_tree", "Rubber Tree", nil, nil, nil },
}
moretrees.avoidnodes = {}
table.insert(moretrees.avoidnodes, "default:jungletree")
table.insert(moretrees.avoidnodes, "jungletree:sapling")
table.insert(moretrees.avoidnodes, "conifers:trunk")
table.insert(moretrees.avoidnodes, "conifers:sapling")
for i in ipairs(trees) do
local treename = trees[i][1]
local treedesc = trees[i][2]
local fruit = trees[i][3]
local fruitdesc = trees[i][4]
local selbox = trees[i][5]
table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk")
table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling")
minetest.register_node("moretrees:"..treename.."_trunk", {
description = treedesc.." Trunk",
tiles = {
"moretrees_"..treename.."_top.png",
"moretrees_"..treename.."_top.png",
"moretrees_"..treename..".png"
},
is_ground_content = true,
groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("moretrees:"..treename.."_planks", {
description = treedesc.." Planks",
tiles = {"moretrees_"..treename.."_wood.png"},
is_ground_content = true,
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("moretrees:"..treename.."_sapling", {
description = treedesc.." Sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tiles = {"moretrees_"..treename.."_sapling.png"},
inventory_image = "moretrees_"..treename.."_sapling.png",
wield_image = "moretrees_"..treename.."_sapling.png",
paramtype = "light",
walkable = false,
selection_box = {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
},
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
sounds = default.node_sound_defaults(),
})
if (fruit ~= nil) then
minetest.register_node("moretrees:"..fruit, {
description = fruitdesc,
drawtype = "plantlike",
visual_scale = 0.8,
tiles = { "moretrees_"..fruit..".png" },
inventory_image = "moretrees_"..fruit..".png",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = selbox
},
groups = {fleshy=3,dig_immediate=3,flammable=2},
sounds = default.node_sound_defaults(),
})
end
end
--- For backward compatibility, jungle trees and firs ("conifers") are defined
--- separately.
-- Nodes for jungle trees
minetest.register_node(":jungletree:sapling", {
description = "Jungle Tree Sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tiles = {"jungletree_sapling.png"},
inventory_image = "jungletree_sapling.png",
wield_image = "default_sapling.png",
paramtype = "light",
walkable = false,
groups = {snappy=2,dig_immediate=3,flammable=2},
})
local leaves = {"green","yellow","red"}
for color = 1, 3 do
local leave_name = ":jungletree:leaves_"..leaves[color]
minetest.register_node(leave_name, {
description = "Jungle Tree Leaves",
drawtype = "allfaces_optional",
tiles = {"jungletree_leaves_"..leaves[color]..".png"},
paramtype = "light",
groups = {snappy=3, leafdecay=3, flammable=2},
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/20 chance
items = {'jungletree:sapling'},
rarity = 20,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = {"jungletree:leaves_"..leaves[color]},
}
}
},
sounds = default.node_sound_leaves_defaults(),
})
end
-- Nodes for conifers
minetest.register_node(":conifers:trunk", {
description = "Conifer trunk",
tile_images = {
"conifers_trunktop.png",
"conifers_trunktop.png",
"conifers_trunk.png",
"conifers_trunk.png",
"conifers_trunk.png",
"conifers_trunk.png"
},
paramtype = "facedir_simple",
is_ground_content = true,
groups = {
tree = 1,
snappy = 2,
choppy = 2,
oddly_breakable_by_hand = 1,
flammable = 2
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_node(":conifers:trunk_reversed", {
description = "Conifer reversed trunk",
tile_images = {
"conifers_trunk_reversed.png",
"conifers_trunk_reversed.png",
"conifers_trunktop.png",
"conifers_trunktop.png",
"conifers_trunk_reversed.png",
"conifers_trunk_reversed.png"
},
--inventory_image = minetest.inventorycube(
--"conifers_trunk.png",
--"conifers_trunktop.png",
--"conifers_trunk.png"
--),
paramtype = "facedir_simple",
material = minetest.digprop_woodlike(1.0),
legacy_facedir_simple = true,
is_ground_content = true,
groups = {
tree = 1,
snappy = 2,
choppy = 2,
oddly_breakable_by_hand = 1,
flammable = 2
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_node(":conifers:leaves", {
description = "Conifer leaves",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tile_images = { "conifers_leaves.png" },
paramtype = "light",
groups = {
snappy = 3,
leafdecay = 3,
flammable = 2
},
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/20 chance
items = {'conifers:sapling'},
rarity = 20,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = {'conifers:leaves'},
}
}
},
sounds = default.node_sound_leaves_defaults()
})
minetest.register_node(":conifers:leaves_special", {
description = "Bright conifer leaves",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tile_images = { "conifers_leaves_special.png" },
paramtype = "light",
groups = {
snappy = 3,
leafdecay = 3,
flammable = 2
},
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/20 chance
items = {'conifers:sapling'},
rarity = 20,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = {'conifers:leaves'},
}
}
},
sounds = default.node_sound_leaves_defaults()
})
minetest.register_node(":conifers:sapling", {
description = "Conifer sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tile_images = {"conifers_sapling.png"},
inventory_image = "conifers_sapling.png",
wield_image = "conifers_sapling.png",
paramtype = "light",
walkable = false,
groups = {
snappy = 2,
dig_immediate = 3,
flammable = 2
},
sounds = default.node_sound_defaults(),
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 901 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 B

BIN
textures/moretrees_beech.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

BIN
textures/moretrees_beech_top.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 861 B

BIN
textures/moretrees_oak.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

BIN
textures/moretrees_palm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

BIN
textures/moretrees_pine.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 681 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

18
tree_biomes.txt Normal file
View File

@ -0,0 +1,18 @@
Elevation Temperature Nearness to Nearby What nodes Perlin Avoid
Tree type (m) (approx., °C) some node water to spawn on seed diff radius
-----------------------------------------------------------------------------------------------------------------------
jungle tree - 5 to +10 above +26 water, 15 10 dirt_with_grass 329 7
fir (conifers) above +25 -20 to +10 n/a n/a dirt_with_grass 359 8
palm - 1 to + 1 +18 to +32 water, 15 10 sand 330 5
apple + 1 to +10 +23 to +32 n/a n/a dirt_with grass 331 15
oak 0 to +10 + 4 to +16 n/a n/a dirt_with grass 332 15
sequoia 0 to +10 -30 to +50 n/a n/a dirt_with grass 333 10
birch +10 to +15 -20 to +10 n/a n/a dirt_with grass 334 5
spruce above +20 -20 to +10 n/a n/a dirt_with grass 335 10
pine n/a n/a water, 15 5 dirt_with grass 336 10
willow - 5 to + 5 n/a water, 15 5 dirt_with grass 337 20
rubber - 5 to + 5 above +32 water, 15 10 dirt_with_grass 338 20
beech (default) n/a n/a n/a n/a dirt_with_grass 2 10

212
tree_models.lua Normal file
View File

@ -0,0 +1,212 @@
beech_model={
axiom="FFFFFBFB",
rules_a="[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fdd]]",
rules_b="[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&Fd]//d[+^d][--&d]]",
rules_c="/",
rules_d="F",
trunk="moretrees:beech_trunk",
leaves="moretrees:beech_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="single";
thin_branches=true;
}
apple_tree_model={
axiom="FFFFFAFFBF",
rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]",
rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]",
trunk="moretrees:apple_tree_trunk",
leaves="moretrees:apple_tree_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="single",
thin_branches=true;
fruit="default:apple",
fruit_chance=15,
}
oak_model={
axiom="FFFFFFA",
rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]",
rules_b="[&FFFA]////[&FFFA]////[&FFFA]",
trunk="moretrees:oak_trunk",
leaves="moretrees:oak_leaves",
angle=30,
iterations=5,
random_level=2,
trunk_type="crossed";
thin_branches=false;
fruit="moretrees:acorn",
fruit_chance=3,
}
sequoia_model={
axiom="FFFFFFFFFFddccA///cccFddcFA///ddFcFA/cFFddFcdBddd/A/ccdcddd/ccAddddcFBcccAccFdFcFBcccc/BFdFFcFFdcccc/B",
rules_a="[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]",
rules_b="[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]",
rules_c="/",
rules_d="F",
trunk="moretrees:sequoia_trunk",
leaves="moretrees:sequoia_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="crossed",
thin_branches=true
}
birch_model1={
axiom="FFFFFdddccA/FFFFFFcA/FFFFFFcB",
rules_a="[&&&dddd^^ddddddd][&&&---dddd^^ddddddd][&&&+++dddd^^ddddddd][&&&++++++dddd^^ddddddd]",
rules_b="[&&&ddd^^ddddd][&&&---ddd^^ddddd][&&&+++ddd^^ddddd][&&&++++++ddd^^ddddd]",
rules_c="/",
rules_d="F",
trunk="moretrees:birch_trunk",
leaves="moretrees:birch_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="single",
thin_branches=true
}
birch_model2={
axiom="FFFdddccA/FFFFFccA/FFFFFccB",
rules_a="[&&&dFFF^^FFFdd][&&&---dFFF^^FFFdd][&&&+++dFFF^^FFFdd][&&&++++++dFFF^^FFFdd]",
rules_b="[&&&dFF^^FFFd][&&&---dFFF^^FFFd][&&&+++dFF^^FFFd][&&&++++++dFF^^FFFd]",
rules_c="/",
rules_d="F",
trunk="moretrees:birch_trunk",
leaves="moretrees:birch_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="single",
thin_branches=true
}
palm_model={
axiom="FFccc&FFFFFdddFA//A//A//A//A//A",
rules_a="[&fb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ffff&bbbb&b]",
rules_b="f",
rules_c="/",
rules_d="F",
trunk="moretrees:palm_trunk",
leaves="moretrees:palm_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="single",
thin_branches=true,
fruit="moretrees:coconut",
fruit_chance=0
}
spruce_model1={
axiom="FFFFFAFFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]",
rules_a="[&&&FFFFFF^^FFF][&&&++FFFFFF^^FFF][&&&++++FFFFFF^^FFF][&&&++++++FFFFFF^^FFF][&&&--FFFFFF^^FFF][&&&----FFFFFF^^FFF]",
rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]",
rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]",
rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]",
trunk="moretrees:spruce_trunk",
leaves="moretrees:spruce_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="crossed",
thin_branches=true,
fruit="moretrees:cone",
fruit_chance=8
}
spruce_model2={
axiom="FFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]",
rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]",
rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]",
rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]",
trunk="moretrees:spruce_trunk",
leaves="moretrees:spruce_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="crossed",
thin_branches=true,
fruit="moretrees:cone",
fruit_chance=8
}
pine_model={
axiom="FFFFFcccdddB///cFdFB////cFdFB///cFdFB///cFdFA///cFdFA///cFdFB[FF]f",
rules_a="[&&&TTTT[++^TFdd][--&TFd]//Tdd[+^Fd][--&Fdd]]",
rules_b="[&&&TTT[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]",
rules_c="/",
rules_d="F",
trunk="moretrees:pine_trunk",
leaves="moretrees:pine_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="single",
thin_branches=true,
fruit="moretrees:pine_cone",
fruit_chance=8
}
willow_model={
axiom="FFFFFFFFccA",
rules_a="[&FF&FFFF&&F&FFFFFFFdddd][**&FF&FFFF&&F&FFFFFFFdddd][//&FF&FFFF&&F&FFFFFFFdddd][////&FF&FFFF&&F&FFFFFFFdddd][//////&FF&FFFF&&F&FFFFFFFdddd][////////&FF&FFFF&&F&FFFFFFFdddd]",
rules_c="/",
rules_d="F",
trunk="moretrees:willow_trunk",
leaves="moretrees:willow_leaves",
angle=30,
iterations=2,
random_level=0,
trunk_type="crossed",
thin_branches=true
}
rubber_tree={
axiom="FFFFA",
rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]",
rules_b="[&FFA]////[&FFA]////[&FFA]",
trunk="moretrees:rubber_tree_trunk",
leaves="moretrees:rubber_tree_leaves",
angle=35,
iterations=3,
random_level=1,
trunk_type="double",
thin_branches=true
}
moretrees.jungletree_model={
axiom=nil,
rules_a=nil,
rules_b=nil,
trunk="default:jungletree",
leaves="jungletree:leaves_green",
leaves2=nil,
leaves2_chance=nil,
angle=45,
iterations=nil,
random_level=2,
trunk_type=nil,
thin_branches=true;
fruit_chance=15,
fruit="vines:vine"
}
moretrees.conifer_model={
axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]Fff",
rules_a=nil,
rules_b=nil,
trunk="conifers:trunk",
leaves=nil,
angle=45,
iterations=7,
random_level=5,
thin_trunks=true
}