Updated functions and added protection controls
This commit is contained in:
parent
bc14b62ce1
commit
67e43d0b08
194
darts.lua
194
darts.lua
@ -6,11 +6,13 @@ nssm:register_arrow("nssm:duck_father", {
|
|||||||
velocity = 8,
|
velocity = 8,
|
||||||
-- direct hit
|
-- direct hit
|
||||||
hit_player = function(self, player)
|
hit_player = function(self, player)
|
||||||
nssm:duck_explosion_direct(pos, player)
|
local pos = self.object:getpos()
|
||||||
|
nssm:duck_explosion(pos)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
hit_mob = function(self, player)
|
hit_mob = function(self, player)
|
||||||
nssm:duck_explosion_direct(pos, player)
|
local pos = self.object:getpos()
|
||||||
|
nssm:duck_explosion(pos)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
hit_node = function(self, pos, node)
|
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)
|
function nssm:duck_explosion(pos)
|
||||||
pos.y = pos.y+1;
|
pos.y = pos.y+1;
|
||||||
minetest.add_particlespawner({
|
minetest.add_particlespawner({
|
||||||
@ -115,11 +73,13 @@ nssm:register_arrow("nssm:snow_arrow", {
|
|||||||
velocity =20,
|
velocity =20,
|
||||||
-- direct hit
|
-- direct hit
|
||||||
hit_player = function(self, player)
|
hit_player = function(self, player)
|
||||||
nssm:ice_explosion1(pos, player)
|
local pos = self.object:getpos()
|
||||||
|
nssm:ice_explosion(pos)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
hit_mob = function(self, player)
|
hit_mob = function(self, player)
|
||||||
nssm:ice_explosion1(pos, player)
|
local pos = self.object:getpos()
|
||||||
|
nssm:ice_explosion(pos)
|
||||||
end,
|
end,
|
||||||
hit_node = function(self, pos, node)
|
hit_node = function(self, pos, node)
|
||||||
nssm:ice_explosion(pos)
|
nssm:ice_explosion(pos)
|
||||||
@ -127,28 +87,15 @@ nssm:register_arrow("nssm:snow_arrow", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
function nssm:ice_explosion(pos)
|
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 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 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
|
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"})
|
minetest.set_node({x=i, y=j, z=k}, {name="default:ice"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
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
|
-- arrow manticore
|
||||||
nssm:register_arrow("nssm:spine", {
|
nssm:register_arrow("nssm:spine", {
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
@ -171,7 +118,6 @@ nssm:register_arrow("nssm:spine", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
-- web arrow
|
-- web arrow
|
||||||
nssm:register_arrow("nssm:webball", {
|
nssm:register_arrow("nssm:webball", {
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
@ -197,26 +143,29 @@ nssm:register_arrow("nssm:webball", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
function nssm:explosion_web(pos)
|
function nssm:explosion_web(pos)
|
||||||
|
if minetest.is_protected(pos, "") then
|
||||||
|
return
|
||||||
|
end
|
||||||
for i=pos.x-1, pos.x+1, 1 do
|
for i=pos.x-1, pos.x+1, 1 do
|
||||||
for j=pos.y-1, pos.y+1, 1 do
|
for j=pos.y-1, pos.y+1, 1 do
|
||||||
for k=pos.z-1, pos.z+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 current = minetest.get_node({x=i,y=j,z=k})
|
||||||
local ontop = minetest.get_node({x=i,y=j+1,z=k})
|
local ontop = minetest.get_node({x=i,y=j+1,z=k})
|
||||||
if (current.name ~= "air") and
|
if (current.name ~= "air") and
|
||||||
(current.name ~= "nssm:web") and
|
(current.name ~= "nssm:web") and
|
||||||
(ontop.name == "air") then
|
(ontop.name == "air") and not
|
||||||
minetest.set_node({x=i,y=j+1,z=k}, {name="nssm:web"})
|
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
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- arrow=>phoenix arrow
|
-- arrow=>phoenix arrow
|
||||||
nssm:register_arrow("nssm:phoenix_arrow", {
|
nssm:register_arrow("nssm:phoenix_arrow", {
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
phoenix_fire = true,
|
|
||||||
visual_size = {x = 1, y = 1},
|
visual_size = {x = 1, y = 1},
|
||||||
textures = {"transparent.png"},
|
textures = {"transparent.png"},
|
||||||
velocity = 8,
|
velocity = 8,
|
||||||
@ -224,11 +173,28 @@ nssm:register_arrow("nssm:phoenix_arrow", {
|
|||||||
hit_player = function(self, player)
|
hit_player = function(self, player)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
hit_mob = function(self, player)
|
on_step = function(self, dtime)
|
||||||
end,
|
|
||||||
|
|
||||||
hit_node = function(self, pos, node)
|
self.timer = self.timer + 1
|
||||||
end
|
|
||||||
|
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", {
|
nssm:register_arrow("nssm:super_gas", {
|
||||||
@ -239,23 +205,26 @@ nssm:register_arrow("nssm:super_gas", {
|
|||||||
-- direct hit
|
-- direct hit
|
||||||
hit_player = function(self, player)
|
hit_player = function(self, player)
|
||||||
local p = player:getpos()
|
local p = player:getpos()
|
||||||
nssm:puzzetton_explosion(p)
|
nssm:gas_explosion(p)
|
||||||
end,
|
|
||||||
|
|
||||||
hit_mob = function(self, player)
|
|
||||||
end,
|
end,
|
||||||
|
|
||||||
hit_node = function(self, pos, node)
|
hit_node = function(self, pos, node)
|
||||||
nssm:puzzetton_explosion(pos)
|
nssm:gas_explosion(pos)
|
||||||
end
|
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 dx=-2,2 do
|
||||||
for dy=-1,4 do
|
for dy=-1,4 do
|
||||||
for dz=-2,2 do
|
for dz=-2,2 do
|
||||||
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
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
|
local n = minetest.env:get_node(p).name
|
||||||
if n== "air" then
|
if n== "air" then
|
||||||
minetest.set_node(p, {name="nssm:venomous_gas"})
|
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},
|
visual_size = {x = 1, y = 1},
|
||||||
textures = {"transparent.png"},
|
textures = {"transparent.png"},
|
||||||
velocity = 10,
|
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
|
-- direct hit
|
||||||
hit_player = function(self, player)
|
hit_player = function(self, player)
|
||||||
player:punch(self.object, 1.0, {
|
player:punch(self.object, 1.0, {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user