113 lines
3.3 KiB
Lua
113 lines
3.3 KiB
Lua
minetest.register_on_mods_loaded(function()
|
|
for node_name, def in pairs(minetest.registered_nodes) do
|
|
-- if minetest.get_item_group(node_name, 'group:leaves') then
|
|
if def.groups and def.groups.leaves then
|
|
-- local groups = table.copy(def.groups)
|
|
-- groups.bouncy = 1
|
|
-- groups.fall_damage_add_percent = -20
|
|
minetest.override_item(node_name, {
|
|
-- groups = groups,
|
|
walkable = false,
|
|
climbable = true,
|
|
-- Climbing through leaves should slow players down
|
|
move_resistance = 3,
|
|
waving = 2,
|
|
-- Make leaves fall when placed
|
|
after_place_node = function(pos, oldnode, oldmeta, drops)
|
|
minetest.spawn_falling_node(pos)
|
|
end,
|
|
-- Adapted from Tenplus1's regrow mod, licensed under MIT
|
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
-- if node has been placed by player then do not regrow
|
|
if oldnode.param2 > 0 then
|
|
return
|
|
end
|
|
-- replace leaf with regrowth node, set leaf name
|
|
minetest.set_node(pos, {name = "regrow:hidden"})
|
|
local meta = minetest.get_meta(pos)
|
|
-- meta:set_string("fruit", nodename)
|
|
meta:set_string("leaf", node_name)
|
|
end,
|
|
on_construct = function(pos)
|
|
local time = math.random(60 * 20, 60 * 30)
|
|
minetest.get_node_timer(pos):start(time)
|
|
end,
|
|
-- when timer reached check which leaf to remove
|
|
on_timer = function(pos, elapsed)
|
|
if math.random(100) == 1 then
|
|
local pos2 = table.copy(pos)
|
|
pos2.y = pos2.y - 1
|
|
local check_node = minetest.get_node(pos2)
|
|
if check_node.name == 'air' then
|
|
minetest.dig_node(pos)
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
})
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Regrow leaves, adapted from Tenplus1's regrow mod, licensed under MIT
|
|
minetest.register_node('real_leaves:hidden', {
|
|
drawtype = "airlike",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
pointable = false,
|
|
diggable = false,
|
|
buildable_to = true,
|
|
drop = "",
|
|
groups = {not_in_creative_inventory = 1},
|
|
-- once placed start random timer between 20 and 30 minutes
|
|
on_construct = function(pos)
|
|
local time = math.random(60 * 20, 60 * 30)
|
|
minetest.get_node_timer(pos):start(time)
|
|
end,
|
|
-- when timer reached check which leaf to place if tree still exists
|
|
on_timer = function(pos, elapsed)
|
|
local meta = minetest.get_meta(pos)
|
|
if not meta then
|
|
return
|
|
end
|
|
-- local fruit = meta:get_string("fruit") or ""
|
|
local leaf = meta:get_string("leaf") or ""
|
|
if leaf == "" or not minetest.find_node_near(pos, 1, leaf) then
|
|
leaf = "air"
|
|
end
|
|
minetest.set_node(pos, {name = leaf})
|
|
end
|
|
})
|
|
|
|
-- chance of limbs breaking while player is in leaves
|
|
minetest.register_globalstep(function(dtime)
|
|
-- minetest.spawn_falling_node(pos)
|
|
-- minetest.dig_node(pos)
|
|
local players = minetest.get_connected_players()
|
|
for player in players do
|
|
if minetest.is_player(player) then
|
|
local pos = player:get_pos()
|
|
local pos2 = table.copy(pos)
|
|
pos2.y = pos2.y + 1
|
|
local nodes = minetest.find_nodes_in_area(pos, pos2, 'group:leaves', true)
|
|
for node_name, node_poss in pairs(nodes) do
|
|
for node_pos in node_poss do
|
|
if math.random(20) == 1 then
|
|
minetest.dig_node(node_pos)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Basically strip leaves off branches
|
|
minetest.register_craft({
|
|
type = 'shapeless',
|
|
output = 'default:stick',
|
|
recipe = 'group:leaves',
|
|
-- replacements = 'leaves without stick?'
|
|
})
|