--Parameters used by some weapons local default_dir = {x = 1, y = 1, z = 1} --Function used to shoot: local function weapons_shot(itemstack, placer, pointed_thing, velocity, name) local dir = placer:get_look_dir(); local playerpos = placer:get_pos(); local obj = minetest.add_entity({ x = playerpos.x + dir.x, y = playerpos.y + 2 + dir.y, z = playerpos.z + dir.z }, "nssm:" .. name) local vec = {x = dir.x * velocity, y = dir.y * velocity, z = dir.z * velocity} obj:set_velocity(vec) return itemstack end local function hit(pos, self) local node = node_ok(pos).name self.hit_node(self, pos, node) self.object:remove() return end local function activate_balls(pos) local radius = 50 local objects = minetest.get_objects_inside_radius(pos, radius) for _,obj in ipairs(objects) do if obj:get_luaentity() and obj:get_luaentity().name == "nssm:hellzone_grenade" then obj:get_luaentity().move = 1 end end end local function search_on_step2( self, dtime, --used to count time max_time, --after this amount of time the entity is removec radius, --radius in which look for entities to follow vel) --velocity of the projectile local pos = self.object:get_pos() --Disappear after a certain time if self.life_time == 0 then self.life_time = os.time() end if os.time() - self.life_time > max_time then self.object:remove() return end --Look for an entity to follow local objects = minetest.get_objects_inside_radius(pos, radius) local min_dist = 100 local obj_min = nil local obj_p = nil local vec_min = nil for _,obj in ipairs(objects) do if (obj:is_player()) then elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item" and obj:get_luaentity().name ~= self.object:get_luaentity().name) then obj_p = obj:get_pos() 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 if (dist < min_dist) then min_dist = dist obj_min = obj vec_min = vec end end end --Found an entity to follow: if obj_min ~= nil then local new_vel = {x = 0, y = 0, z = 0} local dir = 0 local max_diff = 0 if (max_diff max_time then self.object:remove() return end --Look for an entity to follow local objects = minetest.get_objects_inside_radius(pos, radius) local min_dist = 100 local obj_min = nil local obj_p = nil local vec_min = nil for _,obj in ipairs(objects) do if (obj:is_player()) then elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item" and obj:get_luaentity().name ~= self.object:get_luaentity().name) then obj_p = obj:get_pos() 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 if dist < min_dist then min_dist = dist obj_min = obj vec_min = vec end end end --Found an entity to follow: if obj_min ~= nil then local new_vel = {x = 0, y = 0, z = 0} local dir = 0 local max_diff = 0 if (max_diff max_time then local node = node_ok(pos).name self.hit_node(self, pos, node) self.object:remove() return end self.timer = self.timer + dtime --minetest.chat_send_all("Timer: "..self.timer) --while going around it damages entities local objects = minetest.get_objects_inside_radius(pos, 2) if self.timer > 0.1 then self.timer = 0 for _,obj in ipairs(objects) do if obj:get_luaentity() then if obj and obj:get_luaentity() and obj:get_luaentity().name ~= self.object:get_luaentity().name and obj:get_luaentity().name ~= "__builtin:item" then if obj:is_player() then obj:set_hp(obj:get_hp()-damage) elseif obj:get_luaentity().health then obj:get_luaentity().health = obj:get_luaentity().health - damage --minetest.chat_send_all("Danneggiato: "..obj:get_luaentity_name().." Vita: "..obj:get_luaentity().health) -- check_for_death(obj:get_luaentity()) end end end end end local n = minetest.get_node(pos).name if n == not_transparent or minetest.get_item_group(n, not_transparent) == 1 then local node = node_ok(pos).name self.hit_node(self, pos, node) self.object:remove() return else local vec = self.object:get_velocity() local c = vel / 10 --calculate how many blocks around need to be removed local max = 0 local posmax = 0 if max 60 then self.object:remove() return end --Look for an entity to follow local objects = minetest.get_objects_inside_radius(pos, 20) local min_dist = 100 local obj_min = nil local obj_p = nil local vec_min = nil for _,obj in ipairs(objects) do if (obj:is_player()) then elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item" and obj:get_luaentity().name ~= self.object:get_luaentity().name) then obj_p = obj:get_pos() 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 if (dist 60 then self.object:remove() return end if self.custom_timer == 0 then self.custom_timer = os.time() end if last_pos == nil or (last_pos ~= nil and last_pos ~= pos) then minetest.set_node(pos, {name="nssm:invisible_light"}) if last_pos ~= nil then minetest.set_node(last_pos, {name="air"}) end last_pos = pos end --Look for an entity to follow local objects = minetest.get_objects_inside_radius(pos, 20) local min_dist = 100 local obj_min = nil local obj_p = nil local vec_min = nil for _,obj in ipairs(objects) do if (obj:is_player()) then elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item" and obj:get_luaentity().name ~= self.object:get_luaentity().name) then obj_p = obj:get_pos() 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 if (dist