Default: Convert saplings to use node timers
authorAuke Kok <sofar@foo-projects.org>
Mon, 7 Mar 2016 05:39:07 +0000 (21:39 -0800)
committerparamat <mat.gregory@virginmedia.com>
Wed, 25 May 2016 02:27:08 +0000 (03:27 +0100)
Each sapling is given a single node timer that is between
2 and 4 days of game play time (40-80 minutes). If you walk out
of the zone, and come back later, the tree will always grow
to full if the timer has elapsed.

Because trees.lua is all functions, it needs to be parsed before
nodes.lua, since that references some of its functions. Hence,
change the order of parsing here. Otherwise saplings would not
grow to full.

mods/default/init.lua
mods/default/nodes.lua
mods/default/trees.lua

index 6f1b148b4874243444654b77d6f39803cd9385bb..b362fc752bf29ca19830f3aed511c02804a78f46 100644 (file)
@@ -36,6 +36,7 @@ default.gui_survival_form = "size[8,8.5]"..
 
 -- Load files
 dofile(minetest.get_modpath("default").."/functions.lua")
+dofile(minetest.get_modpath("default").."/trees.lua")
 dofile(minetest.get_modpath("default").."/nodes.lua")
 dofile(minetest.get_modpath("default").."/furnace.lua")
 dofile(minetest.get_modpath("default").."/tools.lua")
@@ -43,6 +44,5 @@ dofile(minetest.get_modpath("default").."/craftitems.lua")
 dofile(minetest.get_modpath("default").."/crafting.lua")
 dofile(minetest.get_modpath("default").."/mapgen.lua")
 dofile(minetest.get_modpath("default").."/player.lua")
-dofile(minetest.get_modpath("default").."/trees.lua")
 dofile(minetest.get_modpath("default").."/aliases.lua")
 dofile(minetest.get_modpath("default").."/legacy.lua")
index a97a30fa72f54363dc0871cfc243f62e7c1f696a..9c1dc44703d342cd1433245de7e460c318fb60a1 100644 (file)
@@ -455,6 +455,10 @@ minetest.register_node("default:sapling", {
        paramtype = "light",
        sunlight_propagates = true,
        walkable = false,
+       on_timer = default.grow_sapling,
+       on_construct = function(pos)
+               minetest.get_node_timer(pos):start(math.random(2400,4800))
+       end,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
@@ -573,6 +577,10 @@ minetest.register_node("default:junglesapling", {
        paramtype = "light",
        sunlight_propagates = true,
        walkable = false,
+       on_timer = default.grow_sapling,
+       on_construct = function(pos)
+               minetest.get_node_timer(pos):start(math.random(2400,4800))
+       end,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
@@ -634,6 +642,10 @@ minetest.register_node("default:pine_sapling", {
        paramtype = "light",
        sunlight_propagates = true,
        walkable = false,
+       on_timer = default.grow_sapling,
+       on_construct = function(pos)
+               minetest.get_node_timer(pos):start(math.random(2400,4800))
+       end,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
@@ -695,6 +707,10 @@ minetest.register_node("default:acacia_sapling", {
        paramtype = "light",
        sunlight_propagates = true,
        walkable = false,
+       on_timer = default.grow_sapling,
+       on_construct = function(pos)
+               minetest.get_node_timer(pos):start(math.random(2400,4800))
+       end,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
@@ -755,6 +771,10 @@ minetest.register_node("default:aspen_sapling", {
        paramtype = "light",
        sunlight_propagates = true,
        walkable = false,
+       on_timer = default.grow_sapling,
+       on_construct = function(pos)
+               minetest.get_node_timer(pos):start(math.random(2400,4800))
+       end,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
index de2452e4190a61408fc2805337b884e415c4f59d..1b0626601d54eee1a2d81a6108c3b15282afed14 100644 (file)
@@ -59,57 +59,62 @@ end
 
 -- Sapling ABM
 
-minetest.register_abm({
-       nodenames = {"default:sapling", "default:junglesapling",
-               "default:pine_sapling", "default:acacia_sapling",
-               "default:aspen_sapling"},
-       interval = 10,
-       chance = 50,
-       action = function(pos, node)
-               if not default.can_grow(pos) then
-                       return
-               end
+function default.grow_sapling(pos)
+       if not default.can_grow(pos) then
+               -- try a bit later again
+               minetest.get_node_timer(pos):start(math.random(240, 600))
+               return
+       end
 
-               local mapgen = minetest.get_mapgen_params().mgname
-               if node.name == "default:sapling" then
-                       minetest.log("action", "A sapling grows into a tree at "..
-                               minetest.pos_to_string(pos))
-                       if mapgen == "v6" then
-                               default.grow_tree(pos, random(1, 4) == 1)
-                       else
-                               default.grow_new_apple_tree(pos)
-                       end
-               elseif node.name == "default:junglesapling" then
-                       minetest.log("action", "A jungle sapling grows into a tree at "..
-                               minetest.pos_to_string(pos))
-                       if mapgen == "v6" then
-                               default.grow_jungle_tree(pos)
-                       else
-                               default.grow_new_jungle_tree(pos)
-                       end
-               elseif node.name == "default:pine_sapling" then
-                       minetest.log("action", "A pine sapling grows into a tree at "..
-                               minetest.pos_to_string(pos))
-                       local snow = is_snow_nearby(pos)
-                       if mapgen == "v6" then
-                               default.grow_pine_tree(pos, snow)
-                       elseif snow then
-                               default.grow_new_snowy_pine_tree(pos)
-                       else
-                               default.grow_new_pine_tree(pos)
-                       end
-               elseif node.name == "default:acacia_sapling" then
-                       minetest.log("action", "An acacia sapling grows into a tree at "..
-                               minetest.pos_to_string(pos))
-                       default.grow_new_acacia_tree(pos)
-               elseif node.name == "default:aspen_sapling" then
-                       minetest.log("action", "An aspen sapling grows into a tree at "..
-                               minetest.pos_to_string(pos))
-                       default.grow_new_aspen_tree(pos)
+       local mapgen = minetest.get_mapgen_params().mgname
+       local node = minetest.get_node(pos)
+       if node.name == "default:sapling" then
+               minetest.log("action", "A sapling grows into a tree at "..
+                       minetest.pos_to_string(pos))
+               if mapgen == "v6" then
+                       default.grow_tree(pos, random(1, 4) == 1)
+               else
+                       default.grow_new_apple_tree(pos)
+               end
+       elseif node.name == "default:junglesapling" then
+               minetest.log("action", "A jungle sapling grows into a tree at "..
+                       minetest.pos_to_string(pos))
+               if mapgen == "v6" then
+                       default.grow_jungle_tree(pos)
+               else
+                       default.grow_new_jungle_tree(pos)
                end
+       elseif node.name == "default:pine_sapling" then
+               minetest.log("action", "A pine sapling grows into a tree at "..
+                       minetest.pos_to_string(pos))
+               local snow = is_snow_nearby(pos)
+               if mapgen == "v6" then
+                       default.grow_pine_tree(pos, snow)
+               elseif snow then
+                       default.grow_new_snowy_pine_tree(pos)
+               else
+                       default.grow_new_pine_tree(pos)
+               end
+       elseif node.name == "default:acacia_sapling" then
+               minetest.log("action", "An acacia sapling grows into a tree at "..
+                       minetest.pos_to_string(pos))
+               default.grow_new_acacia_tree(pos)
+       elseif node.name == "default:aspen_sapling" then
+               minetest.log("action", "An aspen sapling grows into a tree at "..
+                       minetest.pos_to_string(pos))
+               default.grow_new_aspen_tree(pos)
        end
-})
+end
 
+minetest.register_lbm({
+       name = "default:convert_saplings_to_node_timer",
+       nodenames = {"default:sapling", "default:junglesapling",
+                       "default:pine_sapling", "default:acacia_sapling",
+                       "default:aspen_sapling"},
+       action = function(pos)
+               minetest.get_node_timer(pos):start(math.random(1200, 2400))
+       end
+})
 
 --
 -- Tree generation