For the past few days I've been working on a script that is currently really buggy and inefficient. There are a few things that I can't figure out on my own, but first and foremost, I'm wondering how I can always ensure that my NPCs will sit down when they go to a chair. For example, many of the seats are included in chair models that are contained within tables. So when attempting to reach a chair, an NPC will jump over other chairs. I believe this might be part of the problem - they jump over a chair and attempt to move to the checkpoint, but because of how ROBLOX's chairs work, they just stand on it, and because of this, they never reach the proper checkpoint. Sorry for the long post, hope someone can help!

Here's my code:

npcs = game.Workspace.ActiveNPCs:GetChildren()
benchSeats = {}
benches = game.Workspace.Benches:GetChildren()
tableSeats = {}
tables = game.Workspace.Tables:GetChildren()

for _, bench in pairs(benches) do
	benchParts = bench:GetChildren()
	for _, benchPart in pairs(benchParts) do
		if benchPart:IsA("Seat") then
			table.insert(benchSeats, benchPart)
		end
	end
end

for _, tble in pairs(tables) do
	tbleParts = tble:GetChildren()
	for _, chair in pairs(tbleParts) do
		if chair.Name == "Model1" then
			seat = chair.Seat
			table.insert(tableSeats, seat)
		end
	end
end

print(#benchSeats)
print(#tableSeats)


for _, npc in pairs(npcs) do
	benchOrTable = math.random(1, 100)
	if benchOrTable >=50 then
		chk = math.random(1, #tableSeats)
		checkpoint = tableSeats[chk]
		checkpointPos = checkpoint.Position
		print(checkpoint)
		tableSeats[chk] = nil
	else
		chk = math.random(1, #benchSeats)
		checkpoint = benchSeats[chk]
		checkpointPos = checkpoint.Position
		print(checkpointPos)
		benchSeats[chk] = nil
	end
	path = game:GetService("PathfindingService"):ComputeRawPathAsync(npc.Torso.Position, checkpointPos, 200)
	points = path:GetPointCoordinates()
	print(path)
	reachedGoal = false
	if path.Status == Enum.PathStatus.Success then
		for _, point in pairs(points) do
			npc.Humanoid:MoveTo(point)
			repeat
				distance = (point - npc.Torso.Position).magnitude
				if checkpoint.Occupant ~= nil then
					reachedGoal = true
				end
				if npc.Humanoid.Sit == true and reachedGoal == false then
					npc.Humanoid.Jump = true
				end
				if point.Y >= npc.Torso.Position.Y + 1.5 and reachedGoal == false then
					npc.Humanoid.Jump = true
				end
				ray = Ray.new(npc.Torso.Position, npc.Torso.CFrame.lookVector*2)
				hit, position = game.Workspace:FindPartOnRay(ray, npc)
				distance1 = (position - npc.Torso.Position).magnitude
				if hit ~= nil then
					npc.Humanoid.Jump = true
				end
				wait()
			until distance < 3 and reachedGoal == false or reachedGoal == true
			wait()
		end
	wait()
	end
	wait()
end
print("Success!")