Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

How to implement FindPartOnRayWithIgnoreList into this bot script?

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.

1 answer

The FindPartOnRayWithIgnoreList function is deprecated. Use workspace:Raycast() instead. More than that, the ignoreDescendantsList paramater takes a table.

4 comments

0

Hello! I have tried that method, the bot moves towards the player but it does not ignore that and it will go another way which is not the fastest path? If you want you can try to implement it and see.

0

I'll try it.

0

Which filterType do I use to ignore parts? Whitelist or blacklist?

0

I have tried both filter types and have tried to add them but the ai won't ignore and go the other way.

This discussion is preserved as it was. New answers, comments, and votes are closed.