minetest-mod-nssm/darts.lua

462 lines
8.7 KiB
Lua
Raw Normal View History

2018-08-09 03:36:34 -07:00
local function duck_explosion(pos)
2018-08-08 02:56:14 -07:00
if minetest.is_protected(pos, "") then
return
end
pos.y = pos.y + 1
2018-08-08 02:56:14 -07:00
minetest.add_particlespawner({
amount = 10,
time = 0.2,
2022-09-27 11:26:58 -07:00
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},
2018-08-08 02:56:14 -07:00
minexptime = 1,
maxexptime = 3,
minsize = 4,
maxsize = 6,
collisiondetection = false,
vertical = false,
2022-09-27 11:26:58 -07:00
texture = "duck_egg_fragments.png"
2018-08-08 02:56:14 -07:00
})
minetest.after(0.4, function()
for dx = -1, 1 do
pos = {x = pos.x + dx, y = pos.y, z = pos.z + dx}
2018-08-08 02:56:14 -07:00
minetest.add_particlespawner({
amount = 100,
time = 0.2,
2022-09-27 11:26:58 -07:00
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},
2018-08-08 02:56:14 -07:00
minexptime = 1,
maxexptime = 3,
minsize = 2,
maxsize = 4,
collisiondetection = false,
vertical = false,
2022-09-27 11:26:58 -07:00
texture = "tnt_smoke.png"
2018-08-08 02:56:14 -07:00
})
2018-08-08 02:56:14 -07:00
minetest.add_entity(pos, "nssm:duck")
end
end)
end
2022-09-27 11:26:58 -07:00
2018-08-09 03:36:34 -07:00
-- arrow (duck_arrow)
mobs:register_arrow("nssm:duck_father", {
2018-08-08 02:56:14 -07:00
visual = "sprite",
visual_size = {x = 1, y = 1},
2018-08-09 03:36:34 -07:00
textures = {"duck_egg.png"},
velocity = 8,
2018-08-08 02:56:14 -07:00
-- direct hit
hit_player = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 04:20:07 -07:00
local pos = self.object:get_pos()
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
duck_explosion(pos)
2018-08-08 02:56:14 -07:00
end,
hit_mob = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 04:20:07 -07:00
local pos = self.object:get_pos()
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
duck_explosion(pos)
2018-08-08 02:56:14 -07:00
end,
2018-08-09 03:36:34 -07:00
2018-08-08 02:56:14 -07:00
hit_node = function(self, pos, node)
2018-08-09 03:36:34 -07:00
duck_explosion(pos)
2022-09-27 11:26:58 -07:00
end
2018-08-08 02:56:14 -07:00
})
2018-08-09 03:36:34 -07:00
local function ice_explosion(pos)
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
2022-09-27 11:26:58 -07:00
for k = pos.z - math.random(0, 1), pos.z + math.random(0, 1), 1 do
local p = {x = i, y = j, z = k}
2018-08-08 02:56:14 -07:00
local n = minetest.get_node(p).name
2018-08-09 03:36:34 -07:00
if minetest.get_item_group(n, "unbreakable") == 1
or minetest.is_protected(p, "")
or (n == "bones:bones" and not nssm:affectbones(self)) then
2018-08-08 02:56:14 -07:00
else
minetest.set_node({x = i, y = j, z = k}, {name = "default:ice"})
2018-08-08 02:56:14 -07:00
end
end
end
end
end
2022-09-27 11:26:58 -07:00
2018-08-09 03:36:34 -07:00
-- snow_arrow
mobs:register_arrow("nssm:snow_arrow", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"transparent.png"},
2022-09-28 11:01:53 -07:00
velocity = 20,
2018-08-09 03:36:34 -07:00
-- direct hit
hit_player = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
local pos = self.object:get_pos()
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
ice_explosion(pos)
end,
hit_mob = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
local pos = self.object:get_pos()
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
ice_explosion(pos)
end,
2018-08-09 03:36:34 -07:00
hit_node = function(self, pos, node)
ice_explosion(pos)
2022-09-27 11:26:58 -07:00
end
2018-08-09 03:36:34 -07:00
})
2018-08-08 02:56:14 -07:00
-- arrow manticore
mobs:register_arrow("nssm:spine", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"manticore_spine_flying.png"},
velocity = 10,
2018-08-08 02:56:14 -07:00
-- direct hit
hit_player = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 02:56:14 -07:00
player:punch(self.object, 1.0, {
full_punch_interval = 1.0,
2022-09-27 11:26:58 -07:00
damage_groups = {fleshy = 2}
2018-08-08 02:56:14 -07:00
}, nil)
end,
hit_mob = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 02:56:14 -07:00
player:punch(self.object, 1.0, {
full_punch_interval = 1.0,
2022-09-27 11:26:58 -07:00
damage_groups = {fleshy = 2}
2018-08-08 02:56:14 -07:00
}, nil)
end,
hit_node = function(self, pos, node)
end
2018-08-08 02:56:14 -07:00
})
2018-08-09 03:36:34 -07:00
2022-09-28 11:01:53 -07:00
-- morbat arrow
2018-08-08 02:56:14 -07:00
mobs:register_arrow("nssm:morarrow", {
visual = "sprite",
2022-09-27 11:26:58 -07:00
visual_size = {x = 0.5, y = 0.5},
2018-08-08 02:56:14 -07:00
textures = {"morarrow.png"},
velocity= 13,
hit_player = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 02:56:14 -07:00
player:punch(self.object, 1.0, {
full_punch_interval = 1.0,
2022-09-27 11:26:58 -07:00
damage_groups = {fleshy = 3}
2018-08-08 02:56:14 -07:00
}, nil)
end,
hit_node = function(self, pos, node)
end
2018-08-08 02:56:14 -07:00
})
2018-08-09 03:36:34 -07:00
local function explosion_web(pos, webnode)
2018-08-09 03:36:34 -07:00
pos.y = round(pos.y)
2018-08-09 03:36:34 -07:00
if minetest.is_protected(pos, "") then
return
end
for i = pos.x - 1, pos.x + 1, 1 do
for j = pos.y - 3, pos.y, 1 do
for k = pos.z - 1, pos.z + 1, 1 do
local p = {x = i, y = j, z = k}
local k = {x = i, y = j + 1, z = k}
2018-08-09 03:36:34 -07:00
local current = minetest.get_node(p).name
local ontop = minetest.get_node(k).name
2022-09-28 11:01:53 -07:00
if current ~= "air"
and current ~= webnode
2022-09-28 11:01:53 -07:00
and ontop == "air"
and not minetest.is_protected(p, "")
and not minetest.is_protected(k, "") then
minetest.set_node(k, {name = webnode})
2018-08-09 03:36:34 -07:00
end
end
end
end
end
2018-08-08 02:56:14 -07:00
-- web arrow
mobs:register_arrow("nssm:webball", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"web_ball.png"},
velocity = 8,
2018-08-08 02:56:14 -07:00
-- direct hit
hit_player = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 04:20:07 -07:00
local p = player:get_pos()
2022-09-28 11:01:53 -07:00
explosion_web(p, "nssm:web")
2018-08-08 02:56:14 -07:00
end,
hit_mob = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-08 02:56:14 -07:00
player:punch(self.object, 1.0, {
full_punch_interval = 1.0,
2022-09-27 11:26:58 -07:00
damage_groups = {fleshy = 1}
2018-08-08 02:56:14 -07:00
}, nil)
end,
hit_node = function(self, pos, node)
explosion_web(pos, "nssm:web")
2018-08-08 02:56:14 -07:00
end
})
2018-08-09 03:36:34 -07:00
2018-08-08 02:56:14 -07:00
-- thick_web arrow
mobs:register_arrow("nssm:thickwebball", {
visual = "sprite",
visual_size = {x = 2, y = 2},
textures = {"thick_web_ball.png"},
velocity = 8,
2018-08-08 02:56:14 -07:00
-- direct hit
hit_player = function(self, player)
2018-08-08 04:20:07 -07:00
local p = player:get_pos()
explosion_web(p, "nssm:thick_web")
2018-08-08 02:56:14 -07:00
end,
hit_mob = function(self, player)
player:punch(self.object, 1.0, {
full_punch_interval = 1.0,
2022-09-27 11:26:58 -07:00
damage_groups = {fleshy = 6}
2018-08-08 02:56:14 -07:00
}, nil)
end,
hit_node = function(self, pos, node)
explosion_web(pos, "nssm:thick_web")
2018-08-08 02:56:14 -07:00
end
})
-- arrow=>phoenix arrow
mobs:register_arrow("nssm:phoenix_arrow", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"transparent.png"},
velocity = 8,
2018-08-08 02:56:14 -07:00
-- direct hit
hit_player = function(self, player)
end,
on_step = function(self, dtime)
2018-08-08 04:20:07 -07:00
local pos = self.object:get_pos()
2018-08-08 02:56:14 -07:00
if minetest.is_protected(pos, "") then
return
end
local n = minetest.get_node(pos).name
if self.timer == 0 then
self.timer = os.time()
end
2018-08-09 03:36:34 -07:00
if os.time() - self.timer > 5 or minetest.is_protected(pos, "")
or ((n ~= "air") and (n ~= "nssm:phoenix_fire")) then
2018-08-08 02:56:14 -07:00
self.object:remove()
end
2022-09-27 11:26:58 -07:00
if math.random(2) == 2 then
minetest.set_node(pos, {name = "nssm:phoenix_fire"})
2018-08-08 02:56:14 -07:00
end
if math.random(6) == 1 then
local p = {
x = pos.x + math.random(-1, 1),
y = pos.y + math.random(-1, 1),
z = pos.z + math.random(-1, 1)
}
2018-08-08 02:56:14 -07:00
local n = minetest.get_node(p).name
if n == "air" then
minetest.set_node(p, {name = "nssm:phoenix_fire"})
2018-08-08 02:56:14 -07:00
end
end
2022-09-27 11:26:58 -07:00
end
2018-08-08 02:56:14 -07:00
})
2023-06-13 04:50:58 -07:00
local function gas_explosion(pos)
2018-08-08 02:56:14 -07:00
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}
2018-08-08 02:56:14 -07:00
if minetest.is_protected(p, "") then
return
end
2018-08-08 02:56:14 -07:00
local n = minetest.get_node(p).name
if n == "air" then
minetest.set_node(p, {name = "nssm:venomous_gas"})
2018-08-08 02:56:14 -07:00
end
end
end
end
end
2022-09-27 11:26:58 -07:00
2018-08-09 03:36:34 -07:00
mobs:register_arrow("nssm:super_gas", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"tnt_smoke.png^[colorize:green:170"},
2018-08-09 03:36:34 -07:00
velocity = 8,
2018-08-09 03:36:34 -07:00
-- direct hit
hit_player = function(self, player)
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
local p = player:get_pos()
2022-09-28 11:01:53 -07:00
2018-08-09 03:36:34 -07:00
gas_explosion(p)
end,
hit_node = function(self, pos, node)
gas_explosion(pos)
end
})
2018-08-08 02:56:14 -07:00
mobs:register_arrow("nssm:roar_of_the_dragon", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"transparent.png"},
velocity = 10,
on_step = function(self, dtime)
2018-08-08 04:20:07 -07:00
local pos = self.object:get_pos()
2018-08-08 02:56:14 -07:00
local n = minetest.get_node(pos).name
if self.timer == 0 then
self.timer = os.time()
end
if os.time() - self.timer > 8 or minetest.is_protected(pos, "") then
self.object:remove()
end
local objects = minetest.get_objects_inside_radius(pos, 1)
2018-08-09 03:36:34 -07:00
for _,obj in ipairs(objects) do
2023-06-13 04:50:58 -07:00
local ent = obj and obj:get_luaentity()
local name = ent and ent.name
2023-06-13 04:50:58 -07:00
if name and name ~= "nssm:roar_of_the_dragon"
and name ~= "nssm:mese_dragon" then
obj:set_hp(obj:get_hp() - 0.05)
if obj:get_hp() <= 0 then
2018-08-09 03:36:34 -07:00
if (not obj:is_player())
and name ~= self.object:get_luaentity().name then
obj:remove()
end
end
2018-08-08 02:56:14 -07:00
end
2018-08-09 03:36:34 -07:00
end
2018-08-08 02:56:14 -07:00
minetest.set_node(pos, {name = "air"})
2022-09-27 11:26:58 -07:00
if math.random(2) == 1 then
local p = {
x = pos.x + math.random(-1, 1),
y = pos.y + math.random(-1, 1),
z = pos.z + math.random(-1, 1)
}
if not minetest.is_protected(p, "") then
minetest.set_node(p, {name = "air"})
2018-08-08 02:56:14 -07:00
end
end
end
})
mobs:register_arrow("nssm:lava_arrow", {
visual = "sprite",
visual_size = {x = 1, y = 1},
textures = {"transparent.png"},
velocity = 10,
2018-08-08 02:56:14 -07:00
-- direct hit
hit_player = function(self, player)
2018-08-08 04:20:07 -07:00
local pos = self.object:get_pos()
2018-08-08 02:56:14 -07:00
if minetest.is_protected(pos, "") then
return
end
for dy = -1, 6, 1 do
for dx = -1, 1, 2 do
for dz = -1, 1, 2 do
local p = {x = pos.x + dx, y = pos.y + dy, z = pos.z + dz}
2018-08-08 02:56:14 -07:00
local n = minetest.get_node(p).name
if n ~= "default:lava_flowing"
2018-08-09 03:36:34 -07:00
and not minetest.is_protected(p, "") then
minetest.set_node(p, {name = "default:lava_flowing"})
2018-08-08 02:56:14 -07:00
end
end
end
end
end,
hit_node = function(self, pos, node)
end
2018-08-08 02:56:14 -07:00
})