init.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. regrow = {
  2. -- get custom min and max growth intervals from settings
  3. min_interval = tonumber(minetest.settings:get("regrow_min_interval")) or 600,
  4. max_interval = tonumber(minetest.settings:get("regrow_max_interval")) or 1200
  5. }
  6. local is_51 = minetest.has_feature("formspec_version_element") or nil
  7. -- hidden node that runs timer and regrows fruit stored in meta
  8. minetest.register_node("regrow:hidden", {
  9. drawtype = "airlike",
  10. paramtype = "light",
  11. sunlight_propagates = true,
  12. walkable = false,
  13. pointable = false,
  14. diggable = false,
  15. buildable_to = true,
  16. drop = "",
  17. groups = {not_in_creative_inventory = 1},
  18. -- once placed start random timer between min and max interval setting
  19. on_construct = function(pos)
  20. local time = math.random(regrow.min_interval, regrow.max_interval)
  21. minetest.get_node_timer(pos):start(time)
  22. end,
  23. -- when timer reached check which fruit to place if tree still exists
  24. on_timer = function(pos, elapsed)
  25. local meta = minetest.get_meta(pos)
  26. if not meta then
  27. return
  28. end
  29. local fruit = meta:get_string("fruit") or ""
  30. local leaf = meta:get_string("leaf") or ""
  31. local p2 = meta:get_int("p2") or 0
  32. if fruit == "" or leaf == ""
  33. or not minetest.find_node_near(pos, 1, leaf) then
  34. fruit = "air"
  35. end
  36. minetest.set_node(pos, {name = fruit, param2 = p2})
  37. end
  38. })
  39. -- helper function to register fruit nodes
  40. regrow.add_fruit = function(nodename, leafname, ignore_param2)
  41. -- does node actually exist ?
  42. if not minetest.registered_nodes[nodename] then
  43. return
  44. end
  45. -- change attached_node values so fruits regrow instead of dropping
  46. local groups = minetest.registered_nodes[nodename].groups
  47. groups.attached_node = 0
  48. minetest.override_item(nodename, {
  49. -- override on_dig to remove any special functions
  50. on_dig = minetest.node_dig,
  51. -- override after_dig_node to start regrowth
  52. after_dig_node = function(pos, oldnode, oldmetadata, digger)
  53. -- if node has been placed by player then do not regrow
  54. if ignore_param2 ~= true and oldnode.param2 > 0 then
  55. return
  56. end
  57. -- replace fruit with regrowth node, set fruit & leaf name
  58. minetest.set_node(pos, {name = "regrow:hidden"})
  59. local meta = minetest.get_meta(pos)
  60. meta:set_string("fruit", nodename)
  61. meta:set_string("leaf", leafname)
  62. meta:set_int("p2", oldnode.param2 or 0)
  63. end,
  64. })
  65. end
  66. regrow.regrow = function()
  67. -- default
  68. regrow.add_fruit("default:apple", "default:leaves")
  69. -- ethereal
  70. regrow.add_fruit("ethereal:banana", "ethereal:bananaleaves")
  71. regrow.add_fruit("ethereal:banana_bunch", "ethereal:bananaleaves")
  72. regrow.add_fruit("ethereal:orange", "ethereal:orange_leaves")
  73. regrow.add_fruit("ethereal:coconut", "ethereal:palmleaves")
  74. regrow.add_fruit("ethereal:lemon", "ethereal:lemon_leaves")
  75. regrow.add_fruit("ethereal:olive", "ethereal:olive_leaves")
  76. -- regrow.add_fruit("ethereal:golden_apple", "ethereal:yellowleaves") -- too OP
  77. -- cool trees
  78. regrow.add_fruit("cacaotree:pod", "cacaotree:trunk", true)
  79. regrow.add_fruit("cherrytree:cherries", "cherrytree:blossom_leaves")
  80. regrow.add_fruit("clementinetree:clementine", "clementinetree:leaves")
  81. regrow.add_fruit("ebony:persimmon", "ebony:leaves")
  82. regrow.add_fruit("lemontree:lemon", "lemontree:leaves")
  83. regrow.add_fruit("oak:acorn", "oak:leaves")
  84. regrow.add_fruit("palm:coconut", "palm:leaves")
  85. -- regrow.add_fruit("plumtree:plum", "plumtree:leaves") -- regrows already
  86. regrow.add_fruit("pomegranate:pomegranate", "pomegranate:leaves")
  87. -- farming plus
  88. regrow.add_fruit("farming_plus:cocoa", "farming_plus:cocoa_leaves")
  89. regrow.add_fruit("farming_plus:banana", "farming_plus:banana_leaves")
  90. -- aotearoa
  91. regrow.add_fruit("aotearoa:karaka_fruit", "aotearoa:karaka_leaves")
  92. regrow.add_fruit("aotearoa:miro_fruit", "aotearoa:miro_leaves")
  93. regrow.add_fruit("aotearoa:tawa_fruit", "aotearoa:tawa_leaves")
  94. regrow.add_fruit("aotearoa:hinau_fruit", "aotearoa:hinau_leaves")
  95. regrow.add_fruit("aotearoa:kawakawa_fruit", "aotearoa:kawakawa_leaves")
  96. -- australia
  97. regrow.add_fruit("australia:cherry", "australia:cherry_leaves")
  98. regrow.add_fruit("australia:lilly_pilly_berries", "australia:lilly_pilly_leaves")
  99. regrow.add_fruit("australia:macadamia", "australia:macadamia_leaves")
  100. regrow.add_fruit("australia:mangrove_apple", "australia:mangrove_apple_leaves")
  101. regrow.add_fruit("australia:moreton_bay_fig", "australia:moreton_bay_fig_leaves")
  102. regrow.add_fruit("australia:quandong", "australia:quandong_leaves")
  103. -- more trees
  104. regrow.add_fruit("moretrees:acorn", "moretrees:oak_leaves")
  105. regrow.add_fruit("moretrees:cedar_cone", "moretrees:cedar_leaves")
  106. regrow.add_fruit("moretrees:fir_cone", "moretrees:fir_leaves")
  107. regrow.add_fruit("moretrees:spruce_cone", "moretrees:spruce_leaves")
  108. end
  109. if is_51 then
  110. -- wait until mods are loaded to save dependency mess
  111. minetest.register_on_mods_loaded(regrow.regrow)
  112. else
  113. minetest.after(0.1, regrow.regrow)
  114. end
  115. print("[MOD] Regrow loaded")