plantlife_modpack/ferns/gianttreefern.lua
Rogier e42b0ff4b3 Regular & giant treefern leaves: always drop a sapling, and either leaves or another sapling
As there is only one leaf per fern, this makes it possible and convenient
to farm ferns (which was impossible, and even replanting all chopped-down
fern plants was extremely laborious due to the rarity of saplings).

Although on average slightly more than one sapling is produced per plant,
replanting and reharvesting the leaves is still the quickest way to
obtain more saplings.
2015-06-21 13:57:41 +02:00

337 lines
10 KiB
Lua

-----------------------------------------------------------------------------------------------
-- Ferns - Giant Tree Fern 0.1.1
-----------------------------------------------------------------------------------------------
-- by Mossmanikin
-- License (everything): WTFPL
-- Contains code from: plants_lib
-- Looked at code from: 4seasons, default
-- Supports: vines
-----------------------------------------------------------------------------------------------
assert(abstract_ferns.config.enable_giant_treefern == true)
-- lot of code, lot to load
abstract_ferns.grow_giant_tree_fern = function(pos)
local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z}
if minetest.get_node(pos_01).name ~= "air"
and minetest.get_node(pos_01).name ~= "ferns:sapling_giant_tree_fern"
and minetest.get_node(pos_01).name ~= "default:junglegrass" then
return
end
local size = math.random(12,16) -- min of range must be >= 4
local leafchecks = {
{
direction = 3,
positions = {
{x = pos.x + 1, y = pos.y + size - 1, z = pos.z },
{x = pos.x + 2, y = pos.y + size , z = pos.z },
{x = pos.x + 3, y = pos.y + size - 1, z = pos.z },
{x = pos.x + 4, y = pos.y + size - 2, z = pos.z }
}
},
{
direction = 1,
positions = {
{x = pos.x - 1, y = pos.y + size - 1, z = pos.z },
{x = pos.x - 2, y = pos.y + size, z = pos.z },
{x = pos.x - 3, y = pos.y + size - 1, z = pos.z },
{x = pos.x - 4, y = pos.y + size - 2, z = pos.z }
}
},
{
direction = 2,
positions = {
{x = pos.x , y = pos.y + size - 1, z = pos.z + 1},
{x = pos.x , y = pos.y + size , z = pos.z + 2},
{x = pos.x , y = pos.y + size - 1, z = pos.z + 3},
{x = pos.x , y = pos.y + size - 2, z = pos.z + 4}
}
},
{
direction = 0,
positions = {
{x = pos.x , y = pos.y + size - 1, z = pos.z - 1},
{x = pos.x , y = pos.y + size , z = pos.z - 2},
{x = pos.x , y = pos.y + size - 1, z = pos.z - 3},
{x = pos.x , y = pos.y + size - 2, z = pos.z - 4}
}
}
}
for i = 1, size-3 do
minetest.set_node({x = pos.x, y = pos.y + i, z = pos.z}, {name="ferns:fern_trunk_big"})
end
minetest.set_node({x = pos.x, y = pos.y + size-2, z = pos.z}, {name="ferns:fern_trunk_big_top"})
minetest.set_node({x = pos.x, y = pos.y + size-1, z = pos.z}, {name="ferns:tree_fern_leaves_giant"})
-- all the checking for air below is to prevent some ugly bugs (incomplete trunks of neighbouring trees), it's a bit slower, but worth the result
-- assert(#leafchecks == 4)
for i = 1, 4 do
local positions = leafchecks[i].positions
local rot = leafchecks[i].direction
local endpos = 4 -- If the loop below adds all intermediate leaves then the "terminating" leaf will be at positions[4]
-- assert(#positions == 4)
-- add leaves so long as the destination nodes are air
for j = 1, 3 do
if minetest.get_node(positions[j]).name == "air" then
minetest.set_node(positions[j], {name="ferns:tree_fern_leave_big"})
else
endpos = j
break
end
end
-- add the terminating leaf if required and possible
if endpos == 4 and minetest.get_node(positions[endpos]).name == "air" then
minetest.set_node(positions[endpos], {name="ferns:tree_fern_leave_big_end", param2=rot})
end
end
end
-----------------------------------------------------------------------------------------------
-- GIANT TREE FERN LEAVES
-----------------------------------------------------------------------------------------------
minetest.register_node("ferns:tree_fern_leaves_giant", {
description = "Tree Fern Crown (Dicksonia)",
drawtype = "plantlike",
visual_scale = math.sqrt(8),
wield_scale = {x=0.175, y=0.175, z=0.175},
paramtype = "light",
tiles = {"ferns_fern_tree_giant.png"},
inventory_image = "ferns_fern_tree.png",
walkable = false,
groups = {
snappy=3,
flammable=2,
attached_node=1,
not_in_creative_inventory=1
},
drop = {
max_items = 2,
items = {
{
-- occasionally, drop a second sapling instead of leaves
-- (extra saplings can also be obtained by replanting and
-- reharvesting leaves)
items = {"ferns:sapling_giant_tree_fern"},
rarity = 10,
},
{
items = {"ferns:sapling_giant_tree_fern"},
},
{
items = {"ferns:tree_fern_leaves_giant"},
}
}
},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16},
},
})
-----------------------------------------------------------------------------------------------
-- GIANT TREE FERN LEAVE PART
-----------------------------------------------------------------------------------------------
minetest.register_node("ferns:tree_fern_leave_big", {
description = "Giant Tree Fern Leaves",
drawtype = "raillike",
paramtype = "light",
tiles = {
"ferns_tree_fern_leave_big.png",
},
walkable = false,
groups = {
snappy=3,
flammable=2,
attached_node=1,
not_in_creative_inventory=1
},
drop = "",
sounds = default.node_sound_leaves_defaults(),
})
-----------------------------------------------------------------------------------------------
-- GIANT TREE FERN LEAVE END
-----------------------------------------------------------------------------------------------
minetest.register_node("ferns:tree_fern_leave_big_end", {
description = "Giant Tree Fern Leave End",
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
tiles = { "ferns_tree_fern_leave_big_end.png" },
walkable = false,
node_box = {
type = "fixed",
-- {left, bottom, front, right, top, back }
fixed = {-1/2, -1/2, 1/2, 1/2, 33/64, 1/2},
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, 1/2, 1/2, 33/64, 1/2},
},
groups = {
snappy=3,
flammable=2,
attached_node=1,
not_in_creative_inventory=1
},
drop = "",
sounds = default.node_sound_leaves_defaults(),
})
-----------------------------------------------------------------------------------------------
-- GIANT TREE FERN TRUNK TOP
-----------------------------------------------------------------------------------------------
minetest.register_node("ferns:fern_trunk_big_top", {
description = "Giant Fern Trunk",
drawtype = "nodebox",
paramtype = "light",
tiles = {
"ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png",
"ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png",
"ferns_fern_trunk_big.png"
},
node_box = {
type = "fixed",
-- {left, bottom, front, right, top, back }
fixed = {
{-1/2, 33/64, -1/2, 1/2, 33/64, 1/2},
{-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
}
},
selection_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
},
groups = {
tree=1,
choppy=2,
oddly_breakable_by_hand=2,
flammable=3,
wood=1,
not_in_creative_inventory=1,
leafdecay=3 -- to support vines
},
drop = "ferns:fern_trunk_big",
sounds = default.node_sound_wood_defaults(),
})
-----------------------------------------------------------------------------------------------
-- GIANT TREE FERN TRUNK
-----------------------------------------------------------------------------------------------
minetest.register_node("ferns:fern_trunk_big", {
description = "Giant Fern Trunk",
drawtype = "nodebox",
paramtype = "light",
tiles = {
"ferns_fern_trunk_big_top.png",
"ferns_fern_trunk_big_top.png",
"ferns_fern_trunk_big.png"
},
node_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
},
selection_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
},
groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
sounds = default.node_sound_wood_defaults(),
after_destruct = function(pos,oldnode)
local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
if node.name == "ferns:fern_trunk_big" or node.name == "ferns:fern_trunk_big_top" then
minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z})
minetest.add_item(pos,"ferns:fern_trunk_big")
end
end,
})
-----------------------------------------------------------------------------------------------
-- GIANT TREE FERN SAPLING
-----------------------------------------------------------------------------------------------
minetest.register_node("ferns:sapling_giant_tree_fern", {
description = "Giant Tree Fern Sapling",
drawtype = "plantlike",
paramtype = "light",
tiles = {"ferns_sapling_tree_fern_giant.png"},
inventory_image = "ferns_sapling_tree_fern_giant.png",
walkable = false,
groups = {snappy=3,flammable=2,flora=1,attached_node=1},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16},
},
})
-- abm
minetest.register_abm({
nodenames = "ferns:sapling_giant_tree_fern",
interval = 1000,
chance = 4,
action = function(pos, node, _, _)
abstract_ferns.grow_giant_tree_fern({x = pos.x, y = pos.y-1, z = pos.z})
end
})
-----------------------------------------------------------------------------------------------
-- GENERATE GIANT TREE FERN
-----------------------------------------------------------------------------------------------
-- in jungles
if abstract_ferns.config.enable_giant_treeferns_in_jungle == true then
plantslib:register_generate_plant({
surface = {
"default:dirt_with_grass",
"default:sand",
"default:desert_sand"--,
--"dryplants:grass_short"
},
max_count = 12,--27,
avoid_nodes = {"group:tree"},
avoid_radius = 3,--4,
rarity = 85,
seed_diff = 329,
min_elevation = 1,
near_nodes = {"default:jungletree"},
near_nodes_size = 6,
near_nodes_vertical = 2,--4,
near_nodes_count = 1,
plantlife_limit = -0.9,
},
abstract_ferns.grow_giant_tree_fern
)
end
-- for oases & tropical beaches
if abstract_ferns.config.enable_giant_treeferns_in_oases == true then
plantslib:register_generate_plant({
surface = {
"default:sand"--,
--"default:desert_sand"
},
max_count = 10,--27,
rarity = 90,
seed_diff = 329,
neighbors = {"default:desert_sand"},
ncount = 1,
min_elevation = 1,
near_nodes = {"default:water_source"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
plantlife_limit = -0.9,
humidity_max = -1.0,
humidity_min = 1.0,
temp_max = -1.0,
temp_min = 1.0,
},
abstract_ferns.grow_giant_tree_fern
)
end