functions.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. if not minetest.global_exists("cavestuff") then cavestuff = {} end
  2. cavestuff.modpath = minetest.get_modpath("cavestuff")
  3. -- Localize for performance.
  4. local math_random = math.random
  5. -- Node functions.
  6. cavestuff.hotcobble = cavestuff.hotcobble or {}
  7. cavestuff.white_crystal = cavestuff.white_crystal or {}
  8. function cavestuff.hotcobble.after_place_node(pos, placer, itemstack, pointed_thing)
  9. if not placer or not placer:is_player() then
  10. return
  11. end
  12. -- Prevent players from placing hot cobble.
  13. if not heatdamage.is_immune(placer:get_player_name()) then
  14. utility.damage_player(placer, "heat", (2*500))
  15. end
  16. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  17. if rc.position_underground(pos) then
  18. -- Underground, placing hot cobble is the same as placing a lava source.
  19. -- The action of placing it destabilizes it enough to become fully melted.
  20. minetest.add_node(pos, {name="default:lava_flowing"})
  21. else
  22. -- Don't allow hot cobble to be placed above surface level.
  23. minetest.add_node(pos, {name="default:cobble"})
  24. end
  25. end
  26. function cavestuff.hotcobble.after_dig_node(pos, oldnode, oldmetadata, digger)
  27. if not digger or not digger:is_player() then
  28. return
  29. end
  30. -- Damage player when digging.
  31. if not heatdamage.is_immune(digger:get_player_name()) then
  32. utility.damage_player(digger, "heat", (2*500))
  33. end
  34. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  35. -- Rockmelt always turns back to lava when dug if there is lava beside it.
  36. -- This makes it possible to farm lava above -20.
  37. local positions = {
  38. {x=pos.x+1, y=pos.y, z=pos.z},
  39. {x=pos.x-1, y=pos.y, z=pos.z},
  40. {x=pos.x, y=pos.y, z=pos.z+1},
  41. {x=pos.x, y=pos.y, z=pos.z-1},
  42. }
  43. for k, v in ipairs(positions) do
  44. local node = minetest.get_node(v)
  45. if string.find(node.name, ":lava_") then
  46. minetest.add_node(pos, {name="default:lava_source"})
  47. return
  48. end
  49. end
  50. if rc.position_underground(pos) then
  51. -- Underground, digging hot cobble is enough to destabilize it and turn it into a lava source.
  52. minetest.add_node(pos, {name="default:lava_source"})
  53. else
  54. -- To prevent lava griefs of buildings on the surface, don't convert hot cobble to lava when dug.
  55. minetest.add_node(pos, {name="default:cobble"})
  56. end
  57. end
  58. function cavestuff.hotcobble.on_player_walk_over(pos, player)
  59. -- Damage players who walk on hot cobble.
  60. if not heatdamage.is_immune(player:get_player_name()) then
  61. utility.damage_player(player, "heat", (1*500))
  62. end
  63. end
  64. function cavestuff.hotcobble.on_finish_collapse(pos, node)
  65. if pos.y < -10 then
  66. if math_random(1, 10) > 8 then
  67. minetest.swap_node(pos, {name="default:lava_source"})
  68. elseif math_random(1, 75) == 1 then
  69. minetest.remove_node(pos)
  70. -- Detonate some TNT!
  71. -- Warning: this causes fatal lava tunneling which can ruin the map!
  72. -- (And player's fun.)
  73. -- Increased chance from 2 in 10 to 1 in 75. Let us see how it goes.
  74. --[[
  75. tnt.boom(pos, {
  76. radius = 5,
  77. ignore_protection = false,
  78. ignore_on_blast = false,
  79. damage_radius = 10,
  80. disable_drops = true,
  81. make_sound = false, -- The TNT boom sound wrecks the ambiance.
  82. })
  83. --]]
  84. else
  85. -- Do nothing.
  86. end
  87. else
  88. minetest.swap_node(pos, {name="default:cobble"})
  89. end
  90. end
  91. function cavestuff.white_crystal.after_dig_node(pos, oldnode, metadata, digger)
  92. if not digger or not digger:is_player() then
  93. return
  94. end
  95. local pname = digger:get_player_name()
  96. --minetest.chat_send_all('oldnode: ' .. dump(oldnode))
  97. -- Drop nodes hanging.
  98. for k = 1, 16 do
  99. local p = vector.add(pos, {x=0, y=-k, z=0})
  100. local n = minetest.get_node(p)
  101. --minetest.chat_send_all(dump(n))
  102. if n.name == oldnode.name and not minetest.test_protection(p, pname) then
  103. --minetest.chat_send_all('drop node')
  104. --local time = 1/k
  105. minetest.after(0, sfn.drop_node, p)
  106. --minetest.set_node(p, {name="default:stone"})
  107. else
  108. break
  109. end
  110. end
  111. -- Drop nodes standing.
  112. for k = 1, 16 do
  113. local p = vector.add(pos, {x=0, y=k, z=0})
  114. local n = minetest.get_node(p)
  115. --minetest.chat_send_all(dump(n))
  116. if n.name == oldnode.name and not minetest.test_protection(p, pname) then
  117. --minetest.chat_send_all('drop node')
  118. --local time = 1/k
  119. minetest.after(0, sfn.drop_node, p)
  120. --minetest.set_node(p, {name="default:stone"})
  121. else
  122. break
  123. end
  124. end
  125. end
  126. -- For testing.
  127. local FAST_CRYSTAL_GROWTH = false
  128. function cavestuff.white_crystal.on_construct(pos)
  129. local timer = minetest.get_node_timer(pos)
  130. if not FAST_CRYSTAL_GROWTH then
  131. timer:start(60*math.random(15, 60))
  132. else
  133. timer:start(5)
  134. end
  135. end
  136. function cavestuff.white_crystal.on_timer(pos, elapsed)
  137. local sides = {
  138. {x=pos.x+1, y=pos.y, z=pos.z},
  139. {x=pos.x-1, y=pos.y, z=pos.z},
  140. {x=pos.x, y=pos.y, z=pos.z+1},
  141. {x=pos.x, y=pos.y, z=pos.z-1},
  142. }
  143. local lava = 0
  144. local water = 0
  145. for k = 1, #sides do
  146. local n = minetest.get_node(sides[k])
  147. if minetest.get_item_group(n.name, "lava") ~= 0 then
  148. lava = lava + 1
  149. end
  150. if minetest.get_item_group(n.name, "water") ~= 0 then
  151. water = water + 1
  152. end
  153. end
  154. if water > 0 and lava > 0 then
  155. local above = {x=pos.x, y=pos.y+1, z=pos.z}
  156. local c = minetest.get_node(above)
  157. if c.name == "cavestuff:whitespike4" then
  158. local under = {x=pos.x, y=pos.y-1, z=pos.z}
  159. local n = minetest.get_node(under)
  160. local ndef = minetest.registered_nodes[n.name]
  161. -- Only ground content in group "ore" is eligible to be a transmutation source.
  162. if ndef.is_ground_content and minetest.get_item_group(n.name, "ore") ~= 0 then
  163. minetest.set_node(pos, {name="glowstone:minerals"})
  164. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  165. return
  166. end
  167. elseif c.name == "cavestuff:whitespike3" then
  168. minetest.swap_node(above, {name="cavestuff:whitespike4", param2=math.random(0, 3)})
  169. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  170. elseif c.name == "cavestuff:whitespike2" then
  171. minetest.swap_node(above, {name="cavestuff:whitespike3", param2=math.random(0, 3)})
  172. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  173. elseif c.name == "cavestuff:whitespike1" then
  174. minetest.swap_node(above, {name="cavestuff:whitespike2", param2=math.random(0, 3)})
  175. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  176. elseif c.name == "air" then
  177. minetest.swap_node(above, {name="cavestuff:whitespike1", param2=math.random(0, 3)})
  178. minetest.sound_play("default_cool_lava", {pos=pos, max_hear_distance=16, gain=0.25}, true)
  179. end
  180. end
  181. -- If transmutation not finished, restart timer.
  182. local timer = minetest.get_node_timer(pos)
  183. if not FAST_CRYSTAL_GROWTH then
  184. timer:start(60*math.random(15, 60))
  185. else
  186. timer:start(5)
  187. end
  188. end
  189. if not cavestuff.run_once then
  190. local c = "cavestuff:core"
  191. local f = cavestuff.modpath .. "/functions.lua"
  192. reload.register_file(c, f, false)
  193. cavestuff.run_once = true
  194. end