From 67e43d0b082e1bb12f31e9f51b36efae4873c74e Mon Sep 17 00:00:00 2001 From: npx Date: Sun, 24 Apr 2016 23:20:48 +0200 Subject: [PATCH] Updated functions and added protection controls --- darts.lua | 194 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 108 insertions(+), 86 deletions(-) diff --git a/darts.lua b/darts.lua index 7058f8f..6d4b8c2 100644 --- a/darts.lua +++ b/darts.lua @@ -6,11 +6,13 @@ nssm:register_arrow("nssm:duck_father", { velocity = 8, -- direct hit hit_player = function(self, player) - nssm:duck_explosion_direct(pos, player) + local pos = self.object:getpos() + nssm:duck_explosion(pos) end, hit_mob = function(self, player) - nssm:duck_explosion_direct(pos, player) + local pos = self.object:getpos() + nssm:duck_explosion(pos) end, hit_node = function(self, pos, node) @@ -19,50 +21,6 @@ nssm:register_arrow("nssm:duck_father", { }) -function nssm:duck_explosion_direct(pos, player) - pos = player:getpos() - pos.y = pos.y+1; - minetest.add_particlespawner({ - amount = 10, - time = 0.2, - minpos = {x=pos.x-1, y=pos.y-1, z=pos.z-1}, - maxpos = {x=pos.x+1, y=pos.y+4, z=pos.z+1}, - minvel = {x=0, y=0, z=0}, - maxvel = {x=1, y=1, z=1}, - minacc = {x=-0.5,y=5,z=-0.5}, - maxacc = {x=0.5,y=5,z=0.5}, - minexptime = 1, - maxexptime = 3, - minsize = 4, - maxsize = 6, - collisiondetection = false, - vertical = false, - texture = "duck_egg_fragments.png", - }) - core.after(0.4, function() - for dx = -2,2 do - pos = {x = pos.x+dx, y=pos.y; z=pos.z+dx} - minetest.add_particlespawner({ - amount = 100, - time = 0.2, - minpos = {x=pos.x-1, y=pos.y-1, z=pos.z-1}, - maxpos = {x=pos.x+1, y=pos.y+4, z=pos.z+1}, - minvel = {x=0, y=0, z=0}, - maxvel = {x=1, y=5, z=1}, - minacc = {x=-0.5,y=5,z=-0.5}, - maxacc = {x=0.5,y=5,z=0.5}, - minexptime = 1, - maxexptime = 3, - minsize = 2, - maxsize = 4, - collisiondetection = false, - vertical = false, - texture = "tnt_smoke.png", - }) - minetest.add_entity(pos, "nssm:duck") - end - end) -end function nssm:duck_explosion(pos) pos.y = pos.y+1; minetest.add_particlespawner({ @@ -115,11 +73,13 @@ nssm:register_arrow("nssm:snow_arrow", { velocity =20, -- direct hit hit_player = function(self, player) - nssm:ice_explosion1(pos, player) + local pos = self.object:getpos() + nssm:ice_explosion(pos) end, hit_mob = function(self, player) - nssm:ice_explosion1(pos, player) + local pos = self.object:getpos() + nssm:ice_explosion(pos) end, hit_node = function(self, pos, node) nssm:ice_explosion(pos) @@ -127,28 +87,15 @@ nssm:register_arrow("nssm:snow_arrow", { }) function nssm:ice_explosion(pos) - --pos = player:getpos() for i=pos.x-math.random(0, 1), pos.x+math.random(0, 1), 1 do for j=pos.y-1, pos.y+4, 1 do for k=pos.z-math.random(0, 1), pos.z+math.random(0, 1), 1 do - minetest.set_node({x=i, y=j, z=k}, {name="default:ice"}) - end + minetest.set_node({x=i, y=j, z=k}, {name="default:ice"}) + end end end end -function nssm:ice_explosion1(pos, player) - pos = player:getpos() - for i=pos.x-math.random(0, 1), pos.x+math.random(0, 1), 1 do - for j=pos.y-1, pos.y+4, 1 do - for k=pos.z-math.random(0, 1), pos.z+math.random(0, 1), 1 do - minetest.set_node({x=i, y=j, z=k}, {name="default:ice"}) - end - end - end -end - - -- arrow manticore nssm:register_arrow("nssm:spine", { visual = "sprite", @@ -171,7 +118,6 @@ nssm:register_arrow("nssm:spine", { end, }) - -- web arrow nssm:register_arrow("nssm:webball", { visual = "sprite", @@ -197,26 +143,29 @@ nssm:register_arrow("nssm:webball", { }) function nssm:explosion_web(pos) + if minetest.is_protected(pos, "") then + return + end for i=pos.x-1, pos.x+1, 1 do for j=pos.y-1, pos.y+1, 1 do - for k=pos.z-1, pos.z+1, 1 do - local current = minetest.get_node({x=i,y=j,z=k}) - local ontop = minetest.get_node({x=i,y=j+1,z=k}) - if (current.name ~= "air") and - (current.name ~= "nssm:web") and - (ontop.name == "air") then - minetest.set_node({x=i,y=j+1,z=k}, {name="nssm:web"}) + for k=pos.z-1, pos.z+1, 1 do + local current = minetest.get_node({x=i,y=j,z=k}) + local ontop = minetest.get_node({x=i,y=j+1,z=k}) + if (current.name ~= "air") and + (current.name ~= "nssm:web") and + (ontop.name == "air") and not + minetest.is_protected(current,"") and not + minetest.is_protected(ontop,"") then + minetest.set_node(ontop, {name="nssm:web"}) + end end end - end - end + end end - -- arrow=>phoenix arrow nssm:register_arrow("nssm:phoenix_arrow", { visual = "sprite", - phoenix_fire = true, visual_size = {x = 1, y = 1}, textures = {"transparent.png"}, velocity = 8, @@ -224,11 +173,28 @@ nssm:register_arrow("nssm:phoenix_arrow", { hit_player = function(self, player) end, - hit_mob = function(self, player) - end, + on_step = function(self, dtime) - hit_node = function(self, pos, node) - end + self.timer = self.timer + 1 + + local pos = self.object:getpos() + + local n = minetest.env:get_node(pos).name + + if self.timer > 100 or minetest.is_protected(pos, "") or ((n~="air") and (n~="fire:basic_flame")) then + self.object:remove() + end + + minetest.env:set_node(pos, {name="fire:basic_flame"}) + if math.random(1,3)==1 then + dx = math.random(-1,1) + dy = math.random(-1,1) + dz = math.random(-1,1) + local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + minetest.env:set_node(p, {name="fire:basic_flame"}) + end + + end, }) nssm:register_arrow("nssm:super_gas", { @@ -239,23 +205,26 @@ nssm:register_arrow("nssm:super_gas", { -- direct hit hit_player = function(self, player) local p = player:getpos() - nssm:puzzetton_explosion(p) - end, - - hit_mob = function(self, player) + nssm:gas_explosion(p) end, hit_node = function(self, pos, node) - nssm:puzzetton_explosion(pos) + nssm:gas_explosion(pos) end }) -function nssm:puzzetton_explosion(pos) +function nssm:gas_explosion(pos) + if minetest.is_protected(pos, "") then + return + end for dx=-2,2 do for dy=-1,4 do for dz=-2,2 do local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + if minetest.is_protected(p, "") then + return + end local n = minetest.env:get_node(p).name if n== "air" then minetest.set_node(p, {name="nssm:venomous_gas"}) @@ -271,7 +240,60 @@ nssm:register_arrow("nssm:roar_of_the_dragon", { visual_size = {x = 1, y = 1}, textures = {"transparent.png"}, velocity = 10, - remover = true, + + on_step = function(self, dtime) + + self.timer = self.timer + 1 + + local pos = self.object:getpos() + + local n = minetest.env:get_node(pos).name + + if self.timer > 75 or minetest.is_protected(pos, "") then + self.object:remove() + end + + minetest.env:set_node(pos, {name="air"}) + if math.random(1,3)==1 then + dx = math.random(-1,1) + dy = math.random(-1,1) + dz = math.random(-1,1) + local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + minetest.env:set_node(p, {name="air"}) + end + + if (self.hit_player or self.hit_mob) + -- clear mob entity before arrow becomes active + and self.timer > (10 - (self.velocity / 2)) then + + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do + + if self.hit_player + and player:is_player() then + + self.hit_player(self, player) + self.object:remove() ; -- print ("hit player") + return + end + + if self.hit_mob + and player:get_luaentity() + and player:get_luaentity().name ~= self.object:get_luaentity().name + and player:get_luaentity().name ~= "__builtin:item" + and player:get_luaentity().name ~= "gauges:hp_bar" + and player:get_luaentity().name ~= "signs:text" + and player:get_luaentity().name ~= "itemframes:item" then + + self.hit_mob(self, player) + + self.object:remove() ; -- print ("hit mob") + + return + end + end + end + end, + -- direct hit hit_player = function(self, player) player:punch(self.object, 1.0, {