SHARE
TWEET

Untitled

a guest Dec 7th, 2013 38 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. })
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top