So I have this script that gets the nearest target but it doesn’t seem to get the nearest target. Am I doing something wrong here?
local npcs = workspace:WaitForChild("Npcs")
local currentTarget = nil
local rayCaycastParams = RaycastParams.new()
rayCaycastParams.FilterDescendantsInstances = {npcs}
rayCaycastParams.FilterType = Enum.RaycastFilterType.Whitelist
rayCaycastParams.IgnoreWater = true
local function castRay()
local nearestDistance = math.huge
for i,v in ipairs(npcs:GetChildren()) do
if v.PrimaryPart ~= nil then
local rayOrigin = character.PrimaryPart.Position
local rayDestination = v.PrimaryPart.Position
local rayDirection = (rayDestination - rayOrigin)
local raycastResult = workspace:Raycast(rayOrigin, rayDirection, rayCaycastParams)
local human = v:FindFirstChildWhichIsA("Humanoid")
if raycastResult and human and human.Health > 0 then
local distance = math.floor(raycastResult.Distance)
if distance < nearestDistance and currentTarget == nil then
currentTarget = v
nearestDistance = distance
return true, raycastResult.Position, distance
end
end
end
end
currentTarget = nil
return false, nil, nil
end
local function findTarget()
local checkRay, position, distance = castRay()
if checkRay == true and currentTarget ~= nil then
-- stuff
end
end
You should probably read what raycast is because it is essentially a straight line going in the direction you choose. You should use magnitude instead to get objects within a radius.
local MaxRadius = 10 -- Studs
local Position1 = Character.HumanoidRootPart.Position
local Position2 = NPC.HumanoidRootPart.Position
if (Position1 - Position2).Magnitude <= MaxRadius then
print("NPC Is In Radius")
end
local rayOrigin = character.PrimaryPart.Position
local rayDestination = v.PrimaryPart.Position
local rayDirection = (rayDestination - rayOrigin)
local raycastResult = workspace:Raycast(rayOrigin, rayDirection, rayCaycastParams)
local npcs = workspace:WaitForChild("Npcs")
local currentTarget = nil
local rayCaycastParams = RaycastParams.new()
rayCaycastParams.FilterDescendantsInstances = {npcs}
rayCaycastParams.FilterType = Enum.RaycastFilterType.Whitelist
rayCaycastParams.IgnoreWater = true
local function castRay()
local nearestDistance = math.huge
for i,v in ipairs(npcs:GetChildren()) do
local human = v:FindFirstChildWhichIsA("Humanoid")
if v.PrimaryPart ~= nil and human and human.Health > 0 then
local rayOrigin = character.PrimaryPart.Position
local rayDestination = v.PrimaryPart.Position
local rayDirection = (rayDestination - rayOrigin)
local raycastResult = workspace:Raycast(rayOrigin, rayDirection, rayCaycastParams)
if raycastResult then
local distance = math.floor(raycastResult.Distance)
if distance < nearestDistance and currentTarget == nil then
currentTarget = v
nearestDistance = distance
return true, raycastResult.Position, distance
end
end
else
currentTarget = nil
end
end
currentTarget = nil
return false, nil, nil
end
local function findTarget()
local checkRay, position, distance = castRay()
if checkRay == true and currentTarget ~= nil then
-- stuff
end
end