moretrees/init.lua
Vanessa Ezekowitz e0837f30d1 first commit
2013-01-09 21:35:50 -05:00

404 lines
9.2 KiB
Lua

-- More trees!
--
-- This mod adds more types of trees to the game
-- at present, they consist of jungle trees and conifers
--
-- Much of the code here 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.
--
-- Jungle tree axioms/rules tweaked by RealBadAngel
--
local DEBUG = false
-- Jungletree init stuff:
local JT_SPAWN_INTERVAL = 100
local JT_SPAWN_CHANCE = 10
local JT_GROW_INTERVAL = 1000
local JT_GROW_CHANCE = 100
local JT_RADIUS = 8
local JT_WATER_RADIUS = 25
local JT_WATER_COUNT = 10
local jungletree_seed_diff = plantlife_seed_diff
-- Conifers init stuff:
local CONIFERS_SPAWN_SAPLING_CHANCE = 500
local CONIFERS_SPAWN_SAPLING_INTERVAL = 3600
local CONIFERS_GROW_SAPLING_CHANCE = 100
local CONIFERS_GROW_SAPLING_INTERVAL = 3600
--local CONIFERS_TRUNK_MINHEIGHT = 7
--local CONIFERS_TRUNK_MAXHEIGHT = 25
--local CONIFERS_LEAVES_MINHEIGHT = 2
--local CONIFERS_LEAVES_MAXHEIGHT = 6
--local CONIFERS_LEAVES_MAXRADIUS = 5
--local CONIFERS_LEAVES_NARROWRADIUS = 3 -- For narrow typed conifers.
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 = plantlife_seed_diff+30
-- Spawning functions
spawn_on_surfaces(
JT_SPAWN_INTERVAL, -- ABM interval parameter
"jungletree:sapling", -- We want to spawn a sapling
JT_RADIUS, -- Keep this much room around saplings
JT_SPAWN_CHANCE, -- ABM chance parameter
"default:dirt_with_grass", -- must grow on grass only
{"jungletree:sapling","default:jungletree"}, -- avoid spawning near these
jungletree_seed_diff, -- duh? :-)
5, -- minimum light needed
nil, -- maximim (default, 14)
nil, -- ABM neighbors parameter...
nil, -- don't care what else is around
nil, -- we don't care about facedir
nil, -- or water depth
-5, -- must be 5m below sea level or higher
15, -- but no higher than 15m
{"default:water_source"}, -- Jungle trees must be near water
JT_WATER_RADIUS, -- within this radius of it (default 25)
JT_WATER_COUNT -- with this many water nodes in the area
)
spawn_on_surfaces(
CONIFERS_SPAWN_SAPLING_INTERVAL,
"conifers:sapling",
CONIFERS_DISTANCE,
CONIFERS_SPAWN_SAPLING_CHANCE,
"default:dirt_with_grass",
{"conifers:sapling", "conifers:trunk"},
conifers_seed_diff,
nil,
nil,
{"default:dirt_with_grass"},
3,
nil,
nil,
CONIFERS_ALTITUDE,
nil
)
-- growing functions
grow_plants(
JT_GROW_INTERVAL,
JT_GROW_CHANCE,
"jungletree:sapling",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"grow_jungletree",
jungletree_seed_diff
)
grow_plants(
CONIFERS_GROW_SAPLING_INTERVAL,
CONIFERS_GROW_SAPLING_CHANCE,
"conifers:sapling",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"grow_conifer",
conifers_seed_diff
)
-- Code that actually spawns the trees!
function grow_jungletree(pos, noise)
minetest.env:remove_node(pos)
if math.random(1, 2) > 1.5 then
minetest.env:spawn_tree(pos,jungle_tree1)
else
minetest.env:spawn_tree(pos,jungle_tree2)
end
end
function grow_conifer(pos, noise)
minetest.env:remove_node(pos)
if math.random(1, 2) > 1.5 then
minetest.env:spawn_tree(pos,conifer_tree1)
else
minetest.env:spawn_tree(pos,conifer_tree2)
end
end
-- Other stuff
-- Should we remove all the trees above the conifers altitude?
if CONIFERS_REMOVE_TREES == true then
minetest.register_abm({
nodenames = {
"default:tree",
"default:leaves"
},
interval = CONIFERS_RTREES_INTERVAL,
chance = CONIFERS_RTREES_CHANCE,
action = function(pos, node, _, _)
if minetest.env:get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name == "air"
and pos.y >= CONIFERS_ALTITUDE
then
minetest.env:add_node(pos , {name = "air"})
end
end
})
end
-- L-System Tree definitions
jungle_tree1={
axiom="FFFFFA",
rules_a="FFFFF[&&-FFFBF[&&&FFf]^^^FFf][&&+FFFBFF[&&&FFf]^^^FFf][&&---FFFBFF[&&&FFf]^^^FFf][&&+++FFFBFF[&&&FFf]^^^FFf]FF/A",
rules_b="[-FFf&F][+FFf&F]B",
trunk="default:jungletree",
leaves="jungletree:leaves_green",
leaves2="jungletree:leaves_yellow",
leaves2_chance=50,
angle=45,
iterations=4,
random_level=2,
trunk_type="crossed",
thin_branches=true;
fruit_chance=15,
fruit="vines:vine"
}
jungle_tree2={
axiom="FFFFFA",
rules_a="FFFFF[&&-FFFBF[&&&FFf]^^^FFf][&&+FFFBFF[&&&FFf]^^^FFf][&&---FFFBFF[&&&FFf]^^^FFf][&&+++FFFBFF[&&&FFf]^^^FFf]FF/A",
rules_b="[-FFf&F][+FFf&F]B",
trunk="default:jungletree",
leaves="jungletree:leaves_green",
leaves2="jungletree:leaves_red",
leaves2_chance=50,
angle=45,
iterations=4,
random_level=2,
trunk_type="crossed",
thin_branches=true;
fruit_chance=15,
fruit="vines:vine"
}
conifer_tree1={
axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]FF",
rules_a="FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A",
rules_b="[-FB][+FB]",
trunk="conifers:trunk",
leaves="conifers:leaves",
angle=45,
iterations=7,
random_level=4,
thin_trunks=true
}
conifer_tree2={
axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]FF",
rules_a="FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A",
rules_b="[-FB][+FB]",
trunk="conifers:trunk",
leaves="conifers:leaves_special",
angle=45,
iterations=7,
random_level=4,
thin_trunks=true
}
-- 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 = {leave_name},
}
}
},
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(),
})