local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs local mob_class = mcl_mobs.mob_class -- check line of sight (BrunoMine) function mob_class:line_of_sight(pos1, pos2, stepsize) stepsize = stepsize or 1 local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) -- normal walking and flying mobs can see you through air if s == true then return true end -- New pos1 to be analyzed local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) -- Checks the return if r == true then return true end -- Nodename found local nn = minetest.get_node(pos).name -- Target Distance (td) to travel local td = vector.distance(pos1, pos2) -- Actual Distance (ad) traveled local ad = 0 -- It continues to advance in the line of sight in search of a real -- obstruction which counts as 'normal' nodebox. while minetest.registered_nodes[nn] and minetest.registered_nodes[nn].walkable == false do -- Check if you can still move forward if td < ad + stepsize then return true -- Reached the target end -- Moves the analyzed pos local d = vector.distance(pos1, pos2) npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z -- NaN checks if d == 0 or npos1.x ~= npos1.x or npos1.y ~= npos1.y or npos1.z ~= npos1.z then return false end ad = ad + stepsize -- scan again r, pos = minetest.line_of_sight(npos1, pos2, stepsize) if r == true then return true end -- New Nodename found nn = minetest.get_node(pos).name end return false end