Hello there, scripters! I'm having a problem with implementing FindPartOnRayWithIgnoreList into my pathfinding AI. When ever I try to do it in the script it throws an error: Unable to cast value to Objects. When I put it back to FindPartOnRay in the script, it is fully working again, but there is no ignore list for the AI. Here's the code
local maxDistance = 5000 local canWander = true local WanderX, WanderZ = 20, 20 function getHumanoid(model) for _, v in pairs(model:GetChildren()) do if v:IsA'Humanoid' then return v end end end local ai = script.Parent local human = getHumanoid(ai) local hroot = ai.HumanoidRootPart local zspeed = hroot.Velocity.magnitude local pfs = game:GetService("PathfindingService") function GetPlayerNames() local players = game:GetService('Players'):GetChildren() local name = nil for _, v in pairs(players) do if v:IsA'Player' then name = tostring(v.Name) end end return name end function GetPlayersBodyParts(t) local torso = t if torso then local figure = torso.Parent for _, v in pairs(figure:GetChildren()) do if v:IsA'Part' then return v.Name end end else return "HumanoidRootPart" end end function GetTorso(part) local chars = game.Workspace:GetChildren() local torso = nil for _, v in pairs(chars) do if v:IsA'Model' and v ~= script.Parent and v.Name == GetPlayerNames() then local charRoot = v:FindFirstChild'HumanoidRootPart' if (charRoot.Position - part).magnitude < maxDistance then torso = charRoot end end end return torso end -- no touchy local path local waypoint local oldpoints local isWandering = 0 if canWander then spawn(function() while isWandering == 0 do isWandering = 1 local desgx, desgz = hroot.Position.x + math.random(-WanderX, WanderX), hroot.Position.z + math.random(-WanderZ, WanderZ) human:MoveTo(Vector3.new(desgx, 0, desgz)) wait(math.random(4, 6)) isWandering = 0 end end) end while wait() do local enemytorso = GetTorso(hroot.Position) if enemytorso ~= nil then -- if player detected isWandering = 1 local function checkw(t) local ci = 3 if ci > #t then ci = 3 end if t[ci] == nil and ci < #t then repeat ci = ci + 1 wait() until t[ci] ~= nil return Vector3.new(1, 0, 0) + t[ci] else ci = 3 return t[ci] end end path = pfs:CreatePath() path:ComputeAsync(hroot.Position, enemytorso.Position) waypoint = path:GetWaypoints() oldpoints = waypoint local connection; local direct = Vector3.FromNormalId(Enum.NormalId.Front) local ncf = hroot.CFrame * CFrame.new(direct) direct = ncf.p.unit local rootr = Ray.new(hroot.Position, enemytorso.Position) local phit, ppos = game.Workspace:FindPartOnRayWithIgnoreList(rootr, ai) if path and waypoint or checkw(waypoint) then if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then human:MoveTo( checkw(waypoint).Position ) human.Jump = false end if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Jump then wait(2) human.Jump = true wait(0.5) human:MoveTo( checkw(waypoint).Position ) else human.Jump = false end else for i = 3, #oldpoints do human:MoveTo( oldpoints[i].Position ) end end elseif enemytorso == nil and canWander then -- if player not detected isWandering = 0 path = nil waypoint = nil human.MoveToFinished:Wait() end end print("_char is chosen, subject is pathfinding...")
I'm pretty sure this one line breaks the whole script,
local phit, ppos = game.Workspace:FindPartOnRayWithIgnoreList(rootr, ai)
Any ideas? What is going wrong?
I've tried the workspace:Raycast but it dosen't work.
The FindPartOnRayWithIgnoreList
function is deprecated. Use workspace:Raycast()
instead. More than that, the ignoreDescendantsList
paramater takes a table.