antigrav.lua 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. ------------------- anti grav beam initiator off --------------------
  2. ------------------------------------------------------------------------
  3. ------------------------------------------------------------------------
  4. minetest.register_node("ufowreck:alien_antigrav", {
  5. description = minetest.colorize("#0E0", "Alien ")..minetest.colorize("#A0F", "Antigrav Beam"),
  6. tiles = {
  7. "alien_ag_top_off.png",
  8. "alien_ag_bottom.png",
  9. "alien_ag_side_off.png",
  10. "alien_ag_side_off.png",
  11. "alien_ag_side_off.png",
  12. "alien_ag_side_off.png",
  13. },
  14. groups = {cracky=2, mesecon_effector_off = 1 },
  15. connect_sides = {"bottom"},
  16. sounds = default.node_sound_metal_defaults(),
  17. drop = "ufowreck:alien_antigrav",
  18. mesecons = {effector = {
  19. rules = {
  20. {x=0, y=0, z=-1},
  21. {x=1, y=0, z=0},
  22. {x=-1, y=0, z=0},
  23. {x=0, y=0, z=1},
  24. {x=1, y=1, z=0},
  25. {x=1, y=-1, z=0},
  26. {x=-1, y=1, z=0},
  27. {x=-1, y=-1, z=0},
  28. {x=0, y=1, z=1},
  29. {x=0, y=-1, z=1},
  30. {x=0, y=1, z=-1},
  31. {x=0, y=-1, z=-1},
  32. {x=0, y=-1, z=0},
  33. },
  34. action_on = function (pos, node)
  35. local meta = minetest.get_meta(pos)
  36. minetest.swap_node(pos, {name = "ufowreck:alien_antigrav_on"})
  37. meta:set_string("infotext", minetest.colorize("#0E0", "Alien ").."Antigrav Beam (On)")
  38. pos.y = pos.y + 1
  39. local yi
  40. minetest.sound_play("ag_on",{max_hear_distance = 16,pos = pos,gain = 1.0})
  41. for yi = 0, 100 do
  42. if (minetest.get_node(pos)).name == "air" or (minetest.get_node(pos)).name == "ufowreck:ag_beam_off" then
  43. minetest.set_node(pos,{name = "ufowreck:ag_beam_on"})
  44. else
  45. break
  46. end
  47. pos.y = pos.y + 1
  48. end
  49. end,
  50. }},
  51. after_dig_node = function(pos, oldnode, oldmetadata, digger) --gets rid of the beam when it is dug
  52. pos.y = pos.y + 1
  53. local yi
  54. for yi = 0, 100 do
  55. if (minetest.get_node(pos)).name == "ufowreck:ag_beam_on" or (minetest.get_node(pos)).name == "ufowreck:ag_beam_off" then
  56. minetest.set_node(pos,{name = "air"})
  57. else
  58. break
  59. end
  60. pos.y = pos.y + 1
  61. end
  62. end,
  63. })
  64. ------------------- anti grav beam initiator on --------------------
  65. ------------------------------------------------------------------------
  66. ------------------------------------------------------------------------
  67. minetest.register_node("ufowreck:alien_antigrav_on", {
  68. description = minetest.colorize("#0E0", "Alien ").."Antigrav Beam (On)",
  69. tiles = {
  70. {name="alien_ag_top.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.00},},
  71. "alien_ag_bottom.png",
  72. {name="alien_ag_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.00},},
  73. {name="alien_ag_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.00},},
  74. {name="alien_ag_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.00},},
  75. {name="alien_ag_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.00},},
  76. },
  77. light_source = 5,
  78. groups = {cracky=2, not_in_creative_inventory = 1, mesecon_effector_on = 1,fall_damage_add_percent = -90,},
  79. connect_sides = {"bottom"},
  80. sounds = default.node_sound_metal_defaults(),
  81. drop = "ufowreck:alien_antigrav",
  82. on_construct = function(pos)
  83. local meta = minetest.get_meta(pos)
  84. meta:set_string("infotext", minetest.colorize("#0E0", "Alien ").."Antigrav Beam (On)")
  85. pos.y = pos.y + 1
  86. local yi
  87. for yi = 0, 100 do
  88. if (minetest.get_node(pos)).name == "air" then
  89. minetest.set_node(pos,{name = "ufowreck:ag_beam_on"})
  90. else
  91. break
  92. end
  93. pos.y = pos.y + 1
  94. end
  95. end,
  96. on_destruct = function(pos) --gets rid of the beam when it is dug
  97. pos.y = pos.y + 1
  98. local yi
  99. for yi = 0, 100 do
  100. if (minetest.get_node(pos)).name == "ufowreck:ag_beam_on" or (minetest.get_node(pos)).name == "ufowreck:ag_beam_off" then
  101. minetest.set_node(pos,{name = "air"})
  102. else
  103. break
  104. end
  105. pos.y = pos.y + 1
  106. end
  107. end,
  108. mesecons = {effector = {
  109. rules = lightstone_rules,
  110. action_off = function (pos, node)
  111. local meta = minetest.get_meta(pos)
  112. minetest.swap_node(pos,{name = "ufowreck:alien_antigrav"})
  113. meta:set_string("infotext", minetest.colorize("#0E0", "Alien ").."Antigrav Beam (Off)")
  114. pos.y = pos.y + 1
  115. local yi
  116. for yi = 0, 100 do
  117. if (minetest.get_node(pos)).name == "ufowreck:ag_beam_on" then
  118. minetest.set_node(pos,{name = "air"})
  119. end
  120. pos.y = pos.y + 1
  121. end
  122. end,
  123. }},
  124. after_dig_node = function(pos, oldnode, oldmetadata, digger) --gets rid of the beam when it is dug
  125. pos.y = pos.y + 1
  126. local yi
  127. for yi = 0, 100 do
  128. if (minetest.get_node(pos)).name == "ufowreck:ag_beam_on" or (minetest.get_node(pos)).name == "ufowreck:ag_beam_off" then
  129. minetest.set_node(pos,{name = "air"})
  130. else
  131. break
  132. end
  133. pos.y = pos.y + 1
  134. end
  135. end,
  136. })
  137. ------------------- anti grav beam nodes -----------------------------
  138. ------------------------------------------------------------------------
  139. ------------------------------------------------------------------------
  140. -------zero_grav effect ------------
  141. local gravity = player_monoids.gravity
  142. local timer = 0
  143. ufowreck.antigrav_players = {}
  144. minetest.register_globalstep(function(dtime)
  145. timer = timer + dtime;
  146. if timer >= 1 then
  147. for _,player in pairs(minetest.get_connected_players()) do
  148. if minetest.get_node(player:get_pos()).name == "ufowreck:ag_beam_on" and ufowreck.antigrav_players[player:get_player_name()] == nil then
  149. -- player is standing in the ag_beam_on node, and is not on the list
  150. ufowreck.antigrav_players[player:get_player_name()] = player
  151. gravity:add_change(player, 0, "ufowreck_0_grav")
  152. player:add_velocity(vector.new(0,2,0))
  153. else
  154. if ufowreck.antigrav_players[player:get_player_name()] ~= nil then
  155. --player is on the list
  156. if minetest.get_node(player:get_pos()).name ~= "ufowreck:ag_beam_on" then
  157. --the player is not in an ag_beam_on node
  158. gravity:del_change(player, "ufowreck_0_grav")
  159. ufowreck.antigrav_players[player:get_player_name()] = nil
  160. end
  161. end
  162. end
  163. end
  164. end
  165. end)
  166. minetest.register_on_leaveplayer(function(player)
  167. if ufowreck.antigrav_players[player:get_player_name()] == nil then
  168. return
  169. else
  170. ufowreck.antigrav_players[player:get_player_name()] = nil
  171. gravity:del_change(player, "ufowreck_0_grav")
  172. end
  173. end)
  174. minetest.register_node("ufowreck:ag_beam_on", {
  175. description = "Alien Antigrav Beam node (on)",
  176. paramtype = "light",
  177. tiles = {
  178. "alien_ag_beam.png",
  179. },
  180. drawtype = "nodebox",
  181. paramtype = "light",
  182. use_texture_alpha = true,
  183. light_source = 14,
  184. sunlight_propagates = true,
  185. pointable = false,
  186. diggable = false,
  187. buildable_to = false,
  188. walkable = false,
  189. climbable = false,
  190. drop = "",
  191. on_construct = function(pos)
  192. local timer = minetest.get_node_timer(pos)
  193. timer:start(.3) -- in seconds
  194. end,
  195. on_destruct = function(pos)
  196. local timer = minetest.get_node_timer(pos)
  197. timer:stop()
  198. end,
  199. on_timer = function(pos)
  200. local obj_list = minetest.get_objects_inside_radius(pos, .6)
  201. for _,obj in ipairs(obj_list) do
  202. local is_p = false
  203. if obj:is_player() then
  204. is_p = true
  205. end
  206. if not(is_p) then
  207. local ent = obj:get_luaentity()
  208. if ent ~= nil then
  209. vel = obj:get_velocity()
  210. obj:set_velocity({x=vel.x, y=10, z=vel.z})
  211. end
  212. end
  213. end
  214. if minetest.get_node(pos).name == "ufowreck:ag_beam_on" then
  215. return true
  216. else
  217. return false
  218. end
  219. end,
  220. groups = {not_in_creative_inventory = 1},
  221. })
  222. ------------------- CRAFTS -----------------------------
  223. ------------------------------------------------------------------------
  224. ------------------------------------------------------------------------
  225. minetest.register_craft({
  226. type = "shapeless",
  227. output = "ufowreck:alien_antigrav",
  228. recipe = {
  229. "ufowreck:alien_antigrav_broken",
  230. "mesecons_fpga:fpga0000",
  231. "default:mese_crystal_fragment",
  232. },
  233. })