Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --
- -- Helper functions
- --
- local function get_sign(i)
- if i == 0 then
- return 0
- else
- return i/math.abs(i)
- end
- end
- local function get_velocity(vx, vy, vz, yaw)
- local x = math.cos(yaw)*vx+math.cos(math.pi/2+yaw)*vz
- local z = math.sin(yaw)*vx+math.sin(math.pi/2+yaw)*vz
- return {x=x, y=vy, z=z}
- end
- local function get_v(v)
- return math.sqrt(vx^2+vz^2)
- end
- --
- --BOOM!
- --
- local destroy = function(pos)
- local nodename = minetest.env:get_node(pos).name
- if nodename ~= "air" then
- minetest.env:remove_node(pos)
- nodeupdate(pos)
- if minetest.registered_nodes[nodename].groups.flammable ~= nil then
- minetest.env:set_node(pos, {name="fire:basic_flame"})
- return
- end
- if math.random(1,3) == 3 then
- return
- end
- local drop = minetest.get_node_drops(nodename, "")
- for _,item in ipairs(drop) do
- if type(item) == "string" then
- local obj = minetest.env:add_item(pos, item)
- if obj == nil then
- return
- end
- obj:get_luaentity().collect = true
- obj:setacceleration({x=0, y=-10, z=0})
- obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
- else
- for i=1,item:get_count() do
- local obj = minetest.env:add_item(pos, item:get_name())
- if obj == nil then
- return
- end
- obj:get_luaentity().collect = true
- obj:setacceleration({x=0, y=-10, z=0})
- obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
- end
- end
- end
- end
- end
- boom = function(pos)
- minetest.env:set_node(pos, {name="turrets:boom"})
- minetest.after(0.5, function(pos)
- minetest.env:remove_node(pos)
- end, {x=pos.x, y=pos.y, z=pos.z})
- minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
- local objects = minetest.env:get_objects_inside_radius(pos, 7)
- for _,obj in ipairs(objects) do
- if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
- local obj_p = obj:getpos()
- local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z}
- local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5
- local damage = (80*0.5^dist)*2
- obj:punch(obj, 1.0, {
- full_punch_interval=1.0,
- damage_groups={fleshy=damage},
- }, vec)
- end
- end
- for dx=-2,2 do
- for dz=-2,2 do
- for dy=2,-2,-1 do
- pos.x = pos.x+dx
- pos.y = pos.y+dy
- pos.z = pos.z+dz
- local node = minetest.env:get_node(pos)
- if node.name == "tnt:tnt" or node.name == "tnt:tnt_burning" then
- minetest.env:set_node(pos, {name="tnt:tnt_burning"})
- boom({x=pos.x, y=pos.y, z=pos.z}, 0)
- 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
- else
- if math.abs(dx)<2 and math.abs(dy)<2 and math.abs(dz)<2 then
- destroy(pos)
- else
- if math.random(1,5) <= 4 then
- destroy(pos)
- end
- end
- end
- pos.x = pos.x-dx
- pos.y = pos.y-dy
- pos.z = pos.z-dz
- end
- end
- end
- minetest.add_particlespawner(
- 100, --amount
- 0.1, --time
- {x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos
- {x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos
- {x=-0, y=-0, z=-0}, --minvel
- {x=0, y=0, z=0}, --maxvel
- {x=-0.5,y=5,z=-0.5}, --minacc
- {x=0.5,y=5,z=0.5}, --maxacc
- 0.1, --minexptime
- 1, --maxexptime
- 8, --minsize
- 15, --maxsize
- false, --collisiondetection
- "tnt_smoke.png" --texture
- )
- end
- minetest.register_node("turrets:boom", {
- drawtype = "plantlike",
- tiles = {"tnt_boom.png"},
- light_source = LIGHT_MAX,
- walkable = false,
- drop = "",
- groups = {dig_immediate=3},
- })
- --
- -- Rocket
- --
- rocket_velocity=38
- local function launch_rocket(player)
- local playerpos=player:getpos()
- local obj
- 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")
- local dir=player:get_look_dir()
- obj:setvelocity({x=dir.x*rocket_velocity, y=dir.y*rocket_velocity, z=dir.z*rocket_velocity})
- obj:setacceleration({x=dir.x*1, y=dir.y*1, z=dir.z*1})
- obj:setyaw(player:get_look_yaw())
- end
- rocket={
- physical = false,
- visual = "mesh",
- mesh = "rocket.x",
- timer=0,
- textures = {"rocket.png"},
- lastpos={},
- collisionbox = {0,0,0,0,0,0},
- }
- rocket.on_step = function(self, dtime)
- self.timer=self.timer+dtime
- local pos = self.object:getpos()
- local node = minetest.env:get_node(pos)
- if self.timer>5 then
- self.object:remove()
- end
- if self.lastpos.x~=nil then
- if node.name ~= "air" then
- boom(self.lastpos)
- self.object:remove()
- end
- end
- self.lastpos={x=pos.x, y=pos.y, z=pos.z}
- end
- --
- -- turret_mg entity
- --
- local turret_cannon = {
- physical = true,
- collisionbox = {-1,-0.6,-1, 1,0.3,1},
- --Just copy from lua api for test
- collide_with_objects = true,
- weight = 5,
- visual = "mesh",
- mesh = "root.x",
- --Player
- driver = nil,
- --turret_mg mesh
- model = nil,
- --In progress
- motor = nil,
- left = true,
- timer=0,
- --Rotation
- yaw=0,
- --Detect hit an object or node
- prev_y=0,
- --Speeds
- vx=0,
- vy=0,
- vz=0
- }
- local turret_mg = {
- physical = true,
- collisionbox = {-1,-0.6,-1, 1,0.3,1},
- --Just copy from lua api for test
- collide_with_objects = true,
- weight = 5,
- visual = "mesh",
- mesh = "root.x",
- --Player
- driver = nil,
- --turret_mg mesh
- model = nil,
- --In progress
- motor = nil,
- left = true,
- timer=0,
- --Rotation
- yaw=0,
- --Detect hit an object or node
- prev_y=0,
- --Speeds
- vx=0,
- vy=0,
- vz=0
- }
- local turret_mgModel = {
- visual = "mesh",
- mesh = "turret_mg.x",
- 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"},
- }
- local turret_cannonModel = {
- visual = "mesh",
- mesh = "turret_cannon.x",
- 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",},
- }
- function turret_mg:on_rightclick(clicker)
- if not clicker or not clicker:is_player() then
- return
- end
- if self.driver and clicker == self.driver then
- clicker:set_attach(self.model, "Root", {x=0,y=0,z=0}, {x=0,y=0,z=0})
- self.driver = nil
- clicker:set_detach()
- self.model:set_animation({x=0,y=1},0, 0)
- elseif not self.driver then
- self.model:set_animation({x=0,y=10},10, 0)
- self.driver = clicker
- --self.driver:set_animation({ x= 81, y=160, },10,0)
- clicker:set_attach(self.model, "Root", {x=0,y=0,z=-10}, {x=-90,y=0,z=-90})
- --self.object:setyaw(clicker:get_look_yaw())
- end
- end
- function turret_cannon:on_rightclick(clicker)
- if not clicker or not clicker:is_player() then
- return
- end
- if self.driver and clicker == self.driver then
- clicker:set_attach(self.model, "Root", {x=0,y=0,z=0}, {x=0,y=0,z=0})
- self.driver = nil
- clicker:set_detach()
- self.model:set_animation({x=0,y=1},0, 0)
- elseif not self.driver then
- self.model:set_animation({x=0,y=10},10, 0)
- self.driver = clicker
- --self.driver:set_animation({ x= 81, y=160, },10,0)
- clicker:set_attach(self.model, "Root", {x=0,y=0,z=-10}, {x=-90,y=0,z=-90})
- --self.object:setyaw(clicker:get_look_yaw())
- end
- end
- function turret_mgModel:on_activate(staticdata, dtime_s)
- self.object:set_armor_groups({immortal=1})
- local is_attached = false
- for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 2)) do
- if object and object:get_luaentity() and object:get_luaentity().name=="turrets:turret_mg" then
- if object:get_luaentity().model == nil then
- object:get_luaentity().model = self
- end
- if object:get_luaentity().model == self then
- is_attached = true
- end
- end
- end
- if is_attached == false then
- self.object:remove()
- end
- end
- function turret_cannonModel:on_activate(staticdata, dtime_s)
- self.object:set_armor_groups({immortal=1})
- local is_attached = false
- for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 2)) do
- if object and object:get_luaentity() and object:get_luaentity().name=="turrets:turret_cannon" then
- if object:get_luaentity().model == nil then
- object:get_luaentity().model = self
- end
- if object:get_luaentity().model == self then
- is_attached = true
- end
- end
- end
- if is_attached == false then
- self.object:remove()
- end
- end
- function turret_mg:on_activate(staticdata, dtime_s)
- self.object:set_armor_groups({immortal=1})
- self.prev_y=self.object:getpos()
- if self.model == nil then
- self.model = minetest.env:add_entity(self.object:getpos(), "turrets:turret_mgModel")
- self.model:set_attach(self.object, "Root", {x=0,y=0,z=2}, {x=0,y=0,z=0})
- end
- end
- function turret_cannon:on_activate(staticdata, dtime_s)
- self.object:set_armor_groups({immortal=1})
- self.prev_y=self.object:getpos()
- if self.model == nil then
- self.model = minetest.env:add_entity(self.object:getpos(), "turrets:turret_cannonModel")
- self.model:set_attach(self.object, "Root", {x=0,y=0,z=2}, {x=0,y=0,z=0})
- end
- end
- function turret_mg:get_staticdata(self)
- end
- ------
- ---main obj on_step
- ------
- function turret_mg:on_step(dtime)
- --Prevent shaking turret_mg while sitting in it
- self.timer=self.timer+dtime
- if self.driver then
- local ctrl = self.driver:get_player_control()
- if ctrl.LMB and self.timer>1 then
- launch_rocket(self.driver)
- self.timer = 0
- end
- end
- end
- function turret_cannon:on_step(dtime)
- --Prevent shaking turret_mg while sitting in it
- self.timer=self.timer+dtime
- if self.driver then
- local ctrl = self.driver:get_player_control()
- if ctrl.LMB and self.timer>1 then
- launch_rocket(self.driver)
- self.timer = 0
- end
- end
- end
- --
- --Registration
- --
- minetest.register_entity("turrets:turret_mg", turret_mg)
- minetest.register_entity("turrets:turret_mgModel", turret_mgModel)
- minetest.register_entity("turrets:turret_cannon", turret_cannon)
- minetest.register_entity("turrets:turret_cannonModel", turret_cannonModel)
- minetest.register_entity("turrets:rocket", rocket)
- minetest.register_craftitem("turrets:turret_mg", {
- description = "Machine Gun Turret",
- inventory_image = "heli_inv.png",
- wield_image = "heli_inv.png",
- wield_scale = {x=1, y=1, z=1},
- liquids_pointable = false,
- on_place = function(itemstack, placer, pointed_thing)
- if pointed_thing.type ~= "node" then
- return
- end
- pointed_thing.under.y = pointed_thing.under.y+1
- minetest.env:add_entity(pointed_thing.under, "turrets:turret_mg")
- itemstack:take_item()
- return itemstack
- end,
- })
- minetest.register_craftitem("turrets:turret_cannon", {
- description = "Machine Gun Cannon",
- inventory_image = "heli_inv.png",
- wield_image = "heli_inv.png",
- wield_scale = {x=1, y=1, z=1},
- liquids_pointable = false,
- on_place = function(itemstack, placer, pointed_thing)
- if pointed_thing.type ~= "node" then
- return
- end
- pointed_thing.under.y = pointed_thing.under.y+1
- minetest.env:add_entity(pointed_thing.under, "turrets:turret_cannon")
- itemstack:take_item()
- return itemstack
- end,
- })
- --
- --Craft RECIPE
- --
- minetest.register_craft({
- output = 'turrets:turret_mg',
- recipe = {
- {'', 'default:tree', 'default:tree'},
- }
- })
- minetest.register_craft({
- output = 'turrets:turret_cannon',
- recipe = {
- {'', 'default:tree', 'default:tree'},
- }
- })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement