Advertisement
Guest User

Untitled

a guest
Oct 7th, 2012
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.65 KB | None | 0 0
  1. local destroy = function(pos)
  2. if math.random(1,5) <= 4 then
  3. minetest.env:add_entity({x=pos.x+math.random(0,10)/10-0.5, y=pos.y, z=pos.z+math.random(0,10)/10-0.5}, "tnt:smoke")
  4. end
  5. local nodename = minetest.env:get_node(pos).name
  6. if nodename ~= "air" then
  7. minetest.env:remove_node(pos)
  8. nodeupdate(pos)
  9. local drop = minetest.get_node_drops(nodename, "")
  10. for _,item in ipairs(drop) do
  11. if type(item) == "string" then
  12. local obj = minetest.env:add_item(pos, item)
  13. if obj == nil then
  14. return
  15. end
  16. obj:get_luaentity().collect = true
  17. obj:setacceleration({x=0, y=-10, z=0})
  18. obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
  19. else
  20. for i=1,item:get_count() do
  21. local obj = minetest.env:add_item(pos, item:get_name())
  22. if obj == nil then
  23. return
  24. end
  25. obj:get_luaentity().collect = true
  26. obj:setacceleration({x=0, y=-10, z=0})
  27. obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
  28. end
  29. end
  30. end
  31. end
  32. end
  33.  
  34. boom = function(pos, time)
  35. minetest.after(time, function(pos)
  36. if minetest.env:get_node(pos).name ~= "tnt:tnt_burning" then
  37. return
  38. end
  39. minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
  40. minetest.env:set_node(pos, {name="tnt:boom"})
  41. minetest.after(0.5, function(pos)
  42. minetest.env:remove_node(pos)
  43. end, {x=pos.x, y=pos.y, z=pos.z})
  44.  
  45. local objects = minetest.env:get_objects_inside_radius(pos, 7)
  46. for _,obj in ipairs(objects) do
  47. if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
  48. local obj_p = obj:getpos()
  49. local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z}
  50. local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5
  51. local damage = (80*0.5^dist)*2
  52. obj:punch(obj, 1.0, {
  53. full_punch_interval=1.0,
  54. groupcaps={
  55. fleshy={times={[1]=1/damage, [2]=1/damage, [3]=1/damage}},
  56. snappy={times={[1]=1/damage, [2]=1/damage, [3]=1/damage}},
  57. }
  58. }, nil)
  59. end
  60. end
  61.  
  62. for dx=-2,2 do
  63. for dz=-2,2 do
  64. for dy=2,-2,-1 do
  65. pos.x = pos.x+dx
  66. pos.y = pos.y+dy
  67. pos.z = pos.z+dz
  68.  
  69. local node = minetest.env:get_node(pos)
  70. if node.name == "tnt:tnt" or node.name == "tnt:tnt_burning" then
  71. minetest.env:set_node(pos, {name="tnt:tnt_burning"})
  72. boom({x=pos.x, y=pos.y, z=pos.z}, 0)
  73. elseif node.name == "fire:basic_flame" or string.find(node.name, "default:water_") or string.find(node.name, "default:lava_") or node.name == "tnt:boom" then
  74.  
  75. else
  76. if math.abs(dx)<2 and math.abs(dy)<2 and math.abs(dz)<2 then
  77. destroy(pos)
  78. else
  79. if math.random(1,5) <= 4 then
  80. destroy(pos)
  81. end
  82. end
  83. end
  84.  
  85. pos.x = pos.x-dx
  86. pos.y = pos.y-dy
  87. pos.z = pos.z-dz
  88. end
  89. end
  90. end
  91. end, pos)
  92. end
  93.  
  94. minetest.register_node("tnt:tnt", {
  95. description = "TNT",
  96. tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"},
  97. groups = {dig_immediate=2, mesecon=2},
  98. sounds = default.node_sound_wood_defaults(),
  99.  
  100. on_punch = function(pos, node, puncher)
  101. if puncher:get_wielded_item():get_name() == "default:torch" then
  102. minetest.sound_play("tnt_ignite", {pos=pos})
  103. minetest.env:set_node(pos, {name="tnt:tnt_burning"})
  104. boom(pos, 4)
  105. end
  106. end,
  107. })
  108.  
  109. minetest.register_node("tnt:tnt_burning", {
  110. tiles = {{name="tnt_top_burning_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}}, "tnt_bottom.png", "tnt_side.png"},
  111. light_source = 5,
  112. drop = "",
  113. sounds = default.node_sound_wood_defaults(),
  114. })
  115.  
  116. minetest.register_node("tnt:boom", {
  117. drawtype = "plantlike",
  118. tiles = {"tnt_boom.png"},
  119. light_source = LIGHT_MAX,
  120. walkable = false,
  121. drop = "",
  122. groups = {dig_immediate=3},
  123. })
  124.  
  125. burn = function(pos)
  126. if minetest.env:get_node(pos).name == "tnt:tnt" then
  127. minetest.sound_play("tnt_ignite", {pos=pos})
  128. minetest.env:set_node(pos, {name="tnt:tnt_burning"})
  129. boom(pos, 1)
  130. return
  131. end
  132. if minetest.env:get_node(pos).name ~= "tnt:gunpowder" then
  133. return
  134. end
  135. minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2})
  136. minetest.env:set_node(pos, {name="tnt:gunpowder_burning"})
  137.  
  138. minetest.after(1, function(pos)
  139. if minetest.env:get_node(pos).name ~= "tnt:gunpowder_burning" then
  140. return
  141. end
  142. minetest.after(0.5, function(pos)
  143. minetest.env:remove_node(pos)
  144. end, {x=pos.x, y=pos.y, z=pos.z})
  145. for dx=-1,1 do
  146. for dz=-1,1 do
  147. for dy=-1,1 do
  148. pos.x = pos.x+dx
  149. pos.y = pos.y+dy
  150. pos.z = pos.z+dz
  151.  
  152. if not (math.abs(dx) == 1 and math.abs(dz) == 1) then
  153. if dy == 0 then
  154. burn({x=pos.x, y=pos.y, z=pos.z})
  155. else
  156. if math.abs(dx) == 1 or math.abs(dz) == 1 then
  157. burn({x=pos.x, y=pos.y, z=pos.z})
  158. end
  159. end
  160. end
  161.  
  162. pos.x = pos.x-dx
  163. pos.y = pos.y-dy
  164. pos.z = pos.z-dz
  165. end
  166. end
  167. end
  168. end, pos)
  169. end
  170.  
  171. minetest.register_node("tnt:gunpowder", {
  172. description = "Gun Powder",
  173. drawtype = "raillike",
  174. paramtype = "light",
  175. sunlight_propagates = true,
  176. walkable = false,
  177. tiles = {"tnt_gunpowder.png",},
  178. inventory_image = "tnt_gunpowder_inventory.png",
  179. wield_image = "tnt_gunpowder_inventory.png",
  180. selection_box = {
  181. type = "fixed",
  182. fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
  183. },
  184. groups = {dig_immediate=2},
  185. sounds = default.node_sound_leaves_defaults(),
  186.  
  187. on_punch = function(pos, node, puncher)
  188. if puncher:get_wielded_item():get_name() == "default:torch" then
  189. burn(pos)
  190. end
  191. end,
  192. })
  193.  
  194. minetest.register_node("tnt:gunpowder_burning", {
  195. drawtype = "raillike",
  196. paramtype = "light",
  197. sunlight_propagates = true,
  198. walkable = false,
  199. light_source = 5,
  200. tiles = {{name="tnt_gunpowder_burning_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}}},
  201. selection_box = {
  202. type = "fixed",
  203. fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
  204. },
  205. drop = "",
  206. groups = {dig_immediate=2},
  207. sounds = default.node_sound_leaves_defaults(),
  208. })
  209.  
  210. minetest.register_abm({
  211. nodenames = {"tnt:tnt", "tnt:gunpowder"},
  212. neighbors = {"fire:basic_flame"},
  213. interval = 2,
  214. chance = 10,
  215. action = function(pos, node)
  216. if node.name == "tnt:tnt" then
  217. minetest.env:set_node(pos, {name="tnt:tnt_burning"})
  218. boom({x=pos.x, y=pos.y, z=pos.z}, 0)
  219. else
  220. burn(pos)
  221. end
  222. end
  223. })
  224.  
  225. minetest.register_craft({
  226. output = "tnt:gunpowder",
  227. type = "shapeless",
  228. recipe = {"default:coal_lump", "default:gravel"}
  229. })
  230.  
  231. minetest.register_craft({
  232. output = "tnt:tnt",
  233. recipe = {
  234. {"", "default:wood", ""},
  235. {"default:wood", "tnt:gunpowder", "default:wood"},
  236. {"", "default:wood", ""}
  237. }
  238. })
  239.  
  240. minetest.register_entity("tnt:smoke", {
  241. physical = true,
  242. visual = "sprite",
  243. textures = {"tnt_smoke.png"},
  244. collisionbox = {0,0,0,0,0,0},
  245.  
  246. timer = 0,
  247. time = 5,
  248.  
  249. on_activate = function(self, staticdata)
  250. self.object:setacceleration({x=math.random(0,10)/10-0.5, y=5, z=math.random(0,10)/10-0.5})
  251. self.time = math.random(1, 10)/10
  252. end,
  253.  
  254. on_step = function(self, dtime)
  255. self.timer = self.timer+dtime
  256. if self.timer > self.time then
  257. self.object:remove()
  258. end
  259. end,
  260. })
  261.  
  262. if minetest.get_modpath("mesecons") ~= nil then
  263. minetest.after(0, function()
  264.  
  265. --mesecon:add_rules("tnt_above", {{x=0,y=1,z=0}}) FIXME
  266. mesecon:register_effector("tnt:tnt", "tnt:tnt") --, mesecon:get_rules("tnt_above"))
  267.  
  268. mesecon:register_on_signal_on(function(pos, node)
  269. if node.name == "tnt:tnt" then
  270. minetest.env:set_node(pos, {name="tnt:tnt_burning"})
  271. boom(pos, 0)
  272. end
  273. end)
  274.  
  275. end)
  276. end
  277.  
  278. if minetest.setting_get("log_mods") then
  279. minetest.log("action", "tnt loaded")
  280. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement