123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472 |
- local function duck_explosion(pos)
- if minetest.is_protected(pos, "") then
- return
- end
- 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 = -1, 1 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
- -- arrow (duck_arrow)
- mobs:register_arrow("nssm:duck_father", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"duck_egg.png"},
- velocity = 8,
- -- direct hit
- hit_player = function(self, player)
- local pos = self.object:get_pos()
- duck_explosion(pos)
- end,
- hit_mob = function(self, player)
- local pos = self.object:get_pos()
- duck_explosion(pos)
- end,
- hit_node = function(self, pos, node)
- duck_explosion(pos)
- end,
- })
- 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
- for k = pos.z-math.random(0, 1), pos.z + math.random(0, 1), 1 do
- local p = {x = i, y = j, z = k}
- local n = minetest.get_node(p).name
- if minetest.get_item_group(n, "unbreakable") == 1
- or minetest.is_protected(p, "")
- or (n == "bones:bones" and not nssm:affectbones(self)) then
- else
- minetest.set_node({x = i, y = j, z = k}, {name = "default:ice"})
- end
- end
- end
- end
- end
- -- snow_arrow
- mobs:register_arrow("nssm:snow_arrow", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"transparent.png"},
- velocity =20,
- -- direct hit
- hit_player = function(self, player)
- local pos = self.object:get_pos()
- ice_explosion(pos)
- end,
- hit_mob = function(self, player)
- local pos = self.object:get_pos()
- ice_explosion(pos)
- end,
- hit_node = function(self, pos, node)
- ice_explosion(pos)
- end,
- })
- -- arrow manticore
- mobs:register_arrow("nssm:spine", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"manticore_spine_flying.png"},
- velocity = 10,
- -- direct hit
- hit_player = function(self, player)
- player:punch(self.object, 1.0, {
- full_punch_interval = 1.0,
- damage_groups = {fleshy = 2},
- }, nil)
- end,
- hit_mob = function(self, player)
- player:punch(self.object, 1.0, {
- full_punch_interval = 1.0,
- damage_groups = {fleshy = 2},
- }, nil)
- end,
- hit_node = function(self, pos, node)
- end
- })
- --morbat arrow
- mobs:register_arrow("nssm:morarrow", {
- visual = "sprite",
- visual_size = {x=0.5, y=0.5},
- textures = {"morarrow.png"},
- velocity= 13,
- hit_player = function(self, player)
- player:punch(self.object, 1.0, {
- full_punch_interval = 1.0,
- damage_groups = {fleshy = 3},
- }, nil)
- end,
- hit_node = function(self, pos, node)
- end
- })
- local function explosion_web(pos)
- pos.y = round(pos.y)
- 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}
- local current = minetest.get_node(p).name
- local ontop = minetest.get_node(k).name
- if (current ~= "air") and
- (current ~= "nssm:web") and
- (ontop == "air") and not
- minetest.is_protected(p,"") and not
- minetest.is_protected(k,"") then
- minetest.set_node(k, {name="nssm:web"})
- end
- end
- end
- end
- end
- -- web arrow
- mobs:register_arrow("nssm:webball", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"web_ball.png"},
- velocity = 8,
- -- direct hit
- hit_player = function(self, player)
- local p = player:get_pos()
- explosion_web(p)
- end,
- hit_mob = function(self, player)
- player:punch(self.object, 1.0, {
- full_punch_interval = 1.0,
- damage_groups = {fleshy = 1},
- }, nil)
- end,
- hit_node = function(self, pos, node)
- explosion_web(pos)
- end
- })
- function explosion_thickweb(pos)
- pos.y = round(pos.y)
- if minetest.is_protected(pos, "") then
- return
- end
- for i = pos.x + 0, pos.x + 0, 1 do
- for j = pos.y - 2, pos.y, 1 do
- for k = pos.z + 0, pos.z + 0, 1 do
- local p = {x = i, y = j, z = k}
- local k = {x = i, y = j + 1, z = k}
- local current = minetest.get_node(p).name
- local ontop = minetest.get_node(k).name
- if (current ~= "air") and
- (current ~= "nssm:thick_web") and
- (ontop == "air") and not
- minetest.is_protected(p,"") and not
- minetest.is_protected(k,"") then
- minetest.set_node(k, {name="nssm:thick_web"})
- end
- end
- end
- end
- end
- -- thick_web arrow
- mobs:register_arrow("nssm:thickwebball", {
- visual = "sprite",
- visual_size = {x = 2, y = 2},
- textures = {"thick_web_ball.png"},
- velocity = 8,
- -- direct hit
- hit_player = function(self, player)
- local p = player:get_pos()
- explosion_thickweb(p)
- end,
- hit_mob = function(self, player)
- player:punch(self.object, 1.0, {
- full_punch_interval = 1.0,
- damage_groups = {fleshy = 6},
- }, nil)
- end,
- hit_node = function(self, pos, node)
- explosion_thickweb(pos)
- end
- })
- -- arrow=>phoenix arrow
- mobs:register_arrow("nssm:phoenix_arrow", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"transparent.png"},
- velocity = 8,
- -- direct hit
- hit_player = function(self, player)
- end,
- on_step = function(self, dtime)
- local pos = self.object:get_pos()
- 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
- if os.time() - self.timer > 5 or minetest.is_protected(pos, "")
- or ((n ~= "air") and (n ~= "nssm:phoenix_fire")) then
- self.object:remove()
- end
- if math.random(1, 2) == 2 then
- minetest.set_node(pos, {name = "nssm:phoenix_fire"})
- end
- if math.random(1, 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)
- }
- local n = minetest.get_node(p).name
- if n == "air" then
- minetest.set_node(p, {name = "nssm:phoenix_fire"})
- end
- end
- end,
- })
- function 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.get_node(p).name
- if n == "air" then
- minetest.set_node(p, {name = "nssm:venomous_gas"})
- end
- end
- end
- end
- end
- mobs:register_arrow("nssm:super_gas", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"tnt_smoke.png^[colorize:green:170"},
- velocity = 8,
- -- direct hit
- hit_player = function(self, player)
- local p = player:get_pos()
- gas_explosion(p)
- end,
- hit_node = function(self, pos, node)
- gas_explosion(pos)
- end
- })
- 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)
- local pos = self.object:get_pos()
- 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)
- for _,obj in ipairs(objects) do
- local name = obj:get_entity_name()
- if 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
- if (not obj:is_player())
- and name ~= self.object:get_luaentity().name then
- obj:remove()
- end
- end
- end
- end
- minetest.set_node(pos, {name = "air"})
- if math.random(1, 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"})
- end
- end
- end
- })
- mobs:register_arrow("nssm:lava_arrow", {
- visual = "sprite",
- visual_size = {x = 1, y = 1},
- textures = {"transparent.png"},
- velocity = 10,
- -- direct hit
- hit_player = function(self, player)
- local pos = self.object:get_pos()
- 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}
- local n = minetest.get_node(p).name
- if n ~= "default:lava_flowing"
- and not minetest.is_protected(p, "") then
- minetest.set_node(p, {name = "default:lava_flowing"})
- end
- end
- end
- end
- end,
- hit_node = function(self, pos, node)
- end
- })
|