Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How can I ensure that my NPCs will always sit when they go to a chair in this script?

Asked by
Klamman 220 Moderation Voter
8 years ago

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!")

Answer this question