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

My NPC Keeps Stuttering When Getting Close To Me...Any help?

Asked by 2 years ago

I'm trying to make a game, the AI enemy is programmed to go to a random part position in a folder in the workspace and attack a player once they are enough distance away, but when the enemy gets close to my player, the AI stutters, basically stopping for a bit, then starting, then stopping, rinse and repeat. Any help? Here's the script..

local reaper = script.Parent
local humanoid = reaper.Humanoid
reaper.PrimaryPart:SetNetworkOwner(nil)
local PathfindingService = game:GetService("PathfindingService")

local function findTarget()
    local players = game.Players:GetPlayers()
    local maxDistance = 40
    local nearestTarget

    for index, player in pairs(players) do
        if player.Character then
            local target = player.Character
            local distance = (reaper.HumanoidRootPart.Position - target.HumanoidRootPart.Position).Magnitude

            if distance < maxDistance then
                nearestTarget = target
                maxDistance = distance
            end
        end
    end

    return nearestTarget
end

local function getPath(destination)
    local pathParams = {
        ["AgentHeight"] = 5.45,
        ["AgentRadius"] = 3.757,
        ["AgentCanJump"] = false
    }
    local path = PathfindingService:CreatePath(pathParams)

    path:ComputeAsync(reaper.HumanoidRootPart.Position, destination.Position)
    return path
end

local function attack(target)
    local distance = (reaper.HumanoidRootPart.Position - target.HumanoidRootPart.Position).Magnitude

    if distance > 1 then
        humanoid:MoveTo(target.HumanoidRootPart.Position)
    else
        target.Humanoid.Health = 0
    end
end

local function walkTo(destination)
    local path = getPath(destination)

    for index, waypoint in pairs(path:GetWaypoints()) do
        local target = findTarget()
        if target then
            print("Attacking ", target.Name)
            attack(target)
            break
        else
            print("Moving to ", waypoint.Position)
            humanoid:MoveTo(waypoint.Position)
            humanoid.MoveToFinished:Wait()
        end
    end
end

local function patrol()
    local waypoints = workspace.waypoints:GetChildren()
    local randomNum = math.random (1, #waypoints)
    walkTo(waypoints[randomNum])
end
while wait() do
    patrol()
    wait()
end

Answer this question