darts.lua 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. local function duck_explosion(pos)
  2. if minetest.is_protected(pos, "") then
  3. return
  4. end
  5. pos.y = pos.y+1;
  6. minetest.add_particlespawner({
  7. amount = 10,
  8. time = 0.2,
  9. minpos = {x=pos.x-1, y=pos.y-1, z=pos.z-1},
  10. maxpos = {x=pos.x+1, y=pos.y+4, z=pos.z+1},
  11. minvel = {x=0, y=0, z=0},
  12. maxvel = {x=1, y=1, z=1},
  13. minacc = {x=-0.5,y=5,z=-0.5},
  14. maxacc = {x=0.5,y=5,z=0.5},
  15. minexptime = 1,
  16. maxexptime = 3,
  17. minsize = 4,
  18. maxsize = 6,
  19. collisiondetection = false,
  20. vertical = false,
  21. texture = "duck_egg_fragments.png",
  22. })
  23. core.after(0.4, function()
  24. for dx = -1,1 do
  25. pos = {x = pos.x+dx, y=pos.y; z=pos.z+dx}
  26. minetest.add_particlespawner({
  27. amount = 100,
  28. time = 0.2,
  29. minpos = {x=pos.x-1, y=pos.y-1, z=pos.z-1},
  30. maxpos = {x=pos.x+1, y=pos.y+4, z=pos.z+1},
  31. minvel = {x=0, y=0, z=0},
  32. maxvel = {x=1, y=5, z=1},
  33. minacc = {x=-0.5,y=5,z=-0.5},
  34. maxacc = {x=0.5,y=5,z=0.5},
  35. minexptime = 1,
  36. maxexptime = 3,
  37. minsize = 2,
  38. maxsize = 4,
  39. collisiondetection = false,
  40. vertical = false,
  41. texture = "tnt_smoke.png",
  42. })
  43. minetest.add_entity(pos, "nssm:duck")
  44. end
  45. end)
  46. end
  47. -- arrow (duck_arrow)
  48. mobs:register_arrow("nssm:duck_father", {
  49. visual = "sprite",
  50. visual_size = {x = 1, y = 1},
  51. textures = {"duck_egg.png"},
  52. velocity = 8,
  53. -- direct hit
  54. hit_player = function(self, player)
  55. local pos = self.object:get_pos()
  56. duck_explosion(pos)
  57. end,
  58. hit_mob = function(self, player)
  59. local pos = self.object:get_pos()
  60. duck_explosion(pos)
  61. end,
  62. hit_node = function(self, pos, node)
  63. duck_explosion(pos)
  64. end,
  65. })
  66. local function ice_explosion(pos)
  67. for i=pos.x-math.random(0, 1), pos.x+math.random(0, 1), 1 do
  68. for j=pos.y-1, pos.y+4, 1 do
  69. for k=pos.z-math.random(0, 1), pos.z+math.random(0, 1), 1 do
  70. local p = {x=i, y=j, z=k}
  71. local n = minetest.get_node(p).name
  72. if minetest.get_item_group(n, "unbreakable") == 1
  73. or minetest.is_protected(p, "")
  74. or (n == "bones:bones" and not nssm:affectbones(self)) then
  75. else
  76. minetest.set_node({x=i, y=j, z=k}, {name="default:ice"})
  77. end
  78. end
  79. end
  80. end
  81. end
  82. -- snow_arrow
  83. mobs:register_arrow("nssm:snow_arrow", {
  84. visual = "sprite",
  85. visual_size = {x = 1, y = 1},
  86. textures = {"transparent.png"},
  87. velocity =20,
  88. -- direct hit
  89. hit_player = function(self, player)
  90. local pos = self.object:get_pos()
  91. ice_explosion(pos)
  92. end,
  93. hit_mob = function(self, player)
  94. local pos = self.object:get_pos()
  95. ice_explosion(pos)
  96. end,
  97. hit_node = function(self, pos, node)
  98. ice_explosion(pos)
  99. end,
  100. })
  101. -- arrow manticore
  102. mobs:register_arrow("nssm:spine", {
  103. visual = "sprite",
  104. visual_size = {x = 1, y = 1},
  105. textures = {"manticore_spine_flying.png"},
  106. velocity = 10,
  107. -- direct hit
  108. hit_player = function(self, player)
  109. player:punch(self.object, 1.0, {
  110. full_punch_interval = 1.0,
  111. damage_groups = {fleshy = 2},
  112. }, nil)
  113. end,
  114. hit_mob = function(self, player)
  115. player:punch(self.object, 1.0, {
  116. full_punch_interval = 1.0,
  117. damage_groups = {fleshy = 2},
  118. }, nil)
  119. end,
  120. })
  121. --morbat arrow
  122. mobs:register_arrow("nssm:morarrow", {
  123. visual = "sprite",
  124. visual_size = {x=0.5, y=0.5},
  125. textures = {"morarrow.png"},
  126. velocity= 13,
  127. hit_player = function(self, player)
  128. player:punch(self.object, 1.0, {
  129. full_punch_interval = 1.0,
  130. damage_groups = {fleshy = 3},
  131. }, nil)
  132. end,
  133. })
  134. local function explosion_web(pos)
  135. pos.y = round(pos.y)
  136. if minetest.is_protected(pos, "") then
  137. return
  138. end
  139. for i=pos.x-1, pos.x+1, 1 do
  140. for j=pos.y-3, pos.y, 1 do
  141. for k=pos.z-1, pos.z+1, 1 do
  142. local p = {x=i,y=j,z=k}
  143. local k = {x=i,y=j+1,z=k}
  144. local current = minetest.get_node(p).name
  145. local ontop = minetest.get_node(k).name
  146. if (current ~= "air") and
  147. (current ~= "nssm:web") and
  148. (ontop == "air") and not
  149. minetest.is_protected(p,"") and not
  150. minetest.is_protected(k,"") then
  151. minetest.set_node(k, {name="nssm:web"})
  152. end
  153. end
  154. end
  155. end
  156. end
  157. -- web arrow
  158. mobs:register_arrow("nssm:webball", {
  159. visual = "sprite",
  160. visual_size = {x = 1, y = 1},
  161. textures = {"web_ball.png"},
  162. velocity = 8,
  163. -- direct hit
  164. hit_player = function(self, player)
  165. local p = player:get_pos()
  166. explosion_web(p)
  167. end,
  168. hit_mob = function(self, player)
  169. player:punch(self.object, 1.0, {
  170. full_punch_interval = 1.0,
  171. damage_groups = {fleshy = 1},
  172. }, nil)
  173. end,
  174. hit_node = function(self, pos, node)
  175. explosion_web(pos)
  176. end
  177. })
  178. function explosion_thickweb(pos)
  179. pos.y = round(pos.y)
  180. if minetest.is_protected(pos, "") then
  181. return
  182. end
  183. for i=pos.x+0, pos.x+0, 1 do
  184. for j=pos.y-2, pos.y, 1 do
  185. for k=pos.z+0, pos.z+0, 1 do
  186. local p = {x=i,y=j,z=k}
  187. local k = {x=i,y=j+1,z=k}
  188. local current = minetest.get_node(p).name
  189. local ontop = minetest.get_node(k).name
  190. if (current ~= "air") and
  191. (current ~= "nssm:thick_web") and
  192. (ontop == "air") and not
  193. minetest.is_protected(p,"") and not
  194. minetest.is_protected(k,"") then
  195. minetest.set_node(k, {name="nssm:thick_web"})
  196. end
  197. end
  198. end
  199. end
  200. end
  201. -- thick_web arrow
  202. mobs:register_arrow("nssm:thickwebball", {
  203. visual = "sprite",
  204. visual_size = {x = 2, y = 2},
  205. textures = {"thick_web_ball.png"},
  206. velocity = 8,
  207. -- direct hit
  208. hit_player = function(self, player)
  209. local p = player:get_pos()
  210. explosion_thickweb(p)
  211. end,
  212. hit_mob = function(self, player)
  213. player:punch(self.object, 1.0, {
  214. full_punch_interval = 1.0,
  215. damage_groups = {fleshy = 6},
  216. }, nil)
  217. end,
  218. hit_node = function(self, pos, node)
  219. explosion_thickweb(pos)
  220. end
  221. })
  222. -- arrow=>phoenix arrow
  223. mobs:register_arrow("nssm:phoenix_arrow", {
  224. visual = "sprite",
  225. visual_size = {x = 1, y = 1},
  226. textures = {"transparent.png"},
  227. velocity = 8,
  228. -- direct hit
  229. hit_player = function(self, player)
  230. end,
  231. on_step = function(self, dtime)
  232. local pos = self.object:get_pos()
  233. if minetest.is_protected(pos, "") then
  234. return
  235. end
  236. local n = minetest.get_node(pos).name
  237. if self.timer == 0 then
  238. self.timer = os.time()
  239. end
  240. if os.time() - self.timer > 5 or minetest.is_protected(pos, "")
  241. or ((n~="air") and (n~="nssm:phoenix_fire")) then
  242. self.object:remove()
  243. end
  244. if math.random(1,2)==2 then
  245. minetest.set_node(pos, {name="nssm:phoenix_fire"})
  246. end
  247. if math.random(1,6)==1 then
  248. dx = math.random(-1,1)
  249. dy = math.random(-1,1)
  250. dz = math.random(-1,1)
  251. local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
  252. local n = minetest.get_node(p).name
  253. if n=="air" then
  254. minetest.set_node(p, {name="nssm:phoenix_fire"})
  255. end
  256. end
  257. end,
  258. })
  259. function gas_explosion(pos)
  260. if minetest.is_protected(pos, "") then
  261. return
  262. end
  263. for dx=-2,2 do
  264. for dy=-1,4 do
  265. for dz=-2,2 do
  266. local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
  267. if minetest.is_protected(p, "") then
  268. return
  269. end
  270. local n = minetest.get_node(p).name
  271. if n== "air" then
  272. minetest.set_node(p, {name="nssm:venomous_gas"})
  273. end
  274. end
  275. end
  276. end
  277. end
  278. mobs:register_arrow("nssm:super_gas", {
  279. visual = "sprite",
  280. visual_size = {x = 1, y = 1},
  281. textures = {"transparent.png"},
  282. velocity = 8,
  283. -- direct hit
  284. hit_player = function(self, player)
  285. local p = player:get_pos()
  286. gas_explosion(p)
  287. end,
  288. hit_node = function(self, pos, node)
  289. gas_explosion(pos)
  290. end
  291. })
  292. mobs:register_arrow("nssm:roar_of_the_dragon", {
  293. visual = "sprite",
  294. visual_size = {x = 1, y = 1},
  295. textures = {"transparent.png"},
  296. velocity = 10,
  297. on_step = function(self, dtime)
  298. local pos = self.object:get_pos()
  299. local n = minetest.get_node(pos).name
  300. if self.timer == 0 then
  301. self.timer = os.time()
  302. end
  303. if os.time() - self.timer > 8 or minetest.is_protected(pos, "") then
  304. self.object:remove()
  305. end
  306. local objects = minetest.get_objects_inside_radius(pos, 1)
  307. for _,obj in ipairs(objects) do
  308. local name = obj:get_entity_name()
  309. if name~="nssm:roar_of_the_dragon" and name ~= "nssm:mese_dragon" then
  310. obj:set_hp(obj:get_hp()-0.05)
  311. if (obj:get_hp() <= 0) then
  312. if (not obj:is_player())
  313. and name ~= self.object:get_luaentity().name then
  314. obj:remove()
  315. end
  316. end
  317. end
  318. end
  319. minetest.set_node(pos, {name="air"})
  320. if math.random(1,2)==1 then
  321. dx = math.random(-1,1)
  322. dy = math.random(-1,1)
  323. dz = math.random(-1,1)
  324. if minetest.is_protected(p, "") then
  325. return
  326. end
  327. local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
  328. minetest.set_node(p, {name="air"})
  329. end
  330. end
  331. })
  332. mobs:register_arrow("nssm:lava_arrow", {
  333. visual = "sprite",
  334. visual_size = {x = 1, y = 1},
  335. textures = {"transparent.png"},
  336. velocity = 10,
  337. -- direct hit
  338. hit_player = function(self, player)
  339. local pos = self.object:get_pos()
  340. if minetest.is_protected(pos, "") then
  341. return
  342. end
  343. for dy=-1, 6, 1 do
  344. for dx=-1, 1, 2 do
  345. for dz=-1, 1, 2 do
  346. local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
  347. local n = minetest.get_node(p).name
  348. if n~="default:lava_flowing"
  349. and not minetest.is_protected(p, "") then
  350. minetest.set_node(p, {name="default:lava_flowing"})
  351. end
  352. end
  353. end
  354. end
  355. end,
  356. })