diff options
Diffstat (limited to 'init.lua')
-rw-r--r-- | init.lua | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..1be7c1c --- /dev/null +++ b/init.lua @@ -0,0 +1,403 @@ +-- 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(), +}) + |