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

NPC Stuttering When Getting Close to Player...Can't figure out why..? Please 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 function canSeeTarget(target)
    local origin = reaper.HumanoidRootPart.Position
    local direction = (target.HumanoidRootPart.Position - reaper.HumanoidRootPart.Position).unit * 40
    local ray = Ray.new(origin, direction)

    local hit, pos = workspace:FindPartOnRay(ray, reaper)


    if hit then
        if hit:IsDescendantOf(target) then
            return true
        end
    else
        return false
    end
end

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 and canSeeTarget(target) then
                nearestTarget = target
                maxDistance = distance
            end
        end
    end

    return nearestTarget
end

local function getPath(destination)
    local PathfindingService = game:GetService("PathfindingService")

    local pathParams = {
        ["AgentHeight"] = 9.5,
        ["AgentRadius"] = 4,
        ["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 > 2 then
        humanoid:MoveTo(target.HumanoidRootPart.Position)
    else
        local attackAnim = humanoid:LoadAnimation(script.Attack)
        attackAnim:Play()
        target.Humanoid.Health = 0
    end
end

local function walkTo(destination)

    local path = getPath(destination)

    if path.Status == Enum.PathStatus.Success then
        for index, waypoint in pairs(path:GetWaypoints()) do
            local target = findTarget()
            if target and target.Humanoid.Health > 0 then
                print("TARGET FOUND", target.Name)
                attack(target)
                break
            else
                print("Moving to ", waypoint.Position)
                humanoid:MoveTo(waypoint.Position)
                humanoid.MoveToFinished:Wait()
            end
        end
    else
        humanoid:MoveTo(destination.Position - (reaper.HumanoidRootPart.CFrame.LookVector * 10))
    end
end

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

while wait(0) do
    patrol()
end

The enemy is r6, is it because of the character? I have no clue...

1 answer

Log in to vote
0
Answered by
extrorobo 104
2 years ago
Edited 2 years ago

I feel this part of your code is wrong - 013

if hit then

014 if hit:IsDescendantOf(target) then 015 return true 016 end 017 else 018 return false 019 end 020 end

because you are repeating the "if hit" command twice.

I hope this helped, please friend request me on roblox if you have further questions.

Ad

Answer this question