abm.lua 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. -- LUALOCALS < ---------------------------------------------------------
  2. local minetest, nodecore
  3. = minetest, nodecore
  4. -- LUALOCALS > ---------------------------------------------------------
  5. local modname = minetest.get_current_modname()
  6. local dirt = modname .. ":dirt"
  7. local grass = modname .. ":dirt_with_grass"
  8. local breathable = {
  9. airlike = true,
  10. allfaces = true,
  11. allfaces_optional = true,
  12. torchlike = true,
  13. signlike = true,
  14. plantlike = true,
  15. firelike = true,
  16. raillike = true,
  17. nodebox = true,
  18. mesh = true,
  19. plantlike_rooted = true
  20. }
  21. -- nil = stay, false = die, true = grow
  22. local function grassable(above)
  23. local node = minetest.get_node(above)
  24. if node.name == "ignore" then return end
  25. local def = minetest.registered_items[node.name] or {}
  26. if (not def.drawtype) or (not breathable[def.drawtype])
  27. or (def.damage_per_second and def.damage_per_second > 0)
  28. then return false end
  29. local ln = nodecore.get_node_light(above)
  30. if not ln then return end
  31. return ln >= 10
  32. end
  33. nodecore.register_limited_abm({
  34. label = "grass spread",
  35. nodenames = {"group:soil"},
  36. neighbors = {grass},
  37. interval = 6,
  38. chance = 50,
  39. action = function(pos, node)
  40. if node.name == grass then return end
  41. local above = {x = pos.x, y = pos.y + 1, z = pos.z}
  42. if not grassable(above) then return end
  43. return minetest.set_node(pos, {name = grass})
  44. end
  45. })
  46. nodecore.register_limited_abm({
  47. label = "grass decay",
  48. nodenames = {grass},
  49. interval = 8,
  50. chance = 50,
  51. action = function(pos)
  52. local above = {x = pos.x, y = pos.y + 1, z = pos.z}
  53. if grassable(above) ~= false then return end
  54. return minetest.set_node(pos, {name = dirt})
  55. end
  56. })
  57. nodecore.register_dirt_leaching(dirt, modname .. ":sand_loose")