Advertisement
Guest User

Untitled

a guest
Dec 7th, 2013
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.46 KB | None | 0 0
  1.  
  2. --
  3. -- Helper functions
  4. --
  5.  
  6. local function get_sign(i)
  7. if i == 0 then
  8. return 0
  9. else
  10. return i/math.abs(i)
  11. end
  12. end
  13.  
  14. local function get_velocity(vx, vy, vz, yaw)
  15. local x = math.cos(yaw)*vx+math.cos(math.pi/2+yaw)*vz
  16. local z = math.sin(yaw)*vx+math.sin(math.pi/2+yaw)*vz
  17. return {x=x, y=vy, z=z}
  18. end
  19.  
  20. local function get_v(v)
  21. return math.sqrt(vx^2+vz^2)
  22. end
  23. --
  24. --BOOM!
  25. --
  26. local destroy = function(pos)
  27. local nodename = minetest.env:get_node(pos).name
  28. if nodename ~= "air" then
  29. minetest.env:remove_node(pos)
  30. nodeupdate(pos)
  31. if minetest.registered_nodes[nodename].groups.flammable ~= nil then
  32. minetest.env:set_node(pos, {name="fire:basic_flame"})
  33. return
  34. end
  35. if math.random(1,3) == 3 then
  36. return
  37. end
  38. local drop = minetest.get_node_drops(nodename, "")
  39. for _,item in ipairs(drop) do
  40. if type(item) == "string" then
  41. local obj = minetest.env:add_item(pos, item)
  42. if obj == nil then
  43. return
  44. end
  45. obj:get_luaentity().collect = true
  46. obj:setacceleration({x=0, y=-10, z=0})
  47. obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
  48. else
  49. for i=1,item:get_count() do
  50. local obj = minetest.env:add_item(pos, item:get_name())
  51. if obj == nil then
  52. return
  53. end
  54. obj:get_luaentity().collect = true
  55. obj:setacceleration({x=0, y=-10, z=0})
  56. obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
  57. end
  58. end
  59. end
  60. end
  61. end
  62.  
  63. boom = function(pos)
  64. minetest.env:set_node(pos, {name="turrets:boom"})
  65. minetest.after(0.5, function(pos)
  66. minetest.env:remove_node(pos)
  67. end, {x=pos.x, y=pos.y, z=pos.z})
  68. minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
  69. local objects = minetest.env:get_objects_inside_radius(pos, 7)
  70. for _,obj in ipairs(objects) do
  71. if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
  72. local obj_p = obj:getpos()
  73. local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z}
  74. local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5
  75. local damage = (80*0.5^dist)*2
  76. obj:punch(obj, 1.0, {
  77. full_punch_interval=1.0,
  78. damage_groups={fleshy=damage},
  79. }, vec)
  80. end
  81. end
  82.  
  83. for dx=-2,2 do
  84. for dz=-2,2 do
  85. for dy=2,-2,-1 do
  86. pos.x = pos.x+dx
  87. pos.y = pos.y+dy
  88. pos.z = pos.z+dz
  89.  
  90. local node = minetest.env:get_node(pos)
  91. if node.name == "tnt:tnt" or node.name == "tnt:tnt_burning" then
  92. minetest.env:set_node(pos, {name="tnt:tnt_burning"})
  93. boom({x=pos.x, y=pos.y, z=pos.z}, 0)
  94. 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
  95.  
  96. else
  97. if math.abs(dx)<2 and math.abs(dy)<2 and math.abs(dz)<2 then
  98. destroy(pos)
  99. else
  100. if math.random(1,5) <= 4 then
  101. destroy(pos)
  102. end
  103. end
  104. end
  105.  
  106. pos.x = pos.x-dx
  107. pos.y = pos.y-dy
  108. pos.z = pos.z-dz
  109. end
  110. end
  111. end
  112.  
  113. minetest.add_particlespawner(
  114. 100, --amount
  115. 0.1, --time
  116. {x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos
  117. {x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos
  118. {x=-0, y=-0, z=-0}, --minvel
  119. {x=0, y=0, z=0}, --maxvel
  120. {x=-0.5,y=5,z=-0.5}, --minacc
  121. {x=0.5,y=5,z=0.5}, --maxacc
  122. 0.1, --minexptime
  123. 1, --maxexptime
  124. 8, --minsize
  125. 15, --maxsize
  126. false, --collisiondetection
  127. "tnt_smoke.png" --texture
  128. )
  129. end
  130. minetest.register_node("turrets:boom", {
  131. drawtype = "plantlike",
  132. tiles = {"tnt_boom.png"},
  133. light_source = LIGHT_MAX,
  134. walkable = false,
  135. drop = "",
  136. groups = {dig_immediate=3},
  137. })
  138.  
  139.  
  140. --
  141. -- Rocket
  142. --
  143.  
  144. rocket_velocity=38
  145.  
  146. local function launch_rocket(player)
  147. local playerpos=player:getpos()
  148. local obj
  149. obj=minetest.env:add_entity({x=playerpos.x-1*math.sin(-player:get_look_yaw()),y=playerpos.y+1,z=playerpos.z-1*math.cos(-player:get_look_yaw())}, "turrets:rocket")
  150.  
  151. local dir=player:get_look_dir()
  152. obj:setvelocity({x=dir.x*rocket_velocity, y=dir.y*rocket_velocity, z=dir.z*rocket_velocity})
  153. obj:setacceleration({x=dir.x*1, y=dir.y*1, z=dir.z*1})
  154. obj:setyaw(player:get_look_yaw())
  155. end
  156.  
  157. rocket={
  158. physical = false,
  159. visual = "mesh",
  160. mesh = "rocket.x",
  161. timer=0,
  162. textures = {"rocket.png"},
  163. lastpos={},
  164. collisionbox = {0,0,0,0,0,0},
  165. }
  166.  
  167. rocket.on_step = function(self, dtime)
  168. self.timer=self.timer+dtime
  169. local pos = self.object:getpos()
  170. local node = minetest.env:get_node(pos)
  171. if self.timer>5 then
  172. self.object:remove()
  173. end
  174.  
  175. if self.lastpos.x~=nil then
  176. if node.name ~= "air" then
  177. boom(self.lastpos)
  178. self.object:remove()
  179. end
  180. end
  181. self.lastpos={x=pos.x, y=pos.y, z=pos.z}
  182. end
  183.  
  184. --
  185. -- turret_mg entity
  186. --
  187. local turret_cannon = {
  188. physical = true,
  189. collisionbox = {-1,-0.6,-1, 1,0.3,1},
  190.  
  191. --Just copy from lua api for test
  192. collide_with_objects = true,
  193. weight = 5,
  194.  
  195. visual = "mesh",
  196. mesh = "root.x",
  197. --Player
  198. driver = nil,
  199.  
  200. --turret_mg mesh
  201. model = nil,
  202.  
  203. --In progress
  204. motor = nil,
  205. left = true,
  206. timer=0,
  207.  
  208. --Rotation
  209. yaw=0,
  210.  
  211. --Detect hit an object or node
  212. prev_y=0,
  213.  
  214. --Speeds
  215. vx=0,
  216. vy=0,
  217. vz=0
  218.  
  219. }
  220.  
  221. local turret_mg = {
  222. physical = true,
  223. collisionbox = {-1,-0.6,-1, 1,0.3,1},
  224.  
  225. --Just copy from lua api for test
  226. collide_with_objects = true,
  227. weight = 5,
  228.  
  229. visual = "mesh",
  230. mesh = "root.x",
  231. --Player
  232. driver = nil,
  233.  
  234. --turret_mg mesh
  235. model = nil,
  236.  
  237. --In progress
  238. motor = nil,
  239. left = true,
  240. timer=0,
  241.  
  242. --Rotation
  243. yaw=0,
  244.  
  245. --Detect hit an object or node
  246. prev_y=0,
  247.  
  248. --Speeds
  249. vx=0,
  250. vy=0,
  251. vz=0
  252.  
  253. }
  254.  
  255. local turret_mgModel = {
  256. visual = "mesh",
  257. mesh = "turret_mg.x",
  258. textures = {"olbadmetal.png","olbarrel.png","olmetal.png","olmetal.png","olmetal.png","olmetal.png","olbadmetal.png","olbadmetal.png","olmetal.png","olmetal.png","olmetal.png","window.png","olmetal.png","olmetal.png"},
  259. }
  260.  
  261. local turret_cannonModel = {
  262. visual = "mesh",
  263. mesh = "turret_cannon.x",
  264. textures = {"olbadmetal.png","olmetal.png","olmetal.png","olmetal.png","olmetal.png","olmetal.png","olbadmetal.png","olmetal.png","olmetal.png","olmetal.png","window.png","olmetal.png","olmetal.png",},
  265. }
  266. function turret_mg:on_rightclick(clicker)
  267. if not clicker or not clicker:is_player() then
  268. return
  269. end
  270. if self.driver and clicker == self.driver then
  271. clicker:set_attach(self.model, "Root", {x=0,y=0,z=0}, {x=0,y=0,z=0})
  272. self.driver = nil
  273. clicker:set_detach()
  274. self.model:set_animation({x=0,y=1},0, 0)
  275. elseif not self.driver then
  276. self.model:set_animation({x=0,y=10},10, 0)
  277. self.driver = clicker
  278. --self.driver:set_animation({ x= 81, y=160, },10,0)
  279. clicker:set_attach(self.model, "Root", {x=0,y=0,z=-10}, {x=-90,y=0,z=-90})
  280. --self.object:setyaw(clicker:get_look_yaw())
  281. end
  282. end
  283.  
  284. function turret_cannon:on_rightclick(clicker)
  285. if not clicker or not clicker:is_player() then
  286. return
  287. end
  288. if self.driver and clicker == self.driver then
  289. clicker:set_attach(self.model, "Root", {x=0,y=0,z=0}, {x=0,y=0,z=0})
  290. self.driver = nil
  291. clicker:set_detach()
  292. self.model:set_animation({x=0,y=1},0, 0)
  293. elseif not self.driver then
  294. self.model:set_animation({x=0,y=10},10, 0)
  295. self.driver = clicker
  296. --self.driver:set_animation({ x= 81, y=160, },10,0)
  297. clicker:set_attach(self.model, "Root", {x=0,y=0,z=-10}, {x=-90,y=0,z=-90})
  298. --self.object:setyaw(clicker:get_look_yaw())
  299. end
  300. end
  301.  
  302. function turret_mgModel:on_activate(staticdata, dtime_s)
  303. self.object:set_armor_groups({immortal=1})
  304. local is_attached = false
  305. for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 2)) do
  306. if object and object:get_luaentity() and object:get_luaentity().name=="turrets:turret_mg" then
  307. if object:get_luaentity().model == nil then
  308. object:get_luaentity().model = self
  309. end
  310. if object:get_luaentity().model == self then
  311. is_attached = true
  312. end
  313. end
  314. end
  315. if is_attached == false then
  316. self.object:remove()
  317. end
  318.  
  319. end
  320.  
  321.  
  322. function turret_cannonModel:on_activate(staticdata, dtime_s)
  323. self.object:set_armor_groups({immortal=1})
  324. local is_attached = false
  325. for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 2)) do
  326. if object and object:get_luaentity() and object:get_luaentity().name=="turrets:turret_cannon" then
  327. if object:get_luaentity().model == nil then
  328. object:get_luaentity().model = self
  329. end
  330. if object:get_luaentity().model == self then
  331. is_attached = true
  332. end
  333. end
  334. end
  335. if is_attached == false then
  336. self.object:remove()
  337. end
  338.  
  339. end
  340. function turret_mg:on_activate(staticdata, dtime_s)
  341. self.object:set_armor_groups({immortal=1})
  342. self.prev_y=self.object:getpos()
  343. if self.model == nil then
  344. self.model = minetest.env:add_entity(self.object:getpos(), "turrets:turret_mgModel")
  345. self.model:set_attach(self.object, "Root", {x=0,y=0,z=2}, {x=0,y=0,z=0})
  346. end
  347. end
  348.  
  349. function turret_cannon:on_activate(staticdata, dtime_s)
  350. self.object:set_armor_groups({immortal=1})
  351. self.prev_y=self.object:getpos()
  352. if self.model == nil then
  353. self.model = minetest.env:add_entity(self.object:getpos(), "turrets:turret_cannonModel")
  354. self.model:set_attach(self.object, "Root", {x=0,y=0,z=2}, {x=0,y=0,z=0})
  355. end
  356. end
  357. function turret_mg:get_staticdata(self)
  358. end
  359.  
  360. ------
  361. ---main obj on_step
  362. ------
  363.  
  364. function turret_mg:on_step(dtime)
  365. --Prevent shaking turret_mg while sitting in it
  366. self.timer=self.timer+dtime
  367.  
  368. if self.driver then
  369. local ctrl = self.driver:get_player_control()
  370. if ctrl.LMB and self.timer>1 then
  371.  
  372. launch_rocket(self.driver)
  373. self.timer = 0
  374. end
  375. end
  376. end
  377.  
  378.  
  379. function turret_cannon:on_step(dtime)
  380. --Prevent shaking turret_mg while sitting in it
  381. self.timer=self.timer+dtime
  382.  
  383. if self.driver then
  384. local ctrl = self.driver:get_player_control()
  385. if ctrl.LMB and self.timer>1 then
  386.  
  387. launch_rocket(self.driver)
  388. self.timer = 0
  389. end
  390. end
  391. end
  392.  
  393.  
  394.  
  395.  
  396. --
  397. --Registration
  398. --
  399.  
  400. minetest.register_entity("turrets:turret_mg", turret_mg)
  401. minetest.register_entity("turrets:turret_mgModel", turret_mgModel)
  402. minetest.register_entity("turrets:turret_cannon", turret_cannon)
  403. minetest.register_entity("turrets:turret_cannonModel", turret_cannonModel)
  404. minetest.register_entity("turrets:rocket", rocket)
  405.  
  406.  
  407.  
  408. minetest.register_craftitem("turrets:turret_mg", {
  409. description = "Machine Gun Turret",
  410. inventory_image = "heli_inv.png",
  411. wield_image = "heli_inv.png",
  412. wield_scale = {x=1, y=1, z=1},
  413. liquids_pointable = false,
  414.  
  415. on_place = function(itemstack, placer, pointed_thing)
  416. if pointed_thing.type ~= "node" then
  417. return
  418. end
  419. pointed_thing.under.y = pointed_thing.under.y+1
  420. minetest.env:add_entity(pointed_thing.under, "turrets:turret_mg")
  421. itemstack:take_item()
  422. return itemstack
  423. end,
  424. })
  425.  
  426.  
  427. minetest.register_craftitem("turrets:turret_cannon", {
  428. description = "Machine Gun Cannon",
  429. inventory_image = "heli_inv.png",
  430. wield_image = "heli_inv.png",
  431. wield_scale = {x=1, y=1, z=1},
  432. liquids_pointable = false,
  433.  
  434. on_place = function(itemstack, placer, pointed_thing)
  435. if pointed_thing.type ~= "node" then
  436. return
  437. end
  438. pointed_thing.under.y = pointed_thing.under.y+1
  439. minetest.env:add_entity(pointed_thing.under, "turrets:turret_cannon")
  440. itemstack:take_item()
  441. return itemstack
  442. end,
  443. })
  444.  
  445.  
  446. --
  447. --Craft RECIPE
  448. --
  449. minetest.register_craft({
  450. output = 'turrets:turret_mg',
  451. recipe = {
  452.  
  453. {'', 'default:tree', 'default:tree'},
  454. }
  455. })
  456. minetest.register_craft({
  457. output = 'turrets:turret_cannon',
  458. recipe = {
  459.  
  460. {'', 'default:tree', 'default:tree'},
  461. }
  462. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement