functions.lua 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. --nodename is the name of the node being placed.
  2. --pos is pos, no surprises there.
  3. --undernode is the node that needs to be below for the node to be placed.
  4. --replacing is what nodes are allowed to be replaced, usualy probably just air.
  5. function desert_life.spread(nodename, pos, spread, undernode, replacing, needed_air)
  6. local ran_num = math.random(1,8)
  7. local location = {}
  8. if ran_num == 1 then
  9. location = {x=pos.x+spread, y=pos.y, z=pos.z}
  10. elseif ran_num == 2 then
  11. location = {x=pos.x+spread, y=pos.y, z=pos.z+spread}
  12. elseif ran_num == 3 then
  13. location = {x=pos.x, y=pos.y, z=pos.z+spread}
  14. elseif ran_num == 4 then
  15. location = {x=pos.x-spread, y=pos.y, z=pos.z+spread}
  16. elseif ran_num == 5 then
  17. location = {x=pos.x-spread, y=pos.y, z=pos.z}
  18. elseif ran_num == 6 then
  19. location = {x=pos.x-spread, y=pos.y, z=pos.z-spread}
  20. elseif ran_num == 7 then
  21. location = {x=pos.x, y=pos.y, z=pos.z-spread}
  22. elseif ran_num == 8 then
  23. location = {x=pos.x+spread, y=pos.y, z=pos.z-spread}
  24. end
  25. local under_location = ({x=location.x, y=location.y-1, z=location.z})
  26. local under_name = minetest.get_node_or_nil(under_location)
  27. local location_name = minetest.get_node_or_nil(location)
  28. if under_name == nil then
  29. return -- Should under_name somehow not be a node this will keep the script from crashing.
  30. end
  31. if under_name.name == undernode then
  32. if location_name.name == replacing then
  33. local diff = spread + 1
  34. local pos1 = {x=location.x+diff, y=location.y, z=location.z+diff}
  35. local pos0 = {x=location.x-diff, y=location.y, z=location.z-diff}
  36. local can_replace = minetest.find_nodes_in_area(pos0, pos1, replacing)
  37. local replace_num = #can_replace
  38. if replace_num >= needed_air then --increase to decrease number of plants.
  39. local face_ran = math.random(0,3)
  40. minetest.set_node(location, {name = nodename, param2 = face_ran})
  41. end
  42. end
  43. end
  44. end